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

Вступление

В этой статье мы рассмотрим, как использовать PHP для вставки строк в базу данных MySQL.

Шаг 1 - Создание таблицы

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

Шаг 1 - Создание таблицы

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

Шаг 1 - Создание таблицы - 2

Создадим в базе данных 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

В любом другом случае будет отображено сообщение об ошибке. Например, давайте сделаем в коде одну синтаксическую ошибку, и мы получим следующее:

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») то сработало бы, потому что это строка.
  • Попытка ввести данные в таблицу, которая не существует. А также допущенная орфографическая ошибка в имени таблицы.

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

PDO

Заключение

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

Пожалуйста, оставляйте ваши отзывы по текущей теме статьи. Мы крайне благодарны вам за ваши комментарии, отклики, дизлайки, лайки, подписки!

Пожалуйста, опубликуйте свои мнения по текущей теме статьи. За комментарии, подписки, дизлайки, отклики, лайки низкий вам поклон!

Вадим Дворниковавтор-переводчик статьи «How to Use PHP to Insert Data Into MySQL Database»