-1

PHP アプリケーションで PDO と準備済みステートメントを使用しています。次のように、クエリのプレースホルダーに配列値をバインドしています。

// This method is called twice from somewhere in my app:
// setWhere ( 'col1', 50 );
// setWhere ( 'col2', 60 );

function setWhere ( $column, $value )
{
    $this->bindings[$column] = $value;
}

次に、クエリを次のように実行します。

// This query is constructed by the same class (sort of an ORM wrapper)
// $sql = "SELECT * FROM table WHERE col1 = :col1 OR col2 = :col2";
$stmt = $this->db->prepare ( $sql );
$stmt->execute ( $this->bindings );

このようにうまく動作します。ORしかし、同じ列で選択する必要がある場合はどうすればよいですか? 次に、基本的に、既に存在する配列にインデックスを設定します。

setWhere ( 'col1', 50 );
setWhere ( 'col1', 60 );

基本的にcol1インデックスを2回設定します:

$this->bindings['col1'] = 50;
$this->bindings['col1'] = 60;

この場合、それは決して機能しません。

どうすればこの問題を回避できますか?

4

2 に答える 2

0

クエリに同じ名前の 2 つのパラメーターを含めることはできません。

クエリとデータベース テーブルの列のパラメーター名は、同じ名前にする必要はありません。PDO は単純にパラメーター値の処理で置き換えるだけで、他の ORM のように SQL クエリを作成することはありません。

于 2013-04-09T17:59:06.710 に答える
0

うーん...名前を変えてください。私が知る限り、クエリ自体を動的に構築するのではなく、バインドされた変数を使用して静的にクエリを作成しているので、次のようになります。

$sql = "SELECT * FROM table WHERE col1 = :val1 OR col1 = :val2";
setWhere ( 'val1', 50 );
setWhere ( 'val2', 60 );
$stmt = $this->db->prepare ( $sql );
$stmt->execute ( $this->bindings );

クエリを動的に作成する場合、条件に対して 3 つの値を保存する必要があります。

  1. 列名。一意である必要はありません。
  2. パラメータ名。一意である必要があります。
  3. バインドしたい値。

何かのようなもの:

function setWhere( $col, $param, $value ) {
  if( isset($this->bindings[$param]) ) {
    throw new Exception("Cannot double-bind parameter $param");
  }
  $this->bindings[$param] = array('col' => $col, 'val' => $value);
}

//function for $stmt->execute ( $this->getBindings );
function getBindings( ) {
  $ret = array();
  foreach($this->bindings as $key => $val) {
    $ret[$key] = $val['val'];
  }
  return $ret;
}
于 2013-04-09T18:53:48.960 に答える