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();

}

エラーさえも返されません。誰かが私が間違っていることを教えてください.

ありがとうございました。

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 に答える