Для того чтобы навсегда избежать любых проблем с передаваемыми в запрос данными, будь то ошибки или взлом сайта, любые данные надо всегда передавать в базу данных отдельно от запроса. Это делается с помощью подготовленных, или, как их ещё называют, параметризованных запросов.
В mysqli, чтобы выполнить параметризованный запрос, необходимо выполнить 4 действия:
- Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
- Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса mysqli_stmt, с которым в дальнейшем и производятся все манипуляции
- Привязать переменные к запросу с помощью bind_param(). Это очень интересная функция. Она принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".
- Выполнить запрос с помощью с помощью execute(). Эта функция выполняется без параметров
На словах это звучит длинно, но на практике получается не так сложно. Но сначала надо правильно написать код подключения к БД, чтобы не было проблем с русскими буквами и чтобы база сообщала обо всех ошибках:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('127.0.0.1', '1', '1', 'vk2');
$db->set_charset('utf8mb4');
Этот код надо написать один раз, желательно в отдельном файле, и потом подключать этот файл в другие скрипты где нужна работа с БД. Помимо прочих полезных вещей, этот код сообщает mysqli, что надо генерировать ошибку РНР каждый раз, когда возникла ошибка запроса, чтобы ее можно было отследить и исправить. (Примечание: чтобы видеть сами ошибки, надо соответствующим образом настроить РНР)
И после этого можно приступать собственно к выполнению запроса
$sql = "INSERT INTO Otzivy2 (name, text, message, date, rating) VALUES (?,?,?,?,?)";
$stmt = $link->prepare($sql);
$stmt->bind_param("sssss", $name, $text, $message, $date, $rating);
$stmt->execute();
То же самое касается и запросов SELECT. Только для получения результата запроса надо выполнить еще одну команду - get_result().
Например
$sql = "SELECT * FROM Otzivy2 LIMIT ?,?";
$stmt = $db->prepare($sql);
$stmt->bind_param("ss", $start, $num);
$stmt->execute();
$result = $stmt->get_result(); // получаем result
а дальше как обычно fetch или while