Как создать подготовленный оператор pdo mysql с заполнителем в пользовательском уравнении? - PullRequest
0 голосов
/ 15 сентября 2018

Я внедряю систему рейтинга, которая была похожа на ту, что вы видите в Google Play и многих других. Для этого я создал таблицу с именем tbl_ratings и столбцами PRIMARY, IID и sum_rating. Конечно, столбец PRIMARY находится в ключе автоинкремента, IID - идентификатор элемента, а sum_rating - совокупная сумма всех пользовательских оценок.

Таким образом, таблица tbl_ratings может выглядеть следующим образом:

PRIMARY IID sum_rating
21       2   100

Теперь это то, что я намерен сделать, я хочу не делать SELECT просто для извлечения значения для использования в PHP, поскольку я могу сделать простое добавление из запроса на обновление, поэтому каждый раз, когда появляется пользователь который присваивает рейтинг, я обновлю таблицу следующим образом:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
$stmt = $pdo->prepare("UPDATE tbl_ratings SET sum_rating=sum_rating+".$_POST['rating']." WHERE IID='2'")
$stmt->execute();

Но, как вы знаете, это плохая реализация, так как она открыта для SQL-инъекций. Но эй, это работает! Так что теперь я хочу сделать это намного безопаснее, выполнив

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
$stmt = $pdo->prepare("UPDATE tbl_ratings SET sum_rating=sum_rating+? WHERE IID='2'")
$stmt->execute(array($_POST['rating']));

Если вы заметили, что это довольно просто, я просто заменяю потенциальную точку внедрения sql на заполнитель ?, как и должно быть построено правильное подготовленное утверждение. Плохая вещь в том, что это не работает . Я пытался искать в Интернете, но это, кажется, не так плодотворно.

Каким должен быть правильный способ вычисления известного значения столбца плюс данные в подготовленном операторе 1 pdo?

1 Ответ

0 голосов
/ 16 сентября 2018

Все значения преобразуются в строковые значения в методе execute. Вы должны использовать метод bindParam для установки типа значения, например:

$sth->bindParam(1, $_POST['rating'], PDO::PARAM_INT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...