Как использовать PHP для вставки строк в базу данных MySQL

Вступление
В этой статье мы рассмотрим, как использовать PHP для вставки строк в базу данных MySQL.
Шаг 1 - Создание таблицы
Сначала нужно создать таблицу для данных. Это простая процедура, которую можно выполнить с помощью phpMyAdmin в панели управления хостингом.

После входа вы phpMyAdmin вы увидите такой интерфейс:

Создадим в базе данных u266072517_name таблицу с именем Students, нажав на кнопку «Создать таблицу». После этого мы увидите новую страницу, на которой задаем все необходимые параметры таблицы:

Это самая простая настройка, которую можно использовать для таблицы и получения дополнительной информации о структуре таблиц / баз данных.
Параметры столбцов:
- Name - это имя столбца, которое отображается в верхней части таблицы.
- Type - тип столбца. Например, мы выбрали varchar, потому что будем вводить строковые значения.
- Length/Values - используется для указания максимальной длины, которую может иметь запись в этом столбце.
- Index - мы использовали «Первичный» индекс для поля «ID». При создании таблицы рекомендуется применять в качестве первичного ключа только один столбец. Он используется для перечисления записей в таблице и требуется при настройке таблицы. Я также отметил «A_I», что означает «Auto Increment» - параметр автоматического присваивания номера записей (1,2,3,4 ...).
Нажмите кнопку «Сохранить», и таблица будет создана.
Шаг 2. Написание PHP-кода для вставки данных в MySQL.
Вариант 1 - метод MySQLi
Сначала необходимо установить соединение с базой данных. После этого используем SQL-запрос INSERT. Полный пример кода:
<?php
$servername = "mysql.hostinger.co.uk";
$database = "u266072517_name";
$username = "u266072517_user";
$password = "buystuffpwd";
// Устанавливаем соединение
$conn = mysqli_connect($servername, $username, $password, $database);
// Проверяем соединение
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connectedsuccessfully";
$sql = "INSERT INTO Students (name, lastname, email) VALUES ('Thom', 'Vial', 'thom.v@some.com')";
if (mysqli_query($conn, $sql)) {
echo "New recordcreatedsuccessfully";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
mysqli_close($conn);
?>
Первая часть кода (3 - 18 строка) предназначена для подключения к базе данных.
Начнем со строки № 19:
$sql = "INSERT INTO Students (name, lastname, email) VALUES ('Thom', 'Vial', 'thom.v@some.com')";
Она вставляет данные в базу MySQL. INSERT INTO - это оператор, который добавляет данные в указанную таблицу. В нашем примере данные добавляются в таблицу Students.
Далее идет перечисление столбцов, в которые вставляются значения: name, lastname, email. Данные будут добавлены в указанном порядке. Если бы мы написали (email, lastname, name), значения бы были добавлены в другом порядке.
Следующая часть - это оператор VALUES. Здесь мы указываем значения для столбцов: name = Thom, lastname = Vial, email = thom.v@some.com.
Мы запустили запрос с использованием PHP-кода. В программном коде SQL-запросы должны быть экранированы кавычками. Следующая часть кода (20-22 строка) проверяет, был ли наш запрос успешным:
if (mysqli_query($conn, $sql)) {
echo "New recordcreatedsuccessfully";
}
Этот код выводит сообщение об успешном выполнении запроса.
И последняя часть (22 - 24 строка) отображает уведомление, если запрос не был успешным:
else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
Вариант 2 - метод объекта данных PHP (PDO)
Сначала нам нужно подключиться к базе данных путем создания нового объекта PDO. При работе с ним будем использовать различные методы PDO. Методы объектов вызываются следующим образом:
$the_Object->the_Method();
PDO позволяет «подготовить» SQL-код до его выполнения. SQL-запрос оценивается и «исправляется» перед запуском. Например, простейшая атака с использованием SQL-инъекции может быть выполнена через простое введение SQL-кода в поле формы. Например:
// Пользователь пишет это в поле имени пользователя формы авторизации
john"; DROP DATABASE user_table;
// Окончательный запрос будет следующим
"SELECT * FROM user_table WHERE username = john"; DROP DATABASE user_table;
Так как это синтаксически правильный SQL- код, точка с запятой делает DROP DATABASE user_table новым SQL-запросом, и пользовательская таблица удаляется. Подготовленные выражения (связанные переменные) не позволяют, чтобы точка с запятой и кавычки завершали исходный запрос.Поэтому команда DROP DATABASE никогда не будет выполнена.
Чтобы использовать подготовленные выражения, нужно написать новую переменную, которая вызывает метод prepare() объекта базы данных.
Корректный код:
<?php
$servername = "mysql.hostinger.com";
$database = "u266072517_name";
$username = "u266072517_user";
$password = "buystuffpwd";
$sql = "mysql:host=$servername;dbname=$database;";
$dsn_Options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
// Создаем новое соединение с базой данных MySQL, используя PDO, $my_Db_Connection - это объект
try {
$my_Db_Connection = new PDO($sql, $username, $password, $dsn_Options);
echo "Connectedsuccessfully";
} catch (PDOException $error) {
echo 'Connection error: ' . $error->getMessage();
}
// Устанавливаем переменные для персоны, которую мы хотим добавить в базу данных
$first_Name = "Thom";
$last_Name = "Vial";
$email = "thom.v@some.com";
// Создаем переменную, которая вызывает методобъекта базы данных prepare()
// Запрос SQL, который вы хотите выполнить, вводится как параметр, а заполнители пишутся следующим образом:placeholder_name
$my_Insert_Statement = $my_Db_Connection->prepare("INSERT INTO Students (name, lastname, email) VALUES (:first_name, :last_name, :email)");
// Теперь мы указываем скрипту, какая переменная ссылается на каждый заполнитель, чтобы использовать метод bindParam()
// Первый параметр - это заполнитель в операторе выше, второй - это переменная, на которую он должен ссылаться
$my_Insert_Statement->bindParam(:first_name, $first_Name);
$my_Insert_Statement->bindParam(:last_name, $last_Name);
$my_Insert_Statement->bindParam(:email, $email);
// Выполняем запрос, используя данные, которые только что определили
// Метод execute() возвращает TRUE, если он выполнен успешно, и FALSE, если нет, предоставляя вам возможность вывести собственное сообщение
if ($my_Insert_Statement->execute()) {
echo "New recordcreatedsuccessfully";
} else {
echo "Unable to createrecord";
}
// В этой точке можно изменить данные переменных и выполнить запрос, чтобы добавить другие данные в базу
data to the database
$first_Name = "John";
$last_Name = "Smith";
$email = "john.smith@email.com";
$my_Insert_Statement->execute();
// Выполняем снова, когда переменная изменена
if ($my_Insert_Statement->execute()) {
echo "New recordcreatedsuccessfully";
} else {
echo "Unable to createrecord";
В строках 28, 29 и 30 мы используем метод bindParam() объекта базы данных. Также существует метод bindValue(), который сильно отличается от предыдущего.
- bindParam() - этот метод оценивает данные при достижении метода execute(). В первый раз, когда скрипт достигает метода execute(), он видит, что $first_Name соответствует «Thom». Затем связывает это значение и запускает запрос. Когда скрипт достигает второго метода execute(), он видит, что $first_Name теперь соответствует «John». После чего связывает это значение и снова запускает запрос с новыми значениями. Важно помнить, что мы однажды определили запрос и повторно используем его с разными данными в разных точках скрипта.
- bindValue() - этот метод оценивает данные, как только достигается bindValue(). Поскольку для $first_Name было установлено значение «Thom», при достижении bindValue(), оно будет использоваться каждый раз, когда вызывается метод execute() для $my_Insert_Statement.
Обратите внимание, что мы повторно используем переменную $first_Name и присваиваем ей новое значение во второй раз. После запуска скрипта в БД будут указаны оба имени, несмотря на то, что переменная $first_Name в конце скрипта имеет значение «John». Помните, что PHP проверяет весь скрипт, прежде чем запустить его.
Если вы обновите скрипт, чтобы заменить bindParam на bindValue, вы дважды вставите в базу данных «Thom Vial», а John Smith будет проигнорирован.
Шаг 3 - подтверждение успешного выполнения и решение проблем
Если запрос на вставку строк в базу был успешным, мы увидим следующее сообщение:
Устранение распространенных ошибок
MySQLi
В любом другом случае будет отображено сообщение об ошибке. Например, давайте сделаем в коде одну синтаксическую ошибку, и мы получим следующее:

Первая часть кода в порядке, соединение было успешно установлено, но SQL-запрос не прошел.
"Error: INSERT INTO Students {name, lastname, email} VALUES ('Thom', 'Vial', 'thom.v@some.com')
You have an error in your SQL syntax; check the manualthatcorresponds to your MySQL server version for the rightsyntax to use near '{name, lastname, email} VALUES ('Thom', 'Vial', 'thom.v@some.com')' at line 1"
Была допущена синтаксическая ошибка, которая вызвала сбой скрипта. Ошибка была здесь:
$sql = "INSERT INTO Students {name, lastname, email} VALUES ('Thom', 'Vial', 'thom.v@some.com')";
Мы использовали фигурные скобки вместо обычных. Это неверно, и скрипт выдал синтаксическую ошибку.
PDO
В строке 7 соединения PDO для режима ошибок установлено «display all exceptions». Если задано другое значение, и запрос не удался бы, мы не получили бы никаких сообщений об ошибках.
Данную настройку следует использовать только при разработке скрипта. При ее активации могут отображаться имена базы данных и таблиц, которые лучше скрыть в целях безопасности. В описанномвыше случае, когда вместо обычных скобок использовались фигурные, сообщение об ошибке выглядит так:
Fatal error: Uncaughtexception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or accessviolation: 1064 You have an error in your SQL syntax; <code>check the manualthatcorresponds to your MySQL server version for the rightsyntax to use near '{name, lastname, email} VALUES ('Thom', 'Vial', 'thom.v@some.com')' at line 1"</code>
Другие возможные проблемы:
- Неверно указаны столбцы (несуществующие столбцы или орфографическая ошибка в их именах).
- Один тип значения присваивается столбцу другого типа. Например, если попытаться вставить число 47 в столбец Name, то получим ошибку. В этом столбце необходимо использовать строковое значение. Но если бы мы указали число в кавычках (например, «47») то сработало бы, потому что это строка.
- Попытка ввести данные в таблицу, которая не существует. А также допущенная орфографическая ошибка в имени таблицы.
После успешного ввода данных мы увидим, что они добавлены в базу данных. Ниже приведен пример таблицы, в которую добавили данные.

Заключение
В этой статье мы рассказали, как использовать PHP для вставки данных в базу данных MySQL, используя MySQLi и PDO. А также о том, как устранять распространенные ошибки. Эти знания будут полезны при изучении программирования и при разработке собственного сайта.