Как правильно соединиться с бд и отправить туда данные?
Я начал учить 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
В этом коде надо заменить параметры соединения на свои и поместить его в отдельный файл. И затем инклюдить там, где нужно соединение с базой данных.
Как отправить данные в БД
На этот вопрос тоже очень много дурацких ответов, которые создают больше прорблем, чем решают.
Чтобы правильно добавить данные в БД, надо
- Написать запрос, в котором все переменные заменить на знаки вопроса
- Подготовить запрос к выполнению
- Привязать переменные к запросу
- Выполнить
В итоге получаем такой код:
<?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 инъекциях.