前言:尽管我不确定所有这些信息是否相关,但我会尽量做到尽可能彻底。
我正在通过PDO(PHP 5.3。*)与MySQL数据库(5.0.7 *)进行交互,并设置了以下属性:
我正在使用存储评级的数据库表,如下所述:
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+-------------------+-------+
| userID | varchar(32) | NO | MUL | | |
| articleID | varchar(32) | NO | MUL | | |
| rating | tinyint(2) | NO | | 0 | |
我正在根据文章和用户ID值搜索评分:
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,并调用{{1}之类的内容}抛出一个错误,表明PDO已经出错了。但是,没有抛出-> rowCount()
,PDOException
也没有提供除0000错误以外的任何内容。
在实际的MySQL CLI中查询返回我正在搜索的实际值:
-> errorInfo()
我觉得最有趣的是,如果我从等式中删除这两个参数中的任何一个:
| 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()
总是应该是一个整数,但userID可能是字母数字。
除了上述内容,我还尝试过:
aid
我不确定它为什么会失败,我也做了一些挖掘(尽管我也不确定要搜索什么。)使用E_ALL我没有任何错误。有什么想法吗?
似乎使用bindValue允许它工作,而使用bindParam则不然。这意味着我无法在最大程度上使用bindParam:
http://php.net/manual/en/pdostatement.bindvalue.php#80285 http://php.net/manual/en/pdostatement.bindvalue.php#115510
有谁知道为什么?