2013-05-27 1 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 = ?"); 
Смежные вопросы