Предисловие: Я постараюсь быть максимально тщательным, хотя я не уверен, что вся эта информация актуальна.
Я взаимодействую с базой данных MySQL (5.0.7 *) через PDO (PHP 5.3. *) Со следующими установленными атрибутами:
Я использую таблицу базы данных, хранящую рейтинги, которая описывается так:
| 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
Я не уверен, почему это терпит неудачу, и я также немного покопался (хотя я также не совсем уверен, что искать). С E_ALL я не получаю никаких ошибок вообще. Есть идеи?
Кажется, что использование bindValue позволяет это работать, а использование bindParam — нет. Это означает, что я не могу использовать bindParam в полной мере:
http://php.net/manual/en/pdostatement.bindvalue.php#80285
http://php.net/manual/en/pdostatement.bindvalue.php#115510
Кто-нибудь знает почему?
Задача ещё не решена.
Других решений пока нет …