2012-01-07 85 views
0

當試圖將參數綁定到PDO準備語句時,我得到非常令人沮喪的結果。PHP PDO BindParam/BindValue雙引號錯誤

結果出現此錯誤: 您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以在第1行的''項目'附近使用正確的語法。

錯誤清楚地表明,表'項目'在單獨引用時應引用'不要。我已經在下面進行了一些小測試。正如你所看到的,我並沒有把這些參數放在聲明中,這可能是大多數人最初的猜測。我知道它與BindParam/BindValue有關(我嘗試過使用相同的結果)函數,因爲如果通過將$ params設置爲null並在語句中用'items'替換':table'來繞過bindParams函數,它工作得很好。

<?php 

echo 'started test...'; 

//connect to database 

try { 
    $dbHandle = new PDO('mysql:dbname=mydatabase;host=mysql.mywebsite.com', 'myuser', 'mypass'); 
} catch (PDOException $e) { 
    echo 'Database connection failed: ' . $e->getMessage();  
} 

//print out the contents of table 'items' 

print_r(query("SELECT * FROM :table", array("table" => "items"), $dbHandle)); 

//the query() function used above 

function query($query_str, $params = null, $dbHandle) { 

    $stmt_obj = $dbHandle->prepare($query_str); 

    if($params != null) {   
     bindParams($stmt_obj, $params); 
    } 

    $stmt_obj->execute(); 

    //debug stuff 
    echo '<pre>'; 
    echo 'ERROR: '; 
    $error = $stmt_obj->errorInfo();   
    echo $error[2].'<br /><br />'; 
    echo 'DEBUG DUMP:<br />'; 
    $stmt_obj->debugDumpParams(); 
    echo '</pre>'; 

    if (preg_match("/SELECT/i", $query_str)) { 
     $result = array();  
     while ($row = $stmt_obj->fetch(PDO::FETCH_ASSOC)) {   
      array_push($result, $row); 
     } 
     unset($stmt_obj); 
     return $result; 
    } 

} 

function bindParams($stmt, $params) { 
    if(is_object($stmt) && ($stmt instanceof PDOStatement)) 
    {   
     foreach($params as $key => $value) 
     {    
      if(is_int($value)) { 
       $param = PDO::PARAM_INT; 
      } elseif(is_bool($value)) { 
       $param = PDO::PARAM_BOOL; 
      } elseif(is_null($value)) { 
       $param = PDO::PARAM_NULL; 
      } elseif(is_string($value)) { 
       $param = PDO::PARAM_STR; 
      } else { 
       $param = FALSE; 
      } 
      if($param) {               
       $stmt->bindValue(":$key", $value, $param);     
      } 
     } 
    } 

任何關心讓我擺脫我的痛苦,並指出真的很明顯,我失蹤的東西?

回答

0

準備語句中的符號只是值的佔位符,而不是標識符,因此您無法使用動態列或表名創建預準備語句。所有數據庫引用都需要在準備時解決。即使這不是真的,PDO/MySQL如何知道:table佔位符是爲了成爲文字還是標識符?他們有不同的引用規則。

此限制對於所有數據庫系統和所有API中的預準備語句都很常見。這當然不是一個PDO錯誤。

+0

哎呀,這顯然是我需要聽到的東西!乾杯! – Paul 2012-01-07 08:21:46