Doctrine andWhere orWhere, кажется, не связывает более одного параметра - PullRequest
0 голосов
/ 28 сентября 2011

У меня такой запрос:

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

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

Я был удивлен, увидев, что при выполнении этого запроса генерируется ошибка MS SQL 102 (синтаксическая ошибка), поскольку запрос, отправляемый на сервер sql, выглядит следующим образом:

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

Знак вопроса был взят буквально в каждом дополнительном условии, добавленном к запросу! : О

Возможно, я делаю что-то не так, и кто-то может привести меня в порядок.

1 Ответ

0 голосов
/ 01 октября 2011

Уф! Я нашел ответ!

По какой-то причине в доктрине не используются подготовленные операторы PDO для SQL-сервера. Connection / Mssql.php подставляет любые параметры в строке запроса и передает пустой массив в Connection :: execute. Это было бы хорошо:

  1. Если подготовленные операторы не работали (возможно, они не работали в SQL 2000, когда драйвер соединения был впервые написан?): /
  2. Если подстановка действительно успешно подставила более одного значения! : О

Исправить несложно:

в файле Connection / 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, который появляется чуть ниже функции execute в том же файле кода.

Кроме того, вы можете проверить это, прежде чем использовать его с версиями сервера SQL ранее 2005 года, поскольку я не тестировал это решение с этой версией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...