PDO bindParam/Значение не работает
Я пытаюсь заставить страницу запроса базы данных работать, но, похоже, это не так.
мой код до сих пор (здесь я попробовал bindValue, но ранее попробовал bindParam и получил тот же результат):
Результат печати и $ stmt приносит следующие результаты:
пустой объект PDOStatement ([queryString] => SELECT: columName FROM: tblName Где: valueName =: specificValue)
Что я сделал не так? Что я могу попытаться заставить его работать? Я новичок во всей кодировке, поэтому, пожалуйста, спросите, не забыл ли я код или другую важную информацию! Благодарю!
Параметры заполнитель могут представлять только значения VALUES в запросе. Таблицы, имена полей, ключевые слова sql и т.д. — все это невозможно использовать заполнители.
Если вам нужно построить динамический запрос и заменить имена полей/таблиц, тогда вам придется использовать старые старые методы построения строк, и имейте в виду, что вы снова откроете себе атаки SQL-инъекций:
Боюсь, вам нужно переосмыслить, как работают параметризованные запросы. Это не просто случай волшебного вложения данных безопасным способом. Это касается размывания структуры запроса и данных.
Таким образом, имя базы данных, имена столбцов, имена таблиц и любые ключевые слова SQL являются частью структуры запроса. Каждый раз, когда вы запускаете запрос, они будут одинаковыми.
Однако данные могут меняться между запуском запроса.
Таким образом, структура должна быть на месте, когда запрос будет подготовлен. Тем не менее, вы, очевидно, не можете просто $columName переменную $columName т.д. В запрос для SQL-инъекций. Если вам действительно нужны гибкие запросы, подобные этому (nb, которого вы, вероятно, нет), вам нужно создать белый список допустимых значений, либо в вашем коде, либо получить из базы данных.
Ваш запрос недействителен (вы используете параметры для идентификаторов объектов), но вы не получаете никаких уведомлений, потому что вы не настроили PDO для исключения исключений и не вызываете функции проверки ошибок вручную.
Добавьте PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION в конструктор PDO:
Как только вы это сделаете, вы получите быстрое исключение по конкретной проблеме, например:
PDOException: SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MySQL, для правильного синтаксиса для использования рядом с » user ‘Где’ login ‘=’ john » в строке 1 в [. ]
Как вы можете видеть, это пытается запустить запрос, например (например):
Кроме того, будьте осторожны с SQL-инъекцией. Это ужасно опасно для составления SQL-запросов с использованием данных из $_POST .
Источник
PDO — bindParam не работает
Я создаю класс PDO для использования в своих проектах, но поскольку я новичок в этом, я не могу привязать параметры к подготовленному оператору sql без каких-либо ошибок. Вот функция, которая предназначена для этого:
И подготовленный оператор sql:
Может ли кто-нибудь указать мне правильное направление? На этом этапе запрос не вызывает ошибок. Обратите внимание, что я предполагаю, что проблема здесь, хотя это может и не быть, поскольку я использую только bindParam () и prepare ().
изменить — код триггера
2 ответа
Как уже упоминалось в @YourCommonSense, необработанный интерфейс PDO немного понятнее, однако проблема, вероятно, связана с использованием функции PDOStatement::bindParam() вместо PDOStatement::bindValue() .
Разница между ними в том, что первый принимает ссылку на переменную, которая постоянно перезаписывается в вашем цикле foreach , а последний принимает фактическое значение переменной.
Если вам нужен более удобный интерфейс подключения к базе данных, почему бы вам не попробовать Doctrine DBAL?
Просто избавьтесь от этой функции, в PDO она уже есть
Это весь код, который вам нужен (при условии, что выполнение вашего класса является обычным выполнением PDO)
Или, чтобы сделать это в сыром PDO:
Итак, похоже, вашему классу требуется больше кода, чем необработанному PDO. Вы действительно уверены, что вам вообще нужен этот урок?
Источник
Не работает bindParam ( PDO )
Доброго времени суток. Возникла проблема с bindParam. Он тупо не работает
код файла index.php
Фишка в том, что если в запросе вместо :id написать 1, то все гуд, выводит запись.
Добавлено через 11 минут
решение найдено, нужно было убрать кавычки в запросе ‘:id’
Помощь в написании контрольных, курсовых и дипломных работ здесь.
вот весь мой код: $id = $pdo->quote($_POST);// вот тут косяк, если сделать так: $id =$_POST;.
PDO: bindParam и bindValue
Добрый вечер! Уже полдня бьюсь вот с этим: $queryStr = «SELECT product_num, label, price.
PDO, разница bindParam и bindValue
Используется библиотека PDO. Вопросы следующие: 1) В чем разница между этим $sth =.
Не работает PDO::prepare
Не заполняется таблица.Подскажите пожалуйста в чем беда??((Ошибку не выдает-просто пустая таблица и.
[PDO] Не работает чтение\запись в бд
Идея проста: на сайте нет регистрации, но пользователю присваивается порядковый номер. Иначе как.
Здравствуйте. Помогите, пожалуйста, разобраться, почему не работает функция, выполняющая insert.
BindParam не срабатывает в IN
Здравствуйте Не получается вставить в IN через bindParam значение. В $ids содержится 7.
Источник
PDOStatement::bindParam
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDOStatement::bindParam — Привязывает параметр запроса к переменной
Описание
Связывает переменную PHP с именованным или неименованным параметром подготавливаемого SQL-запроса. В отличие от PDOStatement::bindValue() , переменная привязывается по ссылке и её значение будет вычисляться во время вызова PDOStatement::execute() .
В большинстве случаев в подготавливаемых запросах используются только входные параметры, то есть при построении запроса доступ к ним осуществляется только в режиме чтения (возможно приведение в соответствии с type ). Тем не менее, некоторые драйверы позволяют запускать хранимые процедуры, которые, в свою очередь, могут возвращать данные посредством выходных параметров. Зачастую, такие параметры используются одновременно как входные и как выходные.
Список параметров
Идентификатор параметра. Для подготавливаемых запросов с именованными параметрами это будет имя в виде :name . Если используются неименованные параметры (знаки вопроса ?) это будет позиция псевдопеременной в запросе (начиная с 1).
Имя переменной PHP, которую требуется привязать к параметру SQL-запроса.
Явно заданный тип данных параметра. Тип задаётся одной из констант PDO::PARAM_* . Если параметр используется в том числе для вывода информации из хранимой процедуры, к значению аргумента 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:
// Get the keyword from query string
$keyword = $_GET [ ‘keyword’ ];
// Prepare the command
$sth = $dbh -> 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:
= 1 ;
var_dump ( $active );
$ps -> 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.
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.
( LC_ALL , ‘pl_PL’ );
$sth = $dbh -> prepare ( ‘SELECT name FROM products WHERE price );
$sth -> bindParam ( ‘:price’ , 123.45 , PDO :: PARAM_STR );
$sth -> execute ();
// result:
// SELECT name FROM products WHERE price ?>
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.
= new PDO ( ‘sqlsrv:server=SQLSERVERNAME;Database=own_exchange’ , ‘user’ , ‘password’ );
$sql = «INSERT INTO dbo.files(file_name, file_source) VALUES(:file_name, :file_source)» ;
$stmt = $db -> 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 ();
?>
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.
Do not try to use the same named parameter twice in a single SQL statement, for example
= ‘SELECT * FROM some_table WHERE some_value > :value OR some_value ;
$stmt = $dbh -> 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.
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.
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:
= $GLOBALS [ ‘dbc’ ];
$sql = «SELECT * FROM `tbl_name` WHERE tbl_col LIKE ?» ;
$stmt = $dbc -> prepare ( $sql );
$value = «% < $value >%» ;
$stmt -> bindParam ( $i , $value , PDO :: PARAM_STR );
?>
Trying to use
-> bindParam ( $i , «% < $value >%» , PDO :: PARAM_STR );
?>
will fail.
A caution for those using bindParam() on a placeholder in a
LIKE ‘%. %’ clause, the following code will likely not work:
= «SELECT id, name FROM test WHERE name like ‘%:foo%'» ;
$s = «carrot» ;
$sth = $dbh -> prepare ( $q );
$sth -> bindParam ( ‘:foo’ , $s );
$sth -> execute ();
?>
What is needed is something like the following:
= «% $s %» ;
$sth -> bindParam ( ‘:foo’ , $s );
?>
This should work. Tested against mysql 4.1, PHP 5.1.3.
MySQL will return an error if a named placeholder has a hyphen in it:
UPDATE wardrobe SET `T-Shirt`=:T-SHIRT WHERE/>
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 >
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();
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:
Источник