Подстановка параметров в запросы онлайн урок.


В предыдущем уроке мы рассмотрели метод query() для формирования утверждения по запросу. Однако часто бывает, что в запрос необходимо подставить параметры из переменных PHP. Например, найти студентов по имени $name.

Для этого необходимо использовать два метода:

  • prepare() - создает утверждение по шаблону запроса, в который будут подставлены параметры

  • execute() - исполняет запрос, подставляя в него параметры, которые записаны в виде массива.


Рассмотрим эти методы детальнее. Допустим нам необходимо искать студентов по имени и по диапазону возраста. Используем метод prepare()

$sth = $dbh->prepare('SELECT name, age FROM student WHERE name = :name AND age > :age');

Тут мы использовали плейсхолдеры (placeholders) , которые обозначены :name и :age. Вместо них будут подставляться реальные параметры для исполнения запроса. Для этого необходимо задать массив, ключи которого будут совпадать с названиями плейсхолдеров, за исключением двоеточия

$params = array(
$nbsp; 'name' => 'Mike',
$nbdp; 'age' => 22
);

Далее, нам надо исполнить запрос. Для этого используется метод execute() который принимает аргумент в виде массива с параметрами

$sth->execute($params);

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

$students = $sth->fetchAll(PDO::FETCH_ASSOC);
print_r($students);


Удобство состоит в том, что если нам необходимо исполнить тот же запрос отдругих параметров, мы можем использовать подготовленное утверждение:

$sth->execute( array('name' => 'Andy', 'age' => 20) );
$students = $sth->fetchAll(PDO::FETCH_ASSOC);
print_r($students);


Таким образом, функции prepare() и execute() являются более обобщенной конструкцией функции query(), которая сразу исполняет запрос.

$dsn = 'mysql:host=localhost; dbname=my_db';
$user = 'root';
$password = '';

try {
  $dbh = new PDO($dsn, $user, $password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $sth = $dbh->prepare('SELECT name, age FROM student WHERE name = :name AND age > :age');
  $params = array(
    'name' => 'Mike',
    'age' => 22
  );
  $sth->execute($params);
  $students = $sth->fetchAll(PDO::FETCH_ASSOC);
  print_r($students);

  echo '<br>';

  $sth->execute( array('name' => 'Andy', 'age' => 20) );
  $students = $sth->fetchAll(PDO::FETCH_ASSOC);
  print_r($students);

} catch (PDOException $e) {
  echo $e->getMessage();
}


Замечание. Плейсхолдеры могут быть без имен:

$sth = $dbh->prepare('SELECT name, age FROM student WHERE name = ? AND age > ?');

Но тогда элементы массива с параметрами должны быть пронумерованны согласно размещению плейсхолдеров, начиная с нуля:

$params = array('Mike',22);

Замечание. Количество плейсходлеров должно совпадать с количеством элементов в массиве с параметрами. В случае с именованными плейсхолдерами, названия ключей должны совпадать с ключами массива.

Замечание. Аналогично вместе с плейсхолдерами можно использовать и запросы UPDATE, INSERT.

Проверьте свои знания
Получить вывести из скрипта на экран выборки из предыдущих заданий