2011-04-22 42 views
1

時返回false我有這樣的方法:PDO獲取

protected function _getByColumn($columnName, $value)                                             
{                                                          
     $sql = "SELECT * FROM $this->__tableName                                               
       WHERE :column = :value";                                                 
     $stmt = $this->__db->prepare($sql);                                                 
     $stmt->execute(array(':value' => $value, ':column' => $columnName));                                        
     $val=$stmt->fetch(PDO::FETCH_OBJ);                                                 
     var_dump($val); //getting boolean false 


} 

我做錯了什麼在我做的PDO調用的方式嗎?我輸出了$columnName$value,還有echod $sql,手動更換了:column:value,並且一切正常。建議?

編輯:

string 'SELECT * FROM myTable 
       WHERE :column = ':value'' (length=61) 

string 'blog_id' (length=9) 

string 'a3sasidsf' (length=8) 

所有值都符合預期。

+0

檢查'$ this - > __ tableName'實際上是否存在,否則您將執行'SELECT * FROM WHERE ...'。並檢查'$ this - > __ db-> errorInfo',它包含服務器端錯誤消息。 – 2011-04-22 19:01:38

+0

[如何從PDO擠出錯誤信息?](http://stackoverflow.com/questions/3726505/how-to-squeeze-error-message-out-of-pdo) – 2011-04-22 19:02:43

+0

從技術上講,沒有錯誤信息,因爲沒有錯誤。由於沒有匹配的行,因此它返回false。但如果你做了'_getByColumn('foo','foo')'它總是會返回所有行...... – ircmaxell 2011-04-22 19:29:29

回答

2

不能使用綁定參數作爲標識符。目前,您的代碼是$columname = $value而不是所需的{value of $columname} = $value。你不能綁定標識符。如果你想獲得一個可變的列名,最好的解決方案是將輸入與已知的列名進行白名單清單,然後引用它。所以:

if (in_array($columnName, $columns)) { 
    $sql .= '`' . $columnName . '` = :value'; 
} else { 
    die('illegal column'); 
} 
+0

我改變了它,所以列標識符只是一個字符串,它在prepare語句之前被設置,但是我仍然得到同樣的問題。 – tipu 2011-04-22 19:15:02

+0

我說謊了。列名稱是問題。 – tipu 2011-04-22 19:17:00