Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: передача параметров через pdo
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » передача параметров через pdo

Страниц (1): [1]
 

1. Perun - 07 Мая, 2020 - 14:56:43 - перейти к сообщению
В документации написано, что при наличии в запросе псевдопеременных нужно либо использовать связывание параметров через переменную/значение, либо же передавать входные данные прямо в execute. А отчего зависит это ИЛИ? И какая разница в использовании связывания параметров по значению или по переменной? Это связано только с тем, как представлен параметр - статически или динамически?
2. Мелкий - 07 Мая, 2020 - 15:34:54 - перейти к сообщению
execute подразумевает PDO::PARAM_STR.
Если вам этого недостаточно для запроса - понадобится bindParam/bindValue

Perun пишет:
какая разница в использовании связывания параметров по значению или по переменной?

Ну, как раз в том и разница: значение или ссылку на переменную даёте.
3. Perun - 07 Мая, 2020 - 16:34:31 - перейти к сообщению
Мелкий пишет:
Если вам этого недостаточно для запроса

Т.е., если значения параметров передаваемых в запросе должны быть отличными от типа string?

И вот это еще не очень понятно :
Цитата:
Тем не менее, некоторые драйверы позволяют запускать хранимые процедуры, которые, в свою очередь, могут возвращать данные посредством выходных параметров. Зачастую, такие параметры используются одновременно как входные и как выходные.

Какие например драйверы?
Хранимые процедуры пока что - темный лес...
4. Мелкий - 07 Мая, 2020 - 18:02:48 - перейти к сообщению
Perun пишет:
Т.е., если значения параметров передаваемых в запросе должны быть отличными от типа string?

То есть каноничный пример:
CODE (PHP):
скопировать код в буфер обмена
  1. $stmt = $pdo->prepare('select ... limit ?');
  2. $stmt->execute([$rowsCount]);

Может вести себя по разному в зависимости от драйвера и ATTR_EMULATE_PREPARES.
В частности, mysql может в итоге получить запрос с limit '10' вместо limit 10 и дать за это синтаксическую ошибку. Потому что по синтаксису здесь должно быть число, а не строка.
Или потому что вам понадобится PARAM_LOB или INOUT параметр - execute с этим не справится. Хотя в большинстве случаев execute будет достаточно.

Perun пишет:
Какие например драйверы?
Хранимые процедуры пока что - темный лес...

Ну вот когда понадобятся хранимые процедуры - тогда и будете узнавать как с INOUT параметрами этой СУБД работать из PHP.
Не имеет смысла заходить с обратной стороны и сначала выяснять для каких драйверов реализованы PARAM_INPUT_OUTPUT.

 

Powered by ExBB FM 1.0 RC1