@Reflections

Как добавить данные в БД через HTML-форму?

xammp
<form action="player.php" method="POST">
		<input type="text" name="name" placeholder="Enter song name">
		<input type="text" name="author" placeholder="Enter song author">
		<input type="submit" value="Add to DB">
	</form>


$name = $_POST['name'];
$author = $_POST['author'];

$mysqli = new mysqli('localhost', 'root', '', 'player');

if(mysqli_connect_errno()) {
	printf("Соединение не установлено", mysqli_connect_error());
	exit();
}

$query = $mysqli->query("SELECT * FROM music");

while ($row = mysqli_fetch_assoc($query) ) {
	echo $row['name']." - ".$row['author']."<br>";
}

Как используя метод, написанный выше реализовать добавление в БД элемента с двумя параметрами (id = AUTO INCREMENT).
  • Вопрос задан
  • 893 просмотра
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Сначала учимся правильно соединяться.
В случае mysqli это
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect($host, $user, $pass, $db_name);
$link->set_charset("utf8mb4");

И никаких ужасов с "Соединение не установлено" тут быть не должно.

После этого выполняем запрос INSERT. Причем запросы мы всегда пишем так, чтобы данные в БД попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
Для этого надо
  • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
  • Подготовить запрос к исполнению с помощью функции 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".

И тогда никаких ошибок запроса уже никогда не будет. Не говоря уже о том что при любых других вариантах твой сайт поломает любой пятиклассник.

Весь код, который добавляет запись в БД, должен быть расположен ДО любого вывода.
После обработки запроса методом POST необходимо перенаправить клиента куда-нибудь методом GET и завершить работу скрипта. Делается это функцией header с заголовком location: . после которой написать exit;
Соответственно, никаких ужасов с "Запись добавлена".

Кстати, немного удобнее с БД работать не через mysqli, а чрез PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute

Подключение
$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$port = "3306";
$charset = 'utf8mb4';
$options = [
    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];
$dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
$pdo = new \PDO($dsn, $user, $pass, $options);


Выполнение запроса
$sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
$stmt = $link->prepare($sql);
$stmt->execute([$title, $discription, $date, $path]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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