1

我正在尝试创建一个从表中选择所有数据的函数,用户在其中定义字段和值。像这样:

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 中让用户也选择表的字段以及值。

谢谢你。

4

2 回答 2

3

您不能使用占位符作为标识符(即字段名称);仅用于数据。您只能将允许的字段名称列入白名单:

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

$query = $this->db->prepare("SELECT * FROM `users` WHERE $field = ?");
于 2013-05-27T07:16:25.577 回答
1

您不能?在字段名称中使用参数。

表名和列名不能被 PDO 中的参数替换。在这种情况下,您只需手动过滤和清理数据。 来源

要直接允许用户字段编辑,您可以执行以下操作:

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;
  }

这将动态查找表的字段。

于 2013-05-27T07:15:34.820 回答