- PDOStatement::bindParam
- Syntax
- Parameters
- Return Value
- Remarks
- Parameter example
- Output parameter example
- Input/Output example
- Decimal input example
- PDOStatement::bindParam
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- Подготовленные запросы
- Неименованный плейсхолдер
- Именованный плейсхолдер
- Метод bindParam()
PDOStatement::bindParam
Binds a parameter to a named or question mark placeholder in the SQL statement.
Syntax
bool PDOStatement::bindParam($parameter, &$variable[, $data_type[, $length[, $driver_options]]]);
Parameters
$parameter: A (mixed) parameter identifier. For a statement using named placeholders, use a parameter name (:name). For a prepared statement using the question mark syntax, it is the 1-based index of the parameter.
&$variable: The (mixed) name of the PHP variable to bind to the SQL statement parameter.
$data_type: An optional (integer) PDO::PARAM_* constant. Default is PDO::PARAM_STR.
$length: An optional (integer) length of the data type. You can specify PDO::SQLSRV_PARAM_OUT_DEFAULT_SIZE to indicate the default size when using PDO::PARAM_INT or PDO::PARAM_BOOL in $data_type.
$driver_options: The optional (mixed) driver-specific options. For example, you could specify PDO::SQLSRV_ENCODING_UTF8 to bind the column to a variable as a string encoded in UTF-8.
Return Value
TRUE on success, otherwise FALSE.
Remarks
When binding null data to server columns of type varbinary, binary, or varbinary(max) you should specify binary encoding (PDO::SQLSRV_ENCODING_BINARY) using the $driver_options. For more information about encoding constants, see Constants.
Support for PDO was added in version 2.0 of the Microsoft Drivers for PHP for SQL Server.
Parameter example
This code sample shows that after $contact is bound to the parameter, changing the value does change the value passed in the query.
prepare("select * from Person.ContactType where name = ?"); $stmt->bindParam(1, $contact); $contact = "Owner"; $stmt->execute(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) < print "$row[Name]\n\n"; >$stmt = null; $contact = "Sales Agent"; $stmt = $conn->prepare("select * from Person.ContactType where name = :contact"); $stmt->bindParam(':contact', $contact); $contact = "Owner"; $stmt->execute(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) < print "$row[Name]\n\n"; >?>
Output parameter example
This code sample shows how to access an output parameter.
prepare("select ? = count(*) from Sys.tables"); $stmt->bindParam(1, $input1, PDO::PARAM_STR, 10); $stmt->execute(); echo $input1; ?>
When binding an output parameter to a bigint type, if the value may end up outside the range of an integer, using PDO::PARAM_INT with PDO::SQLSRV_PARAM_OUT_DEFAULT_SIZE may result in a «value out of range» exception. Therefore, use the default PDO::PARAM_STR instead and provide the size of the resulting string, which is at most 21. It is the maximum number of digits, including the negative sign, of any bigint value.
Input/Output example
This code sample shows how to use an input/output parameter.
query("IF OBJECT_ID('dbo.sp_ReverseString', 'P') IS NOT NULL DROP PROCEDURE dbo.sp_ReverseString"); $dbh->query("CREATE PROCEDURE dbo.sp_ReverseString @String as VARCHAR(2048) OUTPUT as SELECT @String = REVERSE(@String)"); $stmt = $dbh->prepare("EXEC dbo.sp_ReverseString ?"); $string = "123456789"; $stmt->bindParam(1, $string, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 2048); $stmt->execute(); print $string; // Expect 987654321 ?>
It is recommended to use strings as inputs when binding values to a decimal or numeric column to ensure precision and accuracy as PHP has limited precision for floating point numbers. The same applies to bigint columns, especially when the values are outside the range of an integer.
Decimal input example
This code sample shows how to bind a decimal value as an input parameter.
prepare("INSERT INTO TestTable (DecimalCol) VALUES (?)"); // by default it is PDO::PARAM_STR, rounding of a large input value may // occur if PDO::PARAM_INT is specified $stmt->bindParam(1, $input, PDO::PARAM_STR); $stmt->execute();
PDOStatement::bindParam
Связывает PHP переменную с именованным или неименованным параметром подготавливаемого SQL запроса. В отличие от PDOStatement::bindValue() , переменная привязывается по ссылке, и ее значение будет вычисляться во время вызова PDOStatement::execute() .
В большинстве случаев в подготавливаемых запросах используются только входные параметры, то есть при построении запроса доступ к ним осуществляется только в режиме чтения. Тем не менее, некоторые драйверы позволяют запускать хранимые процедуры, которые, в свою очередь, могут возвращать данные посредством выходных параметров. Зачастую, такие параметры используются одновременно как входные и как выходные.
Список параметров
Идентификатор параметра. Для подготавливаемых запросов с именованными параметрами это будет имя в виде :name . Если используются неименованные параметры (знаки вопроса ?) это будет позиция псевдопеременной в запросе (начиная с 1).
Имя PHP переменной, которую требуется привязать к параметру SQL запроса.
Явно заданный тип данных параметра. Тип задается одной из констант PDO::PARAM_*. Если параметр используется в том числе для вывода информации из хранимой процедуры, к значению аргумента data_type необходимо добавить PDO::PARAM_INPUT_OUTPUT, используя оператор побитовое ИЛИ.
Размер типа данных. Чтобы указать, что параметр используется для вывода данных из хранимой процедуры, необходимо явно задать его размер.
Возвращаемые значения
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Примеры
Пример #1 Выполнение подготовленного запроса с именованными псевдопеременными
/* Выполнение запроса с привязкой PHP переменных */
$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 ();
?>?php
Пример #2 Выполнение подготовленного запроса с неименованными псевдопеременными (?)
/* Выполнение запроса с привязкой PHP переменных */
$calories = 150 ;
$colour = ‘red’ ;
$sth = $dbh -> prepare ( ‘SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?' );
$sth -> bindParam ( 1 , $calories , PDO :: PARAM_INT );
$sth -> bindParam ( 2 , $colour , PDO :: PARAM_STR , 12 );
$sth -> execute ();
?>?php
Пример #3 Вызов хранимой процедуры с INOUT параметром
/* Вызов хранимой процедуры с INOUT параметром */
$colour = ‘red’ ;
$sth = $dbh -> prepare ( ‘CALL puree_fruit(?)’ );
$sth -> bindParam ( 1 , $colour , PDO :: PARAM_STR | PDO :: PARAM_INPUT_OUTPUT , 12 );
$sth -> execute ();
print( «After pureeing fruit, the colour is: $colour » );
?>?php
Смотрите также
- PDO::prepare() — Подготавливает запрос к выполнению и возвращает ассоциированный с этим запросом объект
- PDOStatement::execute() — Запускает подготовленный запрос на выполнение
- PDOStatement::bindValue() — Связывает параметр с заданным значением
Подготовленные запросы
Подготовленные запросы рекомендуется использовать вместо обычных запросов, потому что подготовленный запрос — это уже готовое, скомпилированное выражение к которому можно обращаться многократно просто передавая необходимые параметры.
Эти запросы работают намного быстрее и намного безопаснее , особенно, если в запросах используются условия с передаваемыми параметрами.
То есть, подготовленные запросы обеспечивают очень высокую безопасность от sql-инъекций.
Запрос на выборку данных :
Выбрать все из таблицы news , где id = 2 .
Обычно параметр id передается из вне, поэтому создадим переменную $id и в ней будем хранить передаваемые данные (в данном случае — 2).
Данный параметр мы получаем, например, из формы: формы авторизации, формы регистрации и т.д.
И, соответственно, этот параметр попадет в запрос ( id = ‘$id’ ).
С помощью стандартного метода query() выполняем запрос и распечатываем его на экран, используя метод fetchAll() .
$id = 2 ;
$sql = «SELECT id, title FROM news WHERE >$id ‘» ;
$result = $pdo -> query ( $sql );
print_r ( $result -> fetchAll ( PDO :: FETCH_ASSOC ));
После выполнения запроса получим:
Успешное подключение
Array ( [0] => Array ( [id] => 2 [title] => Новость 2 ) )
— все успешно работает, но данный код не безопасен .
Чтобы обеспечить безопасность от sql-инъекций будем использовать подготовленное выражение .
Неименованный плейсхолдер
Определив некий sql-запрос, в качестве параметра указываем метку — ? (вопросительный знак) — так называемый неименованный плэйсхолдер (placeholder — заполнитель).
Этим мы как бы указываем, что здесь должен быть указан некий параметр.
Затем данное выражение мы должны подготовить с помощью метода prepare() — то есть, указываем объекту PDO, что необходимо подготовить данное выражение.
Данный запрос будет скомпилирован, подготовлен и будет ждать своего выполнения
Далее, при необходимости, мы можем выполнять некий код, а в конце скрипта мы можем выполнить данный запрос.
Чтобы выполнить запрос обращаемся к объекту PDOStatement ($result) и вызываем на исполнение метод execute()
Метод execute() — выполняет подготовленное выражение .
В качестве параметра метода execute() передаем массив:
— в качестве первой ячейки мы используем переменную, которую заменил плэйсхолдер , в нашем случае — $id .
$id = 2 ;
$sql = «SELECT id, title FROM news WHERE >;
$result = $pdo -> prepare ( $sql );
// При необходимости, здесь мы можем выполнять некий код .
$result -> execute ( array ( $id ));
print_r ( $result -> fetchAll ( PDO :: FETCH_ASSOC ));
После выполнения запроса получим:
Успешное подключение
Array ( [0] => Array ( [id] => 2 [title] => Новость 2 ) )
— после выполнения запроса в браузере ни чего не изменилось.
Данный запрос уже безопасен и ему не страшны sql-инъекции.
Именованный плейсхолдер
Вместо неименованных плейсхолдеров (?) можно использовать именованные плейсхолдеры (например, для нашего случая — :id) — то есть, мы явно указываем имя данного параметра.
А это значит, что при вызове метода execute(), в качестве параметра, мы уже передаем ассоциативный массив.
В качестве ячейки которого указываем ключ ‘id’ , а в качестве значения данной ячейки указываем параметр $id :
.
$sql = «SELECT id, title FROM news WHERE >;
.
$result -> execute ( array ( ‘id’ => $id ));
или (альтернативная запись для массива):
$result -> execute ([ ‘id’ => $id ]);
.
Связывание параметра запроса с некой переменной .
Метод bindParam()
Метод bindParam() привязывает параметр запроса (плэйсхолдер) к определенной переменной .
Первым параметром он принимает имя плэйсхолдера ( ‘:id’ ), а в качестве второго параметра — переменную ( $id ), к значению которой ( 2 ) будет привязан данный плэйсхолдер.
В качестве третьего параметра указываем тип данных, который будет передаваться в данный плэйсхолдер, в нашем случае — PDO::PARAM_INT (целочисленный тип данных).
.
$result -> bindParam ( ‘:id’ , $id , PDO :: PARAM_INT );
$result -> execute ();
.
try <
$pdo = new PDO ( ‘mysql:host=localhost;dbname=test2’;charset=utf-8 , ‘root’ , » );
$pdo -> setAttribute ( PDO :: ATTR_ERRMODE , PDO :: ERRMODE_EXCEPTION );
echo «Успешное подключение
» ;
> catch exit ( ‘Ошибка подключения:
‘ . $e -> getMessage ());
>
——- Без использования плэйсхолдера ———
$id = 2 ;
$sql = «SELECT id, title FROM news WHERE >$id ‘» ;
$result = $pdo -> query ( $sql );
print_r ( $result -> fetchAll ( PDO :: FETCH_ASSOC ));
$id = 2 ;
$sql = «SELECT id, title FROM news WHERE >;
$result = $pdo -> prepare ( $sql );
// При необходимости, здесь мы можем выполнять некий код .
$result -> execute ( array ( $id ));
print_r ( $result -> fetchAll ( PDO :: FETCH_ASSOC ));
$id = 2 ;
$sql = «SELECT id, title FROM news WHERE >;
$result = $pdo -> prepare ( $sql );
// При необходимости, здесь мы можем выполнять некий код .
$result -> execute ( array ( ‘id’ => $id ));
print_r ( $result -> fetchAll ( PDO :: FETCH_ASSOC ));
$id = 2 ;
$sql = «SELECT id, title FROM news WHERE >;
$result = $pdo -> prepare ( $sql );
// При необходимости, здесь мы можем выполнять некий код .
$result -> bindParam ( ‘:id’ , $id , PDO :: PARAM_INT );
$result -> execute ();
print_r ( $result -> fetchAll ( PDO :: FETCH_ASSOC ));
> catch exit ( ‘Ошибка в запросе:
‘ . $e -> getMessage ());
>
?>
Во всех случаях получим:
Успешное подключение
Array ( [0] => Array ( [id] => 2 [title] => Новость 2 ) )