Что означает двоеточие в: name при использовании php bindParam - PullRequest
0 голосов
/ 04 июля 2018

В руководстве по PHP есть этот пример для оператора PDO bindParam:

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

Означает ли двоеточие :, что :colour является параметром?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Параметр

Идентификатор параметра. Для подготовленного оператора, использующего именованные заполнители, это будет имя параметра в форме: имя. Для подготовленного оператора, использующего заполнители с вопросительным знаком, это будет позиция индекса с индексом 1.

переменная

Имя переменной PHP для привязки к параметру оператора SQL.

см. Документы здесь для справки http://php.net/manual/en/pdostatement.bindparam.php.

$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 = "john@example.com";
$stmt->execute();
0 голосов
/ 04 июля 2018

Соответствует указанному заполнителю в запросе. Это не требуется для привязки, драйвер автоматически добавит его, если он отсутствует.

В вашем коде у вас есть

$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
                     ^^^^^^^^^              ^^^^^^^

Драйвер читает что-либо с : и завершающим текстом в качестве заполнителя. Затем он заменяет это содержимое ограниченным значением, экранирует все специальные символы и заключает в кавычки строку.

Итак, ваш bindparam имеет

:calories и :colour, которые соответствуют каждому из них. Допустим, у $calories было o'brien. Когда запрос отправляется в БД, он будет:

SELECT name, colour, calories
FROM fruit
WHERE calories < 'o\'brien'

PDO также поддерживает безымянные заполнители, которые являются просто вопросительными знаками ?. Вы связываете их по положению.

$sth = $dbh->prepare('SELECT name, colour, calories
        FROM fruit
        WHERE calories < ? AND colour = ?');

и затем используйте 1, потому что это первый заполнитель.

$sth->bindParam(1, $calories, PDO::PARAM_INT);

Кроме того, вы можете просто передать все значения в функцию execute в виде массива, и она также выполнит привязку.

Независимо от привязки bindparam или execute вы должны обратиться к привязке, используя ее в запросе. Безымянный - позиционный, по имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...