Elettracompany.com

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php bind param

Разница между bindParam и bindValue в PHP

Функция PDOStatement :: bindParam ()

Функция PDOStatement :: bindParam () — это встроенная функция в PHP, которая используется для привязки параметра к указанному имени переменной. Эта функция связывает переменные, передает их значение в качестве входных данных и получает выходное значение, если оно есть, соответствующего маркера параметров.

Синтаксис:

Параметры: Эта функция принимает пять параметров, как указано выше и описано ниже:

  • $ параметр: это идентификатор параметра, который используется для подготовки оператора с использованием заполнителей имен. Это имя параметра формы: имя.
  • $ variable: этот параметр используется для хранения имени переменной для привязки к параметру оператора SQL.
  • $ data_type: это явный тип данных для параметра, использующий константы PDO :: PARAM_ *.
  • $ length: этот параметр используется для хранения длины типа данных.
  • $ driver_options: этот параметр содержит операцию, которую необходимо выполнить.

Возвращаемое значение: эта функция возвращает True в случае успеха или false в случае ошибки.

Программа:

// настройка соединения PDO

$db = new PDO( ‘mysql:host=localhost;dbname=geeks’ , ‘root’ , » );

// Получить имя пользователя

$stmt = $db ->prepare( «SELECT * FROM users WHERE user = :username» );

// Используем функцию bindParam

$stmt ->bindParam( ‘:username’ , $username );

Примечание. Оператор SQL будет выполняться с использованием «g4g» в качестве имени пользователя, поскольку: username ищет $ username после выполнения, а последнее известное значение $ username — «g4g».

PDOStatement :: bindValue () Функция

Функция PDOStatement :: bindValue () — это встроенная функция в PHP, которая используется для привязки значения к параметру. Эта функция связывает значение с соответствующим заполнителем именованного или вопросительного знака в SQL, который используется для подготовки оператора.

Синтаксис:

Параметры: эта функция принимает три параметра, как указано выше и описано ниже:

  • $ параметр: это идентификатор параметра, который используется для подготовки оператора с использованием заполнителей имен. Это имя параметра формы: имя.
  • $ value: этот параметр используется для хранения значения для привязки параметра.
  • $ data_type: это явный тип данных для параметра, использующий константы PDO :: PARAM_ *.

Возвращаемое значение: эта функция возвращает True в случае успеха или False в случае ошибки.

Программа:

// настройка соединения PDO

$db = new PDO( ‘mysql:host=localhost;dbname=geeks’ , ‘root’ , » );

// Получить имя пользователя

$stmt = $db ->prepare( «SELECT * FROM users WHERE user = :username» );

// Используем функцию bindValue

$stmt ->bindValue( ‘:username’ , $username );

Примечание. Оператор SQL будет выполняться с использованием «g4g» в качестве имени пользователя, поскольку буквенное значение «geeksforgeeks» было привязано к: username до функции bindValue (). Дальнейшие изменения в $ username не будут отражены в подготовленном утверждении.

Разница между bindParam () и bindValue ():

  1. bindParam ():
    1. Функция bindParam () привязывает параметр к заполнителю именованного или вопросительного знака в операторе SQL.
    2. Функция bindParam () используется для передачи переменной, а не значения .
  2. bindValue ():
    1. Функция bindValue () связывает значение с именованным или вопросительным знаком в операторе SQL.
    2. Функция bindValue () используется для передачи как значения, так и переменной .

PDOStatement::bindParam

(PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)

PDOStatement::bindParam — Привязывает параметр запроса к переменной

Описание

Связывает переменную PHP с именованным или неименованным параметром подготавливаемого SQL-запроса. В отличие от PDOStatement::bindValue() , переменная привязывается по ссылке и ее значение будет вычисляться во время вызова PDOStatement::execute() .

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

Список параметров

Идентификатор параметра. Для подготавливаемых запросов с именованными параметрами это будет имя в виде :name . Если используются неименованные параметры (знаки вопроса ?) это будет позиция псевдопеременной в запросе (начиная с 1).

