-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两次索引:

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

在这种情况下,它永远不会起作用。

我怎样才能避免这个问题?

4

2 回答 2

0

您的查询中不能有两个名称相同的参数。

查询和数据库表列中的参数名称不需要命名相同。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 回答