PHP MySQL добавление данных при помощи PDO - httpdoc.ru

PHP MySQL добавление данных при помощи PDO

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

Мы изучили, как вставлять несколько записей с помощью запроса на вставку, разделяя значения, заданные запятой, но этот метод не очень эффективен. Каждый раз для каждого набора значений весь запрос анализируется сервером, и это не влияет на эффективность выполнения запроса, но есть лучший вариант. Решение является mysqL prepared statement более эффективным и безопасным, чем выполнение обычного запроса вставки. Давайте посмотрим, что такое подготовленные операторы и как их использовать.

Что такое подготовленное заявление?

Подготовленный оператор (также известный как параметризованный оператор) представляет собой шаблон запроса с фиктивными значениями (заполнителями). Эти фиктивные значения или заполнители будут заменены фактическими значениями во время выполнения, и наши записи будут успешно вставлены в базу данных. .

Работа с подготовленным заявлением:

Подготовленная выписка состоит из 3 этапов:

  • Подготовка: шаблон запроса создается с фиктивными значениями (?) И отправляется в базу данных. Пример: ВСТАВИТЬ ЗНАЧЕНИЯ ученика (?,?,?).
  • Анализ: шаблон, полученный базой данных, будет проанализирован, скомпилирован базой данных, а затем будет сохранен без выполнения для будущего использования.
  • Выполнить: когда пользователь отправляет реальные значения в базу данных, значения привязываются к запросу во время выполнения. Эти значения будут заменять заполнители (?) Во время выполнения несколько раз с разными значениями.

Синтаксис в MySqli и PDO

Использование заполнителей в MySQLi и PDO немного отличается, давайте посмотрим на разницу:

Синтаксис MySQLi:

ВСТАВИТЬ студентов (имя, фамилия, адрес электронной почты) ЗНАЧЕНИЯ (?,?,?);

Вместо значений '?' используется, который будет заменен позже.

Синтаксис PDO:

PDO поддерживает два типа заполнителей: ? символ ( ), а также именованные заполнители. Именованный заполнитель начинается с двоеточия ( : ), за которым следует идентификатор.

Пример:

ВСТАВИТЬ студентов (имя, фамилия, адрес электронной почты)
ЗНАЧЕНИЯ (: имя,: фамилия,: адрес электронной почты);

Преимущества подготовленной выписки:

  • Это экономит время синтаксического анализа для каждого запроса вставки, поскольку он анализируется только один раз, но может выполняться несколько раз с разными значениями.
  • Поскольку нам нужно каждый раз отправлять на сервер базы данных только параметры, а не весь запрос, это значительно экономит пропускную способность.
  • Подготовленные операторы безопаснее, чем обычное выполнение запроса вставки, поскольку оно может спасти базу данных от инъекций SQL. Как мы уже говорили, значения отправляются в базу данных отдельно и используются только во время выполнения, это делает SQL-инъекции бесполезными, поскольку значения не встраиваются напрямую в запрос, а используются отдельно.

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

Подготовленное заявление процедурным методом

Давайте посмотрим, как выполнить простой подготовленный оператор в PHP. (Замените HOST, USERNAME, PASSWORD, DATABASE учетными данными своей базы данных.)

Пример
<?php
/* MySQL server connection */
$link = mysqli_connect("localhost", "root", "", "demo");
 
// Check connection
if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}
 
// Prepare an insert statement
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
 
if($stmt = mysqli_prepare($link, $sql)){
    // Bind variables to the prepared statement as parameters
    mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);
    
    /* Set the parameters values and execute
    the statement again to insert another row */
    $first_name = "Alvaro";
    $last_name = "Morte";
    $email = "alvaromorte@mail.com";
    mysqli_stmt_execute($stmt);
    
    /* Set the parameters values and execute
    the statement to insert a row */
    $first_name = "María";
    $last_name = "Pedraza";
    $email = "maríapedraza@mail.com";
    mysqli_stmt_execute($stmt);
    
    echo "Records inserted successfully.";
} else{
    echo "ERROR: Could not prepare query: $sql. " . mysqli_error($link);
}
 
// Close statement
mysqli_stmt_close($stmt);
 
// Close connection
mysqli_close($link);
?>

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


Пояснение к коду:

"mysqli_stmt_bind_param()" Функция используется для связывания заполнителей к переменным , которые обеспечат им значение. Во время выполнения значения, присутствующие в этих переменных, заменят заполнитель '?' . 'sss' Строка в функции используется , чтобы указать тип значений , содержащихся в этих переменных.

В этом примере 'sss' описывает тип данных 'string' , по одному 's' для каждой переменной последовательно.

mysqli_stmt_execute() Функция используется после присвоения значений переменных , чтобы выполнить запрос с вновь определенными значениями.

Различные типы данных описываются четырьмя символами:

  • b: двоичный (для изображения, файла PDF и т. д.)
  • d: double (число с плавающей запятой)
  • i: целое число (целые числа)
  • s: строка (текст)

Количество символов определения типа и связываемых переменных должно быть одинаковым и в правильной последовательности.


Подготовленное заявление с использованием объектно-ориентированного метода

Пример
<?php
/* MySQL server connection */
$mysqli = new mysqli("localhost", "root", "", "demo");
 
// Check connection
if($mysqli === false){
    die("ERROR: Could not connect. " . $mysqli->connect_error);
}
 
// Prepare an insert statement
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
 
if($stmt = $mysqli->prepare($sql)){
    // Bind variables to the prepared statement as parameters
    $stmt->bind_param("sss", $first_name, $last_name, $email);
    
    /* Set the parameters values and execute
    the statement again to insert another row */
    $first_name = "Alvaro";
    $last_name = "Morte";
    $email = "alvaromorte@mail.com";
    $stmt->execute();
    
    /* Set the parameters values and execute
    the statement to insert a row */
    $first_name = "María";
    $last_name = "Pedraza";
    $email = "maríapedraza@mail.com";
    $stmt->execute();
    
    echo "Records inserted successfully.";
} else{
    echo "ERROR: Could not prepare query: $sql. " . $mysqli->error;
}
 
// Close statement
$stmt->close();
 
// Close connection
$mysqli->close();
?>

Объяснение:

В объектно-ориентированном методе MySQLi этот bind_param() метод используется для привязки переменных к заполнителям. Значения выполняются с использованием execute() метода объектно-ориентированного метода MySqli.


Подготовленное заявление с использованием метода PDO

Пример
<?php
/* MySQL server connection */
try{
    $pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
    // Set the PDO error mode to exception
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    die("ERROR: Could not connect. " . $e->getMessage());
}
 
// Attempt insert query execution
try{
    // Prepare an insert statement
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:first_name, :last_name, :email)";
    $stmt = $pdo->prepare($sql);
    
    // Bind parameters to statement
    $stmt->bindParam(':first_name', $first_name, PDO::PARAM_STR);
    $stmt->bindParam(':last_name', $last_name, PDO::PARAM_STR);
    $stmt->bindParam(':email', $email, PDO::PARAM_STR);
    
    /* Set the parameters values and execute
    the statement again to insert another row */
    $first_name = "Alvaro";
    $last_name = "Morte";
    $email = "alvaromorte@mail.com";
    $stmt->execute();
    
    /* Set the parameters values and execute
    the statement to insert a row */
    $first_name = "María";
    $last_name = "Pedraza";
    $email = "maríapedraza@mail.com";
    $stmt->execute();
    
    echo "Records inserted successfully.";
} catch(PDOException $e){
    die("ERROR: Could not prepare/execute query: $sql. " . $e->getMessage());
}
 
// Close statement
unset($stmt);
 
// Close connection
unset($pdo);
?>

В методе PDO bindParam() функция используется для привязки параметров, а также обратите внимание, что она используется отдельно для привязки каждой переменной по очереди.