Как использовать 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. А также о том, как устранять распространенные ошибки. Эти знания будут полезны при изучении программирования и при разработке собственного сайта.