Как правильно соединиться с бд и отправить туда данные?

Я начал учить php, и столкнулся с одной проблемой:запрос в коде php не отправляется в таблицу в бд.

$mysql = new mysqli('localhost','root','root','register-bd');
$mysql->query("INSERT INTO `users` (`login`, `pass`, `name`) VALUES('$login', '$pass', '$name')");
$mysql->close();

Что тут не так? Выводится ошибка загрузки страницы HTTP ERROR 500.


Ответы (1 шт):

Автор решения: Ипатьев

Хороший вопрос на самом деле, на который очень мало нормальных ответов.

Как правильно соединяться

При соединении помимо правильных параметров соединения с БД еще очень важно учитывать два момента:

  • кодировку соединения, чтобы потом не возникало вопросов "у меня кракозябры в базе данных"
  • режим выброса исключений, чтобы потом не возникало вопросов "а почему у меня ничего не работает"

Готовый пример возьмём отсюда:

<?php
$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
    $mysqli = new mysqli($host, $user, $pass, $db);
    $mysqli->set_charset($charset);
} catch (\mysqli_sql_exception $e) {
     throw new \mysqli_sql_exception($e->getMessage(), $e->getCode());
}
unset($host, $db, $user, $pass, $charset); // we don't need them anymore

В этом коде надо заменить параметры соединения на свои и поместить его в отдельный файл. И затем инклюдить там, где нужно соединение с базой данных.

Как отправить данные в БД

На этот вопрос тоже очень много дурацких ответов, которые создают больше прорблем, чем решают.

Чтобы правильно добавить данные в БД, надо

  1. Написать запрос, в котором все переменные заменить на знаки вопроса
  2. Подготовить запрос к выполнению
  3. Привязать переменные к запросу
  4. Выполнить

В итоге получаем такой код:

<?php
// подключаем соединение
require_once 'mysqli.php';

// создаем запрос SQL в котором все переменные заменены на знак вопроса
$sql = "INSERT INTO `users` (`login`, `pass`, `name`) VALUES(?,?,?)";
// подготоваливаем запрос
$stmt = $mysqli->prepare($sql); 
// привязываем переменные к запросу
// указывая тип для каждой переменной. для простоты всегда можно использовать тип "s"
$stmt->bind_param("sss", $login, $pass, $name);
// выполняем запроc
$stmt->execute();

при таком способе у нас никогда не будет ошибок синтаксиса, не говоря уже об sql инъекциях.

→ Ссылка