Задать вопрос
@TerritoryOfPeace
Изучаю php

При попытке записать апостроф в SQL выдает ошибку? Как это исправить?

Понимаю что это происходит в этом моменте:

$mysqli->query("INSERT INTO table
     (data)
    VALUES
    ('$data')
    ");


Как это можно пофиксить?
  • Вопрос задан
  • 258 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Учить РНР надо не по написанным нубами при царе Горохе руководствам, а по нормальным учебникам.
Или хотя бы по нормальным ответам на тостере.
https://qna.habr.com/q/918033#answer_1847841

Никакого $data в запросе быть не должно. Любые переменные должны отправляться в БД отдельно
Для этого надо
Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
Привязать переменные к запросу.
Выполнить подготовленный ранее запрос с помощью с помощью execute()

В mysqli это будет так
$sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
$stmt = $link->prepare($sql);
$stmt->bind_param("sssss", $title, $discription, $date, $path);
$stmt->execute();


bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

И тогда никаких ошибок запроса уже никогда не будет. Не говоря уже про инъекции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы