2011-09-28 71 views
0

我有一个这样的查询:学说andWhere orWhere似乎不结合超过一种参数

$name = "field1"; 
$name2 = "field2"; 
$value = "searchTerm"; 

$query->select('*')-> 
     from("TableName")-> 
     where($name . " = ?", array($value))-> 
     andWhere($name2 . " = ?", array($value)); 

我很惊讶地看到,当该执行查询生成MS SQL错误102(语法错误)因为发送到sql server的查询如下所示:

SELECT * FROM TableName WHERE field1 ='searchTerm'AND field2 =?

问号是在添加到查询中的每个附加条件中按照字面顺序进行的! :o

也许我做错了什么,有人可以让我直接在这里。

+0

当我在lib/Doctrine/Query/Abstract.php中执行print_r之前的查询参数时,两个参数都存在。 –

+0

使用PDO和没有问题,所以它不是SQL服务器刚试过相同的查询。 –

回答

0

呼!我找到了答案!

无论出于何种原因,doctrine不使用PDO为SQL Server准备的语句功能。 Connection/Mssql.php替换查询字符串中的任何参数,并将空数组传递给Connection :: execute。这将是罚款:

  1. 如果准备语句没有工作(也许他们在首次被写入该连接司机没有在SQL 2000工作?):/
  2. 如果置换成功实际上更多的取代比一个值! :○

修复的方法是简单的:在

连接

/Mssql.php线314下方变化的执行功能:

public function execute($query, array $params = array()) 
{ 
     if(! empty($params)) { 
      $query = $this->replaceBoundParamsWithInlineValuesInQuery($query, $params); 
     } 

     return parent::execute($query, array()); 
} 

到:

public function execute($query, array $params = array()) 
{   
     return parent::execute($query, $params); 
} 

你可以就像轻松删除重写的函数一样。

不要忘记对exec执行相同的更改,它将显示在同一代码文件中执行函数的正下方。

此外,您可能希望在将它与早于2005年的SQL Server版本一起使用之前进行测试,因为我尚未使用该版本测试此解决方案。