3

Вот обработка данных как происходит

<?php
include_once 'db.php';

if (isset($_POST['add'])) {

// преобразуем специальные символы в текст

$name = htmlspecialchars($_POST['name']); $text = htmlspecialchars($_POST['text']); $message = htmlspecialchars($_POST['message']); $rating = htmlspecialchars($_POST['rating']);

// заносим данные из формы в переменные и проверяем на ошибки

$name = strip_tags(trim($_POST['name'])); $text = strip_tags(trim($_POST['text'])); $message = strip_tags(trim($_POST['message'])); $rating = strip_tags(trim($_POST['rating'])); $date = $_POST['date'];

// заносим дату и время отзыва $date = date('Y-m-d H:i');

// проверка введенных данных

if($name != '' AND $text != '' AND $message != '')

// отправка данных в бд

mysqli_query($link, " INSERT INTO Otzivy2 (name, text, message, date, rating) VALUES ('$name', '$text', '$message', '$date', '$rating')"); $to = 'почта'; $subject = 'review'; $message = "Текст отзыва: " . $_POST['message'] . "\nОт: " . $_POST['text'] . " " . $_POST['email'] . "\nВремя: " . date("d.m.Y - H:i"); $headers = array( 'From' => 'почта', 'Reply-To' => 'почта', 'X-Mailer' => 'PHP/' . phpversion() );

mail($to, $subject, $message, $headers); }

// закрываем сеанс

include_once 'clear.php'; include_once 'form.php';

?>

Arcadiy
  • 841

1 Answers1

8

Для того чтобы навсегда избежать любых проблем с передаваемыми в запрос данными, будь то ошибки или взлом сайта, любые данные надо всегда передавать в базу данных отдельно от запроса. Это делается с помощью подготовленных, или, как их ещё называют, параметризованных запросов.

В 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

  • А "sssss" это какие данные? – Arcadiy Dec 13 '20 at 15:20
  • Понял это это присвоение буквы и столько ее сколько параметров – Arcadiy Dec 13 '20 at 15:22
  • с Селектом крашится страница – Arcadiy Dec 14 '20 at 10:00
  • 1
    Надо проверить запрос. Самому его написать, а не тупо копировать. Плюс включить отображение ошибок как написано здесь https://ru.stackoverflow.com/a/423446/179379 прочитать ошибку и исправить – Ипатьев Dec 14 '20 at 10:11