Я внедряю систему рейтинга, которая была похожа на ту, что вы видите в 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?