Имя переменной PHP, которую требуется привязать к параметру SQL-запроса.

Явно заданный тип данных параметра. Тип задается одной из констант PDO::PARAM_*. Если параметр используется в том числе для вывода информации из хранимой процедуры, к значению аргумента data_type необходимо добавить PDO::PARAM_INPUT_OUTPUT, используя оператор побитовое ИЛИ.

Размер типа данных. Чтобы указать, что параметр используется для вывода данных из хранимой процедуры, необходимо явно задать его размер.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Примеры

Пример #1 Выполнение подготовленного запроса с именованными псевдопеременными

Пример #2 Выполнение подготовленного запроса с неименованными псевдопеременными (?)

Пример #3 Вызов хранимой процедуры с INOUT-параметром

Смотрите также

  • PDO::prepare() — Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
  • PDOStatement::execute() — Запускает подготовленный запрос на выполнение
  • PDOStatement::bindValue() — Связывает параметр с заданным значением

User Contributed Notes 23 notes

I know this has been said before but I’ll write a note on it too because I think it’s important to keep in mind:

If you use PDO bindParam to do a search with a LIKE condition you cannot put the percentages and quotes to the param placeholder ‘%:keyword%’.

This is WRONG:
«SELECT * FROM `users` WHERE `firstname` LIKE ‘%:keyword%'»;

The CORRECT solution is to leave clean the placeholder like this:
«SELECT * FROM `users` WHERE `firstname` LIKE :keyword»;

And then add the percentages to the php variable where you store the keyword:
$keyword = «%».$keyword.»%»;

And finally the quotes will be automatically added by PDO when executing the query so you don’t have to worry about them.

So the full example would be:
prepare ( ‘SELECT * FROM `users` WHERE `firstname` LIKE :keyword’ );
// Put the percentage sing on the keyword
$keyword = «%» . $keyword . «%» ;
// Bind the parameter
$sth -> bindParam ( ‘:keyword’ , $keyword , PDO :: PARAM_STR );
?>

Note that when using PDOStatement::bindParam an integer is changed to a string value upon PDOStatement::execute(). (Tested with MySQL).

This can cause problems when trying to compare values using the === operator.

Example:
bindParam ( «:active» , $active , PDO :: PARAM_INT );
var_dump ( $active );
$ps -> execute ();
var_dump ( $active );
if ( $active === 1 ) <
// do something here
// note: this will fail since $active is now «1»
>
?>

results in:
int(1)
int(1)
string(1) «1»

There seems to be some confusion about whether you can bind a single value to multiple identical placeholders. For example:

$sql = «SELECT * FROM user WHERE is_admin = :myValue AND is_deleted = :myValue «;

$params = array(«myValue» => «0»);

Some users have reported that attempting to bind a single parameter to multiple placeholders yields a parameter mismatch error in PHP version 5.2.0 and earlier. Starting with version 5.2.1, however, this seems to work just fine.

SQL Server 2008 R2

If this was in the documentation, I didn’t stumble across it. When using bound output parameters with a stored procedure, the output parameters are updated AFTER the LAST rowset has been processed.

If your stored procedure does not return any rowsets (no SELECT statements) then you are set, your output parameters will be ready as soon as the stored procedure is processed.

Otherwise you need to process the rows, and then:
nextRowset (); ?>

Once that is done for each returning rowset you will have access to the output parameters.

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. See Constants for more information about encoding constants.
Support for PDO was added in version 2.0 of the Microsoft Drivers for PHP for SQL Server.

prepare ( $sql );
$stmt -> bindParam ( «:file_name» , $files -> name , PDO :: PARAM_STR );
$stmt -> bindParam ( «:file_source» , file_get_contents ( $files -> tempName ), PDO :: PARAM_LOB , 0 , PDO :: SQLSRV_ENCODING_BINARY );
$stmt -> execute ();
?>

Читать еще:  Натуральный логарифм matlab

if you are storing files (or binary data), using PARAM_LOB (and moreover trying to do this with Oracle), don’t miss this page :

You will there notice that PDO-PGSQL and PDO-OCI don’t work the same at all : not the same argument nor the same behaviour.

Please note, that PDO format numbers according to current locale. So if, locale set number format to something else, that standard that query WILL NOT work properly.

For example:
in Polish locale (pl_PL) proper decimal separator is coma («,»), so: 123,45, not 123.45. If we try bind 123.45 to the query, we will end up with coma in the query.

prepare ( ‘SELECT name FROM products WHERE price bindParam ( ‘:price’ , 123.45 , PDO :: PARAM_STR );
$sth -> execute ();
// result:
// SELECT name FROM products WHERE price

Do not try to use the same named parameter twice in a single SQL statement, for example

:value OR some_value prepare ( $sql );
$stmt -> execute ( array( ‘:value’ => 3 ) );
?>

. this will return no rows and no error — you must use each parameter once and only once. Apparently this is expected behavior (according to this bug report: http://bugs.php.net/bug.php?id=33886) because of portability issues.

Took me forever to find this elsewhere in the notes in the manual, so I’d thought I’d put this tidbit here to help others in the future.

When using a LIKE search in MySQL along with a prepared statement, the *value* must have the appropriate parentheses attached before the bindParam() statement as such:

$value = «% < $value >%» ;
$stmt -> bindParam ( $i , $value , PDO :: PARAM_STR );
?>

Trying to use
bindParam ( $i , «% < $value >%» , PDO :: PARAM_STR );
?>

Note that with bindParam the second parameter is passed by reference. This means that the following will produce a warning if E_STRICT is enabled:

bindParam ( ‘type’ , $object -> getType ());

// Strict Standards: Only variables should be passed by reference in /path/to/file.php on line 123
?>

If the second parameter is not an actual variable, either set the result of $object->getType(); to a variable and use that variable in bindParam or use bindValue instead.

MySQL will return an error if a named placeholder has a hyphen in it:
UPDATE wardrobe SET `T-Shirt`=:T-SHIRT WHERE id=:id

Will return the following error: PDOException’ with message ‘SQLSTATE[HY093]: Invalid parameter number: parameter was not defined’

To resolve, just remove hyphens from named placeholders:
UPDATE wardrobe SET `T-Shirt`=:TSHIRT WHERE id=:id

A caution for those using bindParam() on a placeholder in a
LIKE ‘%. %’ clause, the following code will likely not work:

prepare ( $q );
$sth -> bindParam ( ‘:foo’ , $s );
$sth -> execute ();
?>

What is needed is something like the following:

This should work. Tested against mysql 4.1, PHP 5.1.3.

The documentation says this about the length parameter for bindParam:

«To indicate that a parameter is an OUT parameter from a stored procedure, you must explicitly set the length. «

For db2, I found that setting the length for the «INPUT_OUTPUT» parameters causes a problem for varchar parameters that are input parameters. The problem I found is that the stored procedure was called, but varchar input parameters were set to null inside my stored procedure and as a result, the stored procedure could not work properly.

Here is the signature for my stored procedure:

CREATE OR REPLACE PROCEDURE MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME ( IN RUN_ID INTEGER,IN V_SCHEMA_NAME VARCHAR(128),
OUT out_rc INTEGER,OUT out_err_message VARCHAR(100),OUT out_sqlstate CHAR(5) ,OUT out_sqlcode INT)

Here is the php code that works:

$command = «Call MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME (. )»;
$stmt = $this->GuestDb->prepare($command);
$stmt->bindParam(1, $RUN_ID, PDO::PARAM_INT);
$stmt->bindParam(2, $V_SCHEMA_NAME, PDO::PARAM_STR);
$stmt->bindParam(3, $V_TABNAME, PDO::PARAM_STR);
$stmt->bindParam(4, $out_rc, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(5, $out_err_message, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(6, $out_sqlstate, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(7, $out_sqlcode, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);

Here is the php code that does not work:

$command = «Call MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME (. )»;
$stmt = $this->GuestDb->prepare($command);
$stmt->bindParam(1, $RUN_ID, PDO::PARAM_INT,12);
$stmt->bindParam(2, $V_SCHEMA_NAME, PDO::PARAM_STR,128);
$stmt->bindParam(3, $V_TABNAME, PDO::PARAM_STR,100);
$stmt->bindParam(4, $out_rc, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,12);
$stmt->bindParam(5, $out_err_message, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,100);
$stmt->bindParam(6, $out_sqlstate, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,6);
$stmt->bindParam(7, $out_sqlcode, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,12);

Spent all day banging my head against a brick wall.

Tried to use INOUT or OUT and getting the return variable into PHP using Mysql v5.5.16 on XAMPP.

«MySQL doesn’t supporting binding output parameters via its C API. You must use SQL level variables:»

prepare ( «CALL sp_mysp(:Name, :Email, @sp_result)» );

$outputArray = $db -> query ( «select @sp_result» )-> fetch ( PDO :: FETCH_ASSOC );
?>

So the ‘workaround’ for Mysql and PDO is to use two SQL calls.

Hope this helps someone.

Here’s how to build a dynamic WHERE LIKE at run time when the user can submit n keywords

В чем разница между bindParam и bindValue?

8 ответов

ответ находится в документации для bindParam :

В отличие от PDOStatement::bindValue(), переменная привязана как ссылка и будет оцениваться только во время вызова PDOStatement::execute ().

вызов PDOStatement::bindParam() для привязки переменных PHP к маркерам параметров: связанные переменные передают свое значение как входное и получают выходное значение, если таковое имеется, связанных с ними маркеров параметров

С bindParam ] В отличие от PDOStatement::bindValue() , переменная привязана как ссылка и будет оцениваться только в то время, когда PDOStatement::execute() называется.

вот некоторые, о которых я могу думать :

  • С bindParam , вы можете передавать только переменные; не значения
  • С bindValue , вы можете передать оба (значения, очевидно, и переменные)
  • bindParam работает только с переменными, потому что он позволяет параметры, которые будут даны в качестве ввода/вывода, по «ссылке» (и значение не является допустимой «ссылкой» в PHP) : это полезно с драйверами, что (цитирую инструкцию) :

поддержка вызова сохраненных процедуры, возвращающие данные в качестве выходных данных параметры, и некоторые также как параметры ввода / вывода, которые оба отправляют в данных и обновляются, чтобы получить его.

С некоторыми движками БД хранимые процедуры могут иметь параметры, которые могут использоваться как для ввода (предоставление значения из PHP в процедуру), так и для вывода (возврат значения из сохраненного proc в PHP); для привязки этих параметров вы должны использовать bindParam, а не bindValue.

для наиболее общей цели, вы должны использовать bindValue .

bindParam имеет два сложных или неожиданных поведения:

  • bindParam(‘:foo’, 4, PDO::PARAM_INT) не работает, так как требует передачи переменной (в качестве ссылки).
  • bindParam(‘:foo’, $value, PDO::PARAM_INT) изменится $value в строке после запуска execute() . Это, конечно, может привести к тонким ошибкам, которые могут быть трудно поймать.

использовать bindParam чтобы вставить несколько строк с одной привязкой:

вам больше не нужно бороться, когда есть способ lilke это:

самый простой способ поставить его (с точки зрения PHP):

ключевое различие между двумя методами, которое можно прочитать из documention для bindParam(), как переменная параметра передается в вызове процедуры.

метод bindParam () свяжет маркер параметра с именем переменной PHP, которая будет содержать выходное значение, а не само значение. Кроме того, его значение оценивается только во время вызова PDOStatement::execute ().

. переменная привязана в качестве ссылки и будет оцениваться только во время вызова PDOStatement::execute ().

для сравнения, метод bindValue() будет привязывать маркер параметра к значению переменной PHP, на которую он ссылается, и поэтому сразу доступен во время вызова PDOStatement::execute ().

важно отметить, что при использовании метода bindParam (), если ваш параметр является параметром OUT, это означает, что он привязывается к переменной, которая получает свое значение из хранимой процедуры необходимо явно задать длину, как указано в документация по параметру длины:

длина

длина типа данных. Чтобы указать, что параметр является параметром OUT хранимой процедуры, необходимо явно задать длину.

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

Читать еще:  Matlab help на русском

PHP PDO::bindParam () типы данных.. как это работает?

Мне интересно, для чего используется объявление типа данных в bindParam() (или bindValue() ).

Я имею в виду, я думал, что если я определяю целочисленный аргумент ( PDO::PARAM_INT ), аргумент должен быть преобразован в целое число, что-то вроде

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

Порывшись в Интернете, я нашел это в архиве php.net:

В настоящее время я работаю над PDO. Именно так о функции bindParam(). Третий параметр data_type кажется здесь чтобы принудительно ввести тип значения ? Но когда я пытаюсь :

Я ожидал получить либо a PHP ошибка или интергер в моей базе данных. Но в моем БД у меня есть :

22 Testarossa Ferrari 23 250 GTO Феррари

Это значит, что ничего не изменится, если я есть третий параметр или нет. Или возможно, я что-то упускаю. Может кто-нибудь Толе мне больше нравится ? Или просто может кто-то сказал мне, где я могу найти информацию об этом.

Это именно моя ситуация. Где мои мысли идут не так, как надо?

4 Ответов

В других фреймворках абстракции DB на других языках он может использоваться для таких вещей, как проверка правильности экранирования встроенных значений (для драйверов, которые не поддерживают правильные привязанные параметры) и повышение эффективности сети за счет обеспечения правильной упаковки чисел в двоичном формате (учитывая поддержку протокола). Похоже, что в PDO году это не так уж много делает.

Итак, если вы говорите, что это STR (или если вы вообще ничего не говорите, так как это значение по умолчанию), и ваш внутренний тип данных-double, то он превратит его в строку с помощью одного метода, если это не double, то он преобразует его в строку с помощью другого метода.

Если вы говорите, что это int, но на самом деле это bool, то он преобразует его в long.

Если вы скажете, что это bool, но на самом деле это число, то он преобразует его в истинное булево значение.

Это действительно все, что я видел (быстро), глядя на источник stmt, я представляю, как только вы передадите параметры в драйвер, они могут сделать дополнительную магию. Таким образом, я бы предположил, что все, что вы получаете, — это немного делать правильно и очень много двусмысленности поведения и различий между водителями.

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

static int really_register_bound_param в ext/pdo/pdo_stmt.c на строке 329 версии 5.2.9

Это преобразования, которые выполняет PDO во время привязки.

  • PDO::PARAM_STR преобразует все, что вы ему даете, в строку, кроме null.
  • PDO::PARAM_INT преобразует значений в лонги
  • PDO::PARAM_BOOL преобразует стремится на рисовые шарики

Вот и все. Ничто другое не преобразуется. PDO использует флаги PARAM для форматирования SQL, а не для приведения типов данных.

Существует по крайней мере один эффект, который PDO::PARAM_INT оказывает на запросы INSERT : логические значения преобразуются в 0 или 1. Как в

Я попробовал то же самое с BindValue и получил тот же результат, так что поведение, которое вы видите, не ограничивается bindParam.

Похожие вопросы:

Я пробую PDO в PHP в первый раз. Я думал, что PDOStatement->bindParam() будет отличным способом установить типы данных значений, которые я передаю в запрос sql. Но почему-то это не работает для.

У меня возникли проблемы с получением bindParam для работы внутри цикла foreach. Если я использую bindParam вне цикла или жестко закодировать значения в запрос sql все работает отлично. В.

У меня есть проблема с параметрами привязки PDO, параметры, которые установлены, не помещаются в запрос, когда он выполняется в базе данных. Я был свидетелем этого, получив MySQL для регистрации.

У меня возникли проблемы с PDO утверждениями для ODBC. Я использую SQL SERVER 7 в Windows Server 2003 и PHP 5.4.x Например: У меня есть запрос: (это не фактический запрос, но он подходит для.

У меня возникли проблемы с привязкой param или value, кто-нибудь знает, что не так? Если я изменюсь ? в области он работает :-$ $item = ‘area’; $query = dbConnectionPDO::getConnect()->prepare( ‘.

Даже после прочтения всех вопросов PDO Insert not working на S.O, я все еще не могу понять, что не работает в запросе PDO SQL. Хотелось бы иметь некоторую помощь по этому вопросу. $sql = INSERT INTO.

Я новичок в использовании запросов PHP PDO, и я пытаюсь обновить данные в базе данных, но это дает мне эту ошибку: Неустранимая ошибка: вызов функции-члена bindParam() на не-объекте Код, с которым у.

Мне кажется, я что-то упускаю. Я пытаюсь использовать разделитель : с bindParam, и мне это не удается. PHP: $te = ‘test’; $tesql = select charname from characters where username = :user;; $stmt =.

PDOStatement::bindParam

(PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)

PDOStatement::bindParam — Привязывает параметр запроса к переменной

Описание

Связывает PHP переменную с именованным или неименованным параметром подготавливаемого SQL запроса. В отличие от PDOStatement::bindValue() , переменная привязывается по ссылке, и ее значение будет вычисляться во время вызова PDOStatement::execute() .

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

Список параметров

Идентификатор параметра. Для подготавливаемых запросов с именованными параметрами это будет имя в виде :name . Если используются неименованные параметры (знаки вопроса ?) это будет позиция псевдопеременной в запросе (начиная с 1).

Имя PHP переменной, которую требуется привязать к параметру SQL запроса.

Явно заданный тип данных параметра. Тип задается одной из констант PDO::PARAM_*. Если параметр используется в том числе для вывода информации из хранимой процедуры, к значению аргумента data_type необходимо добавить PDO::PARAM_INPUT_OUTPUT, используя оператор побитовое ИЛИ.

Размер типа данных. Чтобы указать, что параметр используется для вывода данных из хранимой процедуры, необходимо явно задать его размер.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Примеры

Пример #1 Выполнение подготовленного запроса с именованными псевдопеременными

Пример #2 Выполнение подготовленного запроса с неименованными псевдопеременными (?)

Пример #3 Вызов хранимой процедуры с INOUT параметром

Смотрите также

  • PDO::prepare() — Подготавливает запрос к выполнению и возвращает ассоциированный с этим запросом объект
  • PDOStatement::execute() — Запускает подготовленный запрос на выполнение
  • PDOStatement::bindValue() — Связывает параметр с заданным значением

Коментарии

A caution for those using bindParam() on a placeholder in a
LIKE ‘%. %’ clause, the following code will likely not work:

prepare ( $q );
$sth -> bindParam ( ‘:foo’ , $s );
$sth -> execute ();
?>

What is needed is something like the following:

This should work. Tested against mysql 4.1, PHP 5.1.3.

Do not try to use the same named parameter twice in a single SQL statement, for example

:value OR some_value prepare ( $sql );
$stmt -> execute ( array( ‘:value’ => 3 ) );
?>

. this will return no rows and no error — you must use each parameter once and only once. Apparently this is expected behavior (according to this bug report: http://bugs.php.net/bug.php?id=33886) because of portability issues.

Took me forever to find this elsewhere in the notes in the manual, so I’d thought I’d put this tidbit here to help others in the future.

When using a LIKE search in MySQL along with a prepared statement, the *value* must have the appropriate parentheses attached before the bindParam() statement as such:

Читать еще:  Matlab график в логарифмическом масштабе

$value = «%<$value>%» ;
$stmt -> bindParam ( $i , $value , PDO :: PARAM_STR );
?>

Trying to use
bindParam ( $i , «%<$value>%» , PDO :: PARAM_STR );
?>

There seems to be some confusion about whether you can bind a single value to multiple identical placeholders. For example:

$sql = «SELECT * FROM user WHERE is_admin = :myValue AND is_deleted = :myValue «;

$params = array(«myValue» => «0»);

Some users have reported that attempting to bind a single parameter to multiple placeholders yields a parameter mismatch error in PHP version 5.2.0 and earlier. Starting with version 5.2.1, however, this seems to work just fine.

For details, see bug report 40417:
http://bugs.php.net/bug.php?id=40417

Note that when using PDOStatement::bindParam an integer is changed to a string value upon PDOStatement::execute(). (Tested with MySQL).

This can cause problems when trying to compare values using the === operator.

Example:
bindParam ( «:active» , $active , PDO :: PARAM_INT );
var_dump ( $active );
$ps -> execute ();
var_dump ( $active );
if ( $active === 1 ) <
// do something here
// note: this will fail since $active is now «1»
>
?>

results in:
int(1)
int(1)
string(1) «1»

if you are storing files (or binary data), using PARAM_LOB (and moreover trying to do this with Oracle), don’t miss this page :

You will there notice that PDO-PGSQL and PDO-OCI don’t work the same at all : not the same argument nor the same behaviour.

Note that you cannot mix named and positional parameters in one query:

prepare ( ‘SELECT * FROM employees WHERE name LIKE :name OR email LIKE ?’ );
$name = ‘John%’ ;
$email = ‘john%’ ;

$stmt -> bindParam ( ‘:name’ , $name );
$stmt -> bindParam ( 1 , $email );

Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters’ in .

Running PHP 5.3.2 on Linux x86-64

I know this has been said before but I’ll write a note on it too because I think it’s important to keep in mind:

If you use PDO bindParam to do a search with a LIKE condition you cannot put the percentages and quotes to the param placeholder ‘%:keyword%’.

This is WRONG:
«SELECT * FROM `users` WHERE `firstname` LIKE ‘%:keyword%'»;

The CORRECT solution is to leave clean the placeholder like this:
«SELECT * FROM `users` WHERE `firstname` LIKE :keyword»;

And then add the percentages to the php variable where you store the keyword:
$keyword = «%».$keyword.»%»;

And finally the quotes will be automatically added by PDO when executing the query so you don’t have to worry about them.

So the full example would be:
prepare ( ‘SELECT * FROM `users` WHERE `firstname` LIKE :keyword’ );
// Put the percentage sing on the keyword
$keyword = «%» . $keyword . «%» ;
// Bind the parameter
$sth -> bindParam ( ‘:keyword’ , $keyword , PDO :: PARAM_STR );
?>

This confused me for some time because it is never explicitly mentioned, but PDO will automagically encapsulate parameters for you, so a prepared query that is manually escaped like so:

«INSERT INTO table (column) VALUES (‘:value’);»

Will actually end up being double-quoted and can cause problems.

Please note, that PDO format numbers according to current locale. So if, locale set number format to something else, that standard that query WILL NOT work properly.

For example:
in Polish locale (pl_PL) proper decimal separator is coma («,»), so: 123,45, not 123.45. If we try bind 123.45 to the query, we will end up with coma in the query.

prepare ( ‘SELECT name FROM products WHERE price bindParam ( ‘:price’ , 123.45 , PDO :: PARAM_STR );
$sth -> execute ();
// result:
// SELECT name FROM products WHERE price

SQL Server 2008 R2

If this was in the documentation, I didn’t stumble across it. When using bound output parameters with a stored procedure, the output parameters are updated AFTER the LAST rowset has been processed.

If your stored procedure does not return any rowsets (no SELECT statements) then you are set, your output parameters will be ready as soon as the stored procedure is processed.

Otherwise you need to process the rows, and then:
nextRowset (); ?>

Once that is done for each returning rowset you will have access to the output parameters.

Spent all day banging my head against a brick wall.

Tried to use INOUT or OUT and getting the return variable into PHP using Mysql v5.5.16 on XAMPP.

«MySQL doesn’t supporting binding output parameters via its C API. You must use SQL level variables:»

prepare ( «CALL sp_mysp(:Name, :Email, @sp_result)» );

$outputArray = $db -> query ( «select @sp_result» )-> fetch ( PDO :: FETCH_ASSOC );
?>

So the ‘workaround’ for Mysql and PDO is to use two SQL calls.

Hope this helps someone.

Note that with bindParam the second parameter is passed by reference. This means that the following will produce a warning if E_STRICT is enabled:

bindParam ( ‘type’ , $object -> getType ());

// Strict Standards: Only variables should be passed by reference in /path/to/file.php on line 123
?>

If the second parameter is not an actual variable, either set the result of $object->getType(); to a variable and use that variable in bindParam or use bindValue instead.

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. See Constants for more information about encoding constants.
Support for PDO was added in version 2.0 of the Microsoft Drivers for PHP for SQL Server.

prepare ( $sql );
$stmt -> bindParam ( «:file_name» , $files -> name , PDO :: PARAM_STR );
$stmt -> bindParam ( «:file_source» , file_get_contents ( $files -> tempName ), PDO :: PARAM_LOB , 0 , PDO :: SQLSRV_ENCODING_BINARY );
$stmt -> execute ();
?>

MySQL will return an error if a named placeholder has a hyphen in it:
UPDATE wardrobe SET `T-Shirt`=:T-SHIRT WHERE id=:id

Will return the following error: PDOException’ with message ‘SQLSTATE[HY093]: Invalid parameter number: parameter was not defined’

To resolve, just remove hyphens from named placeholders:
UPDATE wardrobe SET `T-Shirt`=:TSHIRT WHERE id=:id

The documentation says this about the length parameter for bindParam:

«To indicate that a parameter is an OUT parameter from a stored procedure, you must explicitly set the length. «

For db2, I found that setting the length for the «INPUT_OUTPUT» parameters causes a problem for varchar parameters that are input parameters. The problem I found is that the stored procedure was called, but varchar input parameters were set to null inside my stored procedure and as a result, the stored procedure could not work properly.

Here is the signature for my stored procedure:

CREATE OR REPLACE PROCEDURE MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME ( IN RUN_ID INTEGER,IN V_SCHEMA_NAME VARCHAR(128),
OUT out_rc INTEGER,OUT out_err_message VARCHAR(100),OUT out_sqlstate CHAR(5) ,OUT out_sqlcode INT)

Here is the php code that works:

$command = «Call MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME (. )»;
$stmt = $this->GuestDb->prepare($command);
$stmt->bindParam(1, $RUN_ID, PDO::PARAM_INT);
$stmt->bindParam(2, $V_SCHEMA_NAME, PDO::PARAM_STR);
$stmt->bindParam(3, $V_TABNAME, PDO::PARAM_STR);
$stmt->bindParam(4, $out_rc, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(5, $out_err_message, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(6, $out_sqlstate, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(7, $out_sqlcode, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);

Here is the php code that does not work:

$command = «Call MY_SCHEMA_NAME.MY_STORED_PROCEDURE_NAME (. )»;
$stmt = $this->GuestDb->prepare($command);
$stmt->bindParam(1, $RUN_ID, PDO::PARAM_INT,12);
$stmt->bindParam(2, $V_SCHEMA_NAME, PDO::PARAM_STR,128);
$stmt->bindParam(3, $V_TABNAME, PDO::PARAM_STR,100);
$stmt->bindParam(4, $out_rc, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,12);
$stmt->bindParam(5, $out_err_message, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,100);
$stmt->bindParam(6, $out_sqlstate, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT,6);
$stmt->bindParam(7, $out_sqlcode, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT,12);

For those who are confused on insert query using PDO-bindparam:

$sql = $db->prepare(«INSERT INTO db_fruit (id, type, colour) VALUES (? ,? ,?)»);

$sql->bindParam(1, $newId);
$sql->bindParam(2, $name);
$sql->bindParam(3, $colour);
$sql->execute();

Here’s how to build a dynamic WHERE LIKE at run time when the user can submit n keywords

Ссылка на основную публикацию
Adblock
detector