Доктрина - Как распечатать реальный sql, не только подготовленный оператор?

Один из способов сделать это - использовать Newtonsoft.Json

В своем коде Razor включите @using Newtonsoft.Json.

А затем:

<label id="intLabel" data-int-array="@(JsonConvert.SerializeObject(ViewBag.t))">My label</label>

Это будет производить:

<label id="intLabel" data-int-array="[1,2,3,4]">My label</label>

В вашем необходимом выводе вы запросили строковый массив - в этом случае вам придется определять «t» как строковый массив в коде вместо массива int.

Надеюсь, это работает для вас. Если да, отметьте это как ответ.

153
задан user369450 27 January 2015 в 21:29
поделиться

3 ответа

Доктрина не отправляет «реальный запрос SQL» на сервер базы данных: он на самом деле использует подготовленные операторы, что означает:

  • Отправка оператора, для его подготовленности (это Что возвращается $ Query-> getsql () )
  • и, затем, отправка параметров (возвращена $ Query-> getParameters () )
  • и выполнение Подготовленные заявления

Это означает, что на стороне PHP никогда нельзя никогда нельзя «реальный» SQL-запрос на PHP - поэтому доктрина не может их отображать.

150
ответ дан 23 November 2019 в 22:03
поделиться

Измененные @dsamblas функционируют для работы, когда параметры являются строками даты как это '2019-01-01'. Также - все, что записал dsamblas, но замена startQuery с этим или видит различия и добавляет мой код. (в случае, если он изменил что-то в своей функции, и моя версия не имеет модификаций).

public function startQuery($sql, array $params = null, array $types = null)

    {
        if($this->isLoggable($sql)){
            if(!empty($params)){
                foreach ($params as $key=>$param) {

                    try {
                        $type=Type::getType($types[$key]);
                        $value=$type->convertToDatabaseValue($param,$this->dbPlatform);
                    } catch (Exception $e) {
                        $value = $param; // added this when getType throws exception
                    }

                    $sql = join(var_export($value, true), explode('?', $sql, 2));
                }

            }
            echo $sql . " ;".PHP_EOL;
        }
    }

не протестировал много.

0
ответ дан 23 November 2019 в 22:03
поделиться

Нет другого реального запроса, вот как работают готовые заявления. Значения связаны на сервере базы данных, а не в слое приложений.

Увидеть мой ответ на этот вопрос: в PHP с PDO, как проверить окончательный параметризованный запрос SQL?

(повторяется здесь для удобства :)

Использование подготовленных утверждений с параметризованными значениями не просто другого Способ динамически создать строку SQL. Вы создаете подготовленную оператор в базе данных, а затем отправьте только значения параметров.

Так что, вероятно, отправлено в базу данных, будет готовиться ... , затем Установите ... И, наконец, Выполнить ....

Вы Не сможет получить некоторую строку SQL, например , выберите * из ... , даже если он будет производить эквивалентные результаты, потому что такого запроса не было фактически отправлено в базу данных.

13
ответ дан 23 November 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: