Переход с MYSQL на PDO, динамическое построение запросов — php mysql pdo

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд
Загрузка...

Вопрос:


Пошел 6-й месяц, как я учусь делать сайты. Сейчас делаю сайт для себя и решил переписать все 100+ страниц с MYSQL на PDO (только ради плейсхолдеров). Запросы типа WHERE id=$var AND user=$var2 и т.д без проблем все переписал, но сейчас добрался до страниц, которые я писал на MYSQL и пользуясь легкостью вставки в запрос целых выражений в переменных исходящих из условных операторов, создал такой клубок, что мне кажется PDO с ним не разберется… Помогите советом! Как это все распутать и можно ли распутать…

Запрос:

$result = mysql_query("SELECT * FROM tovar ".$var1." vid='1' $var2 $var3 $var4 $var5 $var6 $var7 GROUP BY products_id ORDER BY $var8 $var9");

Где:

$var1 это

`IF что то 'JOIN table WHERE id = other_id AND значение IN('.$var из другого запроса .')' AND '$var2 из другого запроса = 'DISTINCT id''

else 
'WHERE' AND '$var4 из другого запроса = '*' AND $var3 из другого запроса = ''

И примерно такие же $var2, $var3, $var4, $var5, $var6, $var7, $var8, $var9,

Как думаете можно этот клубок распутать на PDO или проще повеситься?


Да я то могу в них разобраться, а вот PDO ругается. Разматывать надо конечно по одной ниточке. Вот к примеру как сделать это?

if ($_GET['up'] == 'one') $go_see = "AND see='1'" 

$count = $db->prepare("SELECT COUNT(*) FROM tovar WHERE vid='1' $go_see ''");

$count->execute([ ': go_see' => ??? ]);

Вариант просто вставить в запрос AND see=:плейсхолдер где ': плейсхолдер ' => 1 и убрать таким образом переменную из запроса слишком очевиден и соответственно не подходит. Переменная $go_see может быть пустой или вместо AND иметь OR

И попутно еще вопрос. Будет ли безопасным такой вариант запроса?

$go_see= 'AND see=1';

$db->query("SELECT * FROM tovar WHERE vid='1' $go_see");

Везде пишут, что если в запросе есть переменная, то он уязвим! Это относится даже к тем переменным, которые назначаются внутри скрипта без использования внешних данных?

Автор вопроса: Art_K

vp_arth

По хорошему, Вам нужно внедрить какой-никакой SqlBuilder.

Можно, конечно, строить запросы вручную:

$where = [];
$params = [];

$where[] = 'vid = ?';
$params[] = '1';

if ($_GET['up'] == 'one') {
  $where[] = 'see = ?';
  $params[] = 1;
}
if (!empty($_GET['ids'])) {
  $values = preg_split('/s*,s*/', $_GET['ids']);
  if (!empty($values)) {
    $in = str_repeat('?,', count($values)-1).'?';
    $where[] = "id in ($in)"; // Только плейсхолдеры попадают в запрос
    $params = array_merge($params, $values);
  }
}

$where = $where ? 'WHERE ' . implode(' AND ', $where) : '';
$sql = "SELECT COUNT(*) FROM tovar $where";
// SELECT COUNT(*) FROM tovar WHERE vid = ? AND see = ? AND id IN (?,?,?)

$stmt = $db->prepare($sql);
$stmt->execute($params);

Константы или значения из белого списка совершенно необязательно отделять от запроса, тем не менее — это хорошая привычка.

Переписывать запросы однозначно. Вы же сами в них не можете разобраться. Если есть проблемы с переписыванием — задавайте вопросы и приводите конкретные примеры

Источник

Вам также может быть интересно:

Drag and Drop UWP — c# xaml mvvm
Вопрос: Нужно иметь возможность добавлять изображения в приложение путем перетаскивания из файловой системы У Grid включил AllowDrop. Но как добавить перетаскиваемые изображения в коллекцию? Т.к. те ...
Растягивание Высоты , Резина — html css html5
Вопрос: Здравствуйте! Реализовал резиновый дизайн. Растягивается ширина, но длина по % не растягивается. Возможно ли это реализовать? Или так и задумано, растягивание только на ширину ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
requestAnimation и очередность отрисовки — javascript canvas
Вопрос: Здравствуйте! Реализовал 2D игру и в Edge работает все плавно и круто, но в Firefox'e подвисает, сказали, что нужно сделать, чтобы раз-два момент и все ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
ViewPager внутри ViewPager — такие матрешки работают? — android viewpager
Вопрос: Доброго времени суток. Назрела новая задача. Есть каталог мастеров. При выборе конкретного мастера открывается его страница (активити с ViewPager), и теперь мастеров можно перелистывать свайпом. ...
Почему id всегда 1 Yii2 — yii авторизация
Вопрос: Использую все как по документации. Для получения информации о пользователе использую $identity = $model->findOne(]); И каким бы не был email, id пользователя всегда ...

Оставьте ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *