Подготовленные выражения и привязка параметров
Используйте prepare, bindParam и execute, чтобы предотвращать SQL-инъекции
«Подготовленные выражения и привязка параметров» — бесплатный урок PHP Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Зачем нужны подготовленные выражения
Подготовленные выражения отделяют структуру SQL от данных. Пользовательский ввод всегда обрабатывается как значение, а не как код SQL, что делает SQL-инъекцию невозможной.
prepare() + execute()
Основной порядок действий: подготовьте запрос с заполнителями, затем выполните его со значениями.
<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$_POST["email"]]);
$user = $stmt->fetch();Именованные заполнители
Используйте именованные заполнители (:name) для ясности, особенно если одно и то же значение встречается несколько раз.
<?php
$stmt = $pdo->prepare(
"INSERT INTO users (name, email) VALUES (:name, :email)"
);
$stmt->execute([':name' => "Alice", ':email' => "alice@example.com"]);bindParam и bindValue
bindParam связывает переменную по ссылке — значение считывается во время выполнения. bindValue немедленно связывает конкретное значение.
<?php
$name = "Bob";
$stmt = $pdo->prepare("INSERT INTO users (name) VALUES (:name)");
$stmt->bindParam(":name", $name);
$name = "Carol";
$stmt->execute(); // inserts "Carol"Пример bindValue
Используйте bindValue, если хотите зафиксировать значение в момент связывания.
<?php
$stmt = $pdo->prepare("SELECT * FROM products WHERE price < :max");
$stmt->bindValue(":max", 50.00, PDO::PARAM_INT);
$stmt->execute();Константы типов
Необязательный третий параметр задаёт тип данных: PDO::PARAM_INT, PDO::PARAM_STR, PDO::PARAM_BOOL, PDO::PARAM_NULL.
Повторное выполнение операторов
Подготовленный оператор можно выполнять несколько раз — запрос компилируется на сервере только один раз.
<?php
$stmt = $pdo->prepare("INSERT INTO logs (msg) VALUES (:msg)");
foreach ($messages as $msg) {
$stmt->execute([':msg' => $msg]);
}rowCount()
После INSERT/UPDATE/DELETE rowCount() возвращает количество затронутых строк.
<?php
$stmt = $pdo->prepare("DELETE FROM users WHERE active = 0");
$stmt->execute();
echo $stmt->rowCount()." users deleted";lastInsertId()
После INSERT получите первичный ключ с автоинкрементом с помощью $pdo->lastInsertId().
<?php
$stmt = $pdo->prepare("INSERT INTO articles (title) VALUES (:t)");
$stmt->execute([':t' => "My Post"]);
$newId = $pdo->lastInsertId();Никогда не объединяйте пользовательский ввод со строкой запроса
Никогда не делайте так: "SELECT * FROM users WHERE name = '".$name."'". Всегда используйте заполнители, даже если Вы «санитизировали» ввод.
Объект PDOStatement
prepare() возвращает объект PDOStatement с методами: execute(), fetch(), fetchAll(), bindParam(), bindValue(), rowCount().
Итоги
Всегда используйте подготовленные выражения для запросов с внешними данными. Предпочитайте именованные заполнители. Используйте bindValue для немедленных значений, а bindParam — для связывания в цикле.
Быстрая проверка
Когда bindParam считывает своё значение?
Часто задаваемые вопросы
Урок «Подготовленные выражения и привязка параметров» бесплатный?
Да — полный текст урока «Подготовленные выражения и привязка параметров» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Подготовленные выражения и привязка параметров»?
Используйте prepare, bindParam и execute, чтобы предотвращать SQL-инъекции Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Подготовленные выражения и привязка параметров»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Подключение к MySQL с помощью PDO
- Подготовленные выражения и привязка параметров
- Получение результатов с помощью PDO
- Транзакции с PDO