2013-05-27 50 views
1

我想做一個函數,選擇表中的所有數據,其中用戶定義字段和值。像這樣:Php PDO,讓用戶也定義字段來選擇

public function fetch($field, $value){ 

    $query = $this->db->prepare("SELECT * FROM `users` WHERE ? = ?"); 

    $query->bindValue(1, $field); 
    $query->bindValue(2, $value); 

    try{ 

     $query->execute(); 


    } catch(PDOException $e){ 

     die($e->getMessage()); 
    } 

    return $query->fetch(); 

} 

我沒有得到任何返回的東西,甚至沒有發生錯誤。有人可以告訴我我做錯了什麼,或者如果PDO甚至有可能讓用戶也選擇表格的字段和值。

謝謝。

+0

爲什麼你需要那個? –

回答

1

您不能在字段名稱中使用參數?

表和列名稱不能由PDO中的參數替換。在這種情況下,您只需要手動過濾和清理數據。 Source

要允許用戶現場版的直接,你可以這樣做:

public function fetch($field, $value){ 

// To avoid injection 
if (!in_array($field, array('these', 'are', 'field', 'names'))) 
    echo "Sorry, that's not a valid field"; 
else 
    { 
    $query = $this->db->prepare("SELECT * FROM `users` WHERE `" . $field . "` = ?"); 

    $query->bindValue(1, $value); 

    try{ 

    $query->execute(); 

    } catch(PDOException $e) { 

    die($e->getMessage()); 

    } 
    } 

return $query->fetch(); 

} 

另外,我有一個小功能(實際上是一個方法)做自動這項工作:

// Validate the cols names. 
private function setCols($TableName) 
    { 
    // If this script is still running, $this->Table exists in database and it's sane 
    $Cols = array(); 
    $STH = $this->DB->query('SHOW COLUMNS FROM `' . $this->Table . '`'); 
    foreach ($STH->fetchAll() as $Name) 
    $Cols[] = $Name[0]; 
    $this->Columns = $Cols; 
    } 

這將動態查找表的字段。

+0

因此,無論如何不可能讓用戶定義表格的字段? –

+0

是的,但是,您應該將該字段列入白名單並執行一些舊的mysql。我會編輯它以顯示如何。 –

3

不能使用佔位符標識符(即字段名);僅用於數據。您只能製作允許的字段名稱的白名單:

$allowed = array('name', 'date', 'price'); 
if (!in_array($field, $allowed, true)) { 
    throw new InvalidArgumentException; 
} 

$query = $this->db->prepare("SELECT * FROM `users` WHERE $field = ?");