Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关于参数的奇异PDO行为_Php_Mysql_Pdo_Parameters_Integer - Fatal编程技术网

Php 关于参数的奇异PDO行为

Php 关于参数的奇异PDO行为,php,mysql,pdo,parameters,integer,Php,Mysql,Pdo,Parameters,Integer,前言:我会尽可能详尽,尽管我不确定这些信息是否都相关 我正在通过PDO PHP 5.3*与MySQL数据库5.0.7*进行交互,设置了以下属性: PDO::ATTR_ERRMODE PDO::ERRMODE_异常 我正在使用一个存储评级的数据库表,如下所述: | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------

前言:我会尽可能详尽,尽管我不确定这些信息是否都相关

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

PDO::ATTR_ERRMODE PDO::ERRMODE_异常 我正在使用一个存储评级的数据库表,如下所述:

| 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,调用->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总是应该是一个整数,但用户ID可以是字母数字

除上述内容外,我还尝试过:

在传递值之前将值设置为变量 在没有PDO::PARAM_INT的情况下尝试了它 使用基于1的参数而不是命名参数: 删除我的错误模式属性 我不确定它为什么会失败,我也做了一些挖掘工作,虽然我也不确定要搜索什么。有了这些,我没有任何错误。有什么想法吗

编辑 似乎使用bindValue可以实现这一点,而使用bindParam则不行。这意味着我无法充分使用bindParam:


有人知道为什么吗?

嗯。您是否尝试过使用var的is_整数并进行强制转换?PhP可以强制转换变量,通常不需要,但值得一试。是否总是使用未命名的参数?除非您迫切需要使用命名参数。@marco mura,我实际上是在使用另一种方法来确定它是否为整数:ctype_digittrval$variable@david strachan它不适用于命名或未命名参数。你能解释一下为什么吗?为什么不使用php标准代码。。。是_integer$var吗?@MarcoMura,ctype_digit的文档表明它检查所提供字符串text中的所有字符是否都是数字。与strval相结合,strval对作为字符串传入的内容求值,即使返回函数没有将其强制转换为整数,也可以确定它是否为整数。不幸的是,即使我使用了is_integer,它也不能解决原来的问题。