Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.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 HY093选择计数错误_Php_Mysql_Pdo - Fatal编程技术网

PHP PDO HY093选择计数错误

PHP PDO HY093选择计数错误,php,mysql,pdo,Php,Mysql,Pdo,我一直在研究周围所有类似的问答,但我似乎找不到解决办法,因为我的头撞在墙上已经两天多了 我正在基于用户输入构建一个查询,所以我不打算发布所有的胡言乱语 假设$binds是这种类型的关联数组:查询完成并准备好后,绑定值的key=>val 这是类函数的一部分,仅显示生成查询后的部分: $stmt = $this->pdo->prepare($stmt); foreach($binds as $k => $v){ $col = explode('.',substr($k,1)

我一直在研究周围所有类似的问答,但我似乎找不到解决办法,因为我的头撞在墙上已经两天多了

我正在基于用户输入构建一个查询,所以我不打算发布所有的胡言乱语

假设$binds是这种类型的关联数组:查询完成并准备好后,绑定值的key=>val

这是类函数的一部分,仅显示生成查询后的部分:

$stmt = $this->pdo->prepare($stmt);
foreach($binds as $k => $v){
    $col = explode('.',substr($k,1));//because all keys start with ':' and some end with '.key'
    $col = $col[0];
    if($col == 'year'){
        $col = 'model_year';
    }
    $stmt->bindValue($k,$v,$this->tblInfo->pdo_param($col));//tblInfo is a class
    //holding an array with column names and types for the table i'm working with
    //and a function that returns PDO::PARAM_ type based on the column type
}
if($stmt->execute()){
    $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
return array('binds' => $binds,$stmt,'err' => $stmt->errorInfo(),'result' => $res);
这是函数的json_编码输出:

{
"binds": {
    ":make": "audi",
    ":model": "a4",
    ":year.1": "2013",
    ":price.1": "9990",
    ":gearbox.0": "auto",
    ":fuel.0": "diesel",
    ":mileage.0": "0",
    ":mileage.1": "350000"
},
"0": {
    "queryString": "SELECT COUNT(active) AS main FROM ads_auto WHERE active=true
 AND has_photo=true AND make=:make AND model=:model AND model_year <= :year.1 AND
price <= :price.1 AND gearbox=:gearbox.0 AND fuel=:fuel.0 AND mileage BETWEEN 
:mileage.0 AND :mileage.1"
},
"err": [
    "HY093",
    null,
    null
],
"result": null
}
很明显,$stmt->executeevals为FALSE,因此它不会抓取

$binds数组正好包含$stmt需要绑定的内容

我没有引用任何引号

我读到了有关计数和PDO的问题,所以我尝试了一个SELECT id而不是SELECT COUNT,但这没有什么区别,因为$stmt->execute为FALSE

为什么我要买HY093?我错过了什么


在InnoDB中使用PHP 5.5和MySQL 5.5。

因此,感谢@tadman的建议,我深入研究了PDO的源代码,似乎问题确实出在占位符名称上

根据解析器源代码:

BINDCHR=[:][a-zA-Z0-9_389;]+

占位符名称可以是字母数字+下划线,因此添加“.”点是不允许的


谢谢你的指点。现在一切正常。

燃油.0是有效的占位符名称吗?我以前从未见过这些参数。燃油、价格、变速箱和其他参数可以从用户端输入,例如:字符串、单值数组或多值数组。因此,对于数组,我将数组键添加到占位符名称中。老实说,我不知道在占位符名称中添加.1或.0是否合适。我把它改为_0或_1,但结果是一样的。
SQL: [245] SELECT COUNT(active) AS main FROM ads_auto WHERE active=true AND
has_photo=true AND make=:make AND model=:model AND model_year <= :year.1 AND 
price <= :price.1 AND gearbox=:gearbox.0 AND fuel=:fuel.0 AND mileage BETWEEN
:mileage.0 AND :mileage.1

Params:  8
Key: Name: [5]  :make      paramno=-1 name=[5]  ":make"      is_param=1 param_type=2
Key: Name: [6]  :model     paramno=-1 name=[6]  ":model"     is_param=1 param_type=2
Key: Name: [7]  :year.1    paramno=-1 name=[7]  ":year.1"    is_param=1 param_type=1
Key: Name: [8]  :price.1   paramno=-1 name=[8]  ":price.1"   is_param=1 param_type=1
Key: Name: [10] :gearbox.0 paramno=-1 name=[10] ":gearbox.0" is_param=1 param_type=2
Key: Name: [7]  :fuel.0    paramno=-1 name=[7]  ":fuel.0"    is_param=1 param_type=2
Key: Name: [10] :mileage.0 paramno=-1 name=[10] ":mileage.0" is_param=1 param_type=1
Key: Name: [10] :mileage.1 paramno=-1 name=[10] ":mileage.1" is_param=1 param_type=1