簡體   English   中英

SELECT COUNT上的PHP PDO HY093錯誤

[英]PHP PDO HY093 error on SELECT COUNT

一直在研究所有類似的問答,但在將頭撞在牆上超過2天后,我似乎找不到解決方案。

我正在基於用戶輸入來構建查詢,所以我不會發布所有的巨型消息。

考慮完成查詢並准備好$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_encoded輸出:

{
"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
}

debugDumpParams()

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

顯然$stmt->execute()評估為FALSE因此無法獲取。

$binds數組完全包含$stmt需要綁定的內容。

我沒有使用任何引號。

我讀到有關COUNT()和PDO的問題,所以我嘗試使用SELECT id而不是SELECT COUNT ,但這沒什么區別,因為$stmt->execute()FALSE

為什么,為什么我會得到HY093? 我想念什么?

在InnoDB上使用PHP 5.5和MySQL 5.5。

因此,由於@tadman的建議,我深入研究了PDO的來源,看來該問題確實與占位符名稱有關。

根據解析器源代碼:

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

占位符名稱可以是字母數字+下划線,因此請添加“。”。 (點)為否。

感謝您的指導。 現在一切都好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM