Ошибка оператора PDO: синтаксическая ошибка 42601 около $ 6 - PullRequest
3 голосов
/ 05 августа 2011

У меня проблемы с выполнением этого простого запроса.Я использую безымянные параметризованные запросы и Postgres + PostGIS.Информация об ошибках операторов PDO выглядит следующим образом:

Array
(
    [0] => 42601
    [1] => 7
    [2] => ERROR:  syntax error at or near "$6" at character 28
)

Что является синтаксической ошибкой в ​​PostGreSQL, из-за которой я чувствую себя глупо, что не могу ее найти ...

Вот запрос ввопрос

$sql = "SELECT ?,?,?,?,? 
        FROM ? 
        WHERE ST_Distance((SELECT the_geom FROM polyon_table WHERE gid = ? ), ?.the_geom) < 0.1";

Тогда я готовлю это ... $stmt = $dbh->prepare($sql);.ErrorInfo из $ dbh дает код 00000 (успех).

$params выглядит следующим образом:

array(8) {
  [0]=>
  string(4) "area"
  [1]=>
  string(9) "perimeter"
  [2]=>
  string(6) "lat"
  [3]=>
  string(6) "lon"
  [4]=>
  string(8) "data"
  [5]=>
  string(10) "myTable"
  [6]=>
  int(8)
  [7]=>
  string(10) "myTable"
}

Затем я выполняю и передаю $params array.$stmt->execute($params) и я печатаю код ошибки и получаю это:

Array 
(
  [0] => 42601
  [1] => 7
  [2] => ERROR:  syntax error at or near "$6" at character 28
)

$stmt->debugDumpParams(); выглядит следующим образом:

SQL: [112] SELECT ?,?,?,?,? FROM ? WHERE ST_Distance((SELECT the_geom FROM polygon_table WHERE gid = ? ), ?.the_geom)< 0.1
Params:  8
Key: Position #0:
paramno=0
name=[0] ""
is_param=1
param_type=2
...
// shortened it to save space.... all of them look the same, except 6, which has param type = 1
Key: Position #7:
paramno=7
name=[0] ""
is_param=1
param_type=2

Итак, после нескольких попыток (зацикливание и связываниеиндивидуальные параметры, изменяя int (8) в $params на строку и т. д.).Я скопировал и вставил sql в терминал, чтобы выполнить запрос.Я заменил все переменные очень аккуратно и в точном порядке $params, и он работает нормально.

Мой вывод заключается в том, что шестая переменная (целое число) вставляется неправильно.Любые идеи, почему это происходит?

Надеюсь, что такого рода ошибки не повторяют вопрос.Я просмотрел 3 страницы вопросов.

Ответы [ 2 ]

6 голосов
/ 05 августа 2011

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

Подумайте об этом так: at prepareВ это время синтаксический анализатор SQL должен знать весь синтаксис, используемый вашим запросом, а также какие таблицы и столбцы вы используете.В противном случае, как он узнает, что эти таблицы и столбцы существуют в вашей базе данных, или это должно вызвать ошибку?Предполагается, что он будет сообщать о любых ошибках, связанных с несуществующими таблицами, во время подготовки, а не во время выполнения.

Поэтому, когда вы предоставляете строку «myTable» для значения 6-го параметра, все равно, что вы выполняетезапрос:

SELECT ... FROM 'myTable' ...

То есть вместо имени таблицы это строковый литерал в кавычках.Это не имеет никакого смысла в SQL;это ошибка синтаксиса и семантики.

1 голос
/ 05 августа 2011

Я не совсем уверен, но я не думаю, что вы можете параметризовать имя таблицы, я даже не уверен, что вы можете и для столбцов, но я не проверял его.

Также не уверен, что ?.column работает. Я не думаю, что это просто заменить параметры на строки.

...