Вопрос

Пожалуйста, внимательно прочитайте вопрос. Это не обычный глупый "Мой код не работает !!!" вопрос.

Когда я запускаю этот код с Предполагаемая ошибка

try {
  $sth = $dbh->prepare("SELECT id FROM users WHERE name INN(?,?) ");
  $sth->execute(array("I'm","d'Artagnan"));
} catch (PDOException $e) {
    echo $e->getMessage();
}

Я получаю это сообщение об ошибке

У вас есть ошибка в вашем синтаксисе SQL ... рядом с 'Inn (' i 'm', 'd ' artagnan ')' в строке 1

Но я в течение многих лет подумал, что запросы и данные отправляются на сервер отдельно и никогда не вмешиваются. Таким образом, у меня есть несколько вопросов (хотя я сомневаюсь, что кто-нибудь получил ответ ...)

  1. Куда он получает такое знакомое строковое представление - цитируемая и сбежала? Это сделано специально, чтобы сообщить об ошибке или это часть фактического запроса?
  2. Как это работает на самом деле? Заменит ли это заполнителю с данными или нет?
  3. Есть ли способ получить целую запрос, не только немного его, для отладки?

Обновлять

mysqli делает это как ожидаемое: это бросает ошибку near 'INN(?,?)'

Это было полезно?

Решение

попробуйте добавить

$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

;)

Другие советы

Я не уверен во всех деталях, но я постараюсь ответить.

  1. Цитата происходит на стороне базы данных. База данных убегает и дезинфицирует все значения (см. Пуля 2), которое он получает так, чтобы она была правильно интерпретирована. В тот момент, когда ошибка брошена, база данных (в этом случае mysql) распечатает запрос, который он пытался запустить. Это было бы не так полезно, если только это показало подготовленную часть.

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

  3. Это зависит от базы данных, которую вы используете. MySQL, например, может воспользоваться всеми запросами в файл журнала (проверьте настройки my.cnf для этого). Но вы также можете использовать debugdumpparams () на стороне PHP.

Я надеюсь, что это было немного полезно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top