Странное поведение PDO в отношении параметров

Предисловие: Я постараюсь быть максимально тщательным, хотя я не уверен, что вся эта информация актуальна.

Я взаимодействую с базой данных MySQL (5.0.7 *) через PDO (PHP 5.3. *) Со следующими установленными атрибутами:

  • PDO :: ATTR_ERRMODE
  • PDO :: ERRMODE_EXCEPTION

Я использую таблицу базы данных, хранящую рейтинги, которая описывается так:

| Field      | Type        | Null | Key | Default           | Extra |
+------------+-------------+------+-----+-------------------+-------+
| userID     | varchar(32) | NO   | MUL |                   |       |
| articleID  | varchar(32) | NO   | MUL |                   |       |
| rating     | tinyint(2)  | NO   |     | 0                 |       |

Я делаю поиск по рейтингу на основе статьи и значения идентификатора пользователя:

SELECT rating FROM member_ratings WHERE userID = :uid AND articleID = :aid

Затем я устанавливаю именованные параметры по ссылке:

-> bindParam(':uid', $_COOKIE['userID']);
-> bindParam(':aid', $_POST['aid'], PDO::PARAM_INT);

проблема в то время как execute() функция возвращает trueпеременная, содержащая prepare функция возвращает false и вызывает что-то вроде -> rowCount() выдает ошибку, указывающую на ошибку PDO. Тем не менее, нет PDOException был брошен, и при этом -> errorInfo() предоставить что-либо, кроме ошибки 0000.

Запрос в реальном MySQL CLI возвращает фактическое значение, которое я ищу:

| rating |
+--------+
|      2 |

Что мне кажется наиболее интересным, так это то, что если я уберу любой из двух параметров из уравнения:

SELECT rating FROM member_ratings WHERE articleID = :aid
-> bindParam(':aid', $_POST['aid'], PDO::PARAM_INT);

SELECT rating FROM member_ratings WHERE userID = :uid
-> bindParam(':uid', $_COOKIE['userID']);

Я получаю множество результатов. Я не уверен, что это означает вообще. На данный момент мое решение таково:

-> prepare("SELECT uid FROM member_ratings WHERE userID = :uid AND articleID = " .
filter_var($_POST['aid'], FILTER_SANITIZE_NUMBER_INT))

Который возвращает правильное значение, когда я бросаю rowCount(), fetchObject() и так далее. Я пришел к такому выводу, как я знаю aid всегда должен быть целым числом, но идентификатор пользователя может быть буквенно-цифровым.

В дополнение к вышесказанному я попробовал:

  • Установка значений в качестве переменных перед их передачей
  • Пробовал без PDO::PARAM_INT
  • Использование параметров на основе 1 (?) Вместо именованных параметров (:)
  • Удаление моих атрибутов режима ошибки

Я не уверен, почему это терпит неудачу, и я также немного покопался (хотя я также не совсем уверен, что искать). С E_ALL я не получаю никаких ошибок вообще. Есть идеи?

редактировать

Кажется, что использование bindValue позволяет это работать, а использование bindParam — нет. Это означает, что я не могу использовать bindParam в полной мере:

http://php.net/manual/en/pdostatement.bindvalue.php#80285
http://php.net/manual/en/pdostatement.bindvalue.php#115510

Кто-нибудь знает почему?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]