关于参数的奇怪PDO行为

时间:2014-11-14 07:49:28

标签: php mysql pdo parameters integer

前言:尽管我不确定所有这些信息是否相关,但我会尽量做到尽可能彻底。

我正在通过PDO(PHP 5.3。*)与MySQL数据库(5.0.7 *)进行交互,并设置了以下属性:

  • 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                 |       |

我正在根据文章和用户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
  • 的情况下尝试了
  • 使用基于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 个答案:

没有答案