Подготовленные заявления очень полезны против инъекций SQL.
Подготовленные отчеты и связанные параметры
Готовое заявление функция используется для выполнения тех же (or similar) операторов SQL несколько раз с высокой эффективностью.
Подготовленные заявления в основном работают так:
- Подготовка: шаблон выписки SQL создается и отправляется в базу данных. Некоторые значения остаются неопределенными, называются параметрами (labeled "?") . Пример: INSERT INTO MyGuests VALUES(?, ?, ?)
- База данных разбирает, компилирует и выполняет оптимизацию запросов на шаблоне оператора SQL, и сохраняет результат без его выполнения
- Выполнение: В более позднее время, приложение связывает значение параметров, а база данных выполняет оператор. Приложение может выполнить инструкцию столько раз, сколько он хочет с различными значениями
По сравнению с выполнением SQL заявления непосредственно, подготовленные заявления имеют два основных преимущества:
- Подготовленные заявления сокращает время синтаксического анализа , поскольку препарат на запрос делается только один раз (although the statement is executed multiple times)
- Связанные параметры ограничения пропускной способности канала к серверу, как вам нужно отправить только параметры каждый раз, а не весь запрос
- Подготовленные заявления очень полезны против инъекций SQL, так как значения параметров, которые передаются позже с помощью другого протокола, не должны быть правильно убежали. Если исходный шаблон выписки не является производным от внешнего источника, инъекции SQL не может произойти.
Подготовленные заявления в MySQLi
Следующий пример использует подготовленные операторы и связанные параметры в MySQLi:
Пример (MySQLi with Prepared Statements)
<?php
$servername = "localhost";
$username = "username";
$password =
"password";
$dbname =
"myDB";
// Create connection
$conn = new mysqli($servername,
$username, $password, $dbname);
// Check connection
if ($conn->connect_error)
{
die("Connection failed: " . $conn->connect_error);
}
// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname,
$email);
// set parameters and execute
$firstname = "John";
$lastname
= "Doe";
$email = "[email protected]";
$stmt->execute();
$firstname
= "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
$conn->close();
?>
Код строки объяснить из приведенного выше примера:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"
В нашем SQL, мы вставляем знак вопроса (?) , Где мы хотим подставить в целое число, строка, двойной или больших двоичных объектов значение.
Затем, посмотрите на bind_param() функции:
$stmt->bind_param("sss", $firstname, $lastname, $email);
Эта функция связывает параметры для запроса SQL и сообщает базу данных, что параметры являются. "sss" аргумент содержит типы данных , что параметры. S символ говорит MySQL, что параметр является строкой.
Аргумент может быть один из четырех типов:
- я - целое число,
- д - двойной
- s - строка
- б - BLOB
Мы должны иметь один из них для каждого параметра.
Говоря MySQL, какой тип данных ожидать, мы сводим к минимуму риск инъекции SQL.
Примечание: Если мы хотим , чтобы вставить какие - либо данные из внешних источников (like user input) , (like user input) , это очень важно, чтобы данные продезинфицировать и проверены.
Подготовленные заявления в PDO
Следующий пример использует подготовленные операторы и связанные параметры в PDO:
Пример (PDO with Prepared Statements)
<?php
$servername = "localhost";
$username = "username";
$password =
"password";
$dbname =
"myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname",
$username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
// prepare sql and bind
parameters
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname',
$lastname);
$stmt->bindParam(':email', $email);
// insert a row
$firstname =
"John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>