Postgres INSERT INTO ошибка запроса? - PullRequest
1 голос
/ 17 декабря 2010

Что не так со следующим запросом Postgres?

INSERT INTO kayak.airports(name, x, y, city) VALUES( $name, $x, $y, $city) 
WHERE airport_id='$airport_id

РЕДАКТИРОВАТЬ (спасибо Донни за помощь в достижении прогресса): Я попробовал:

$query="UPDATE kayak.airports SET name=$name, x = $x, y = $y, city = $city
WHERE airports.airport_id='$airport_id'"; 

В нем говорилось, что «столбец« Брисбен »не существует» (Брисбен - первый город, который нужно вставить.) Я вынул все между SET и WHERE, кроме «x = $ x», и они были успешно вставлены. То же самое для "y = $ y". Если оставить только имя = $ name, оно говорит:

"Query failed: ERROR: syntax error at or near "International" LINE 1: UPDATE kayak .airports SET name=Brisbane International WHERE... ^"

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

Строка запроса не заключена в кавычки.Не используйте интерполяцию переменных PHP для построения запросов SQL, поскольку это сделает ваш сценарий или приложение уязвимым для атаки SQL-инъекцией.

Вместо этого используйте параметризованные запросы.Таким образом, ваш запрос выше становится:

$query = 'UPDATE kayak.airports SET name = $1, x = $2, y = $3, city = $4'.
         'WHERE airports.airport_id = $5';

Затем вы будете использовать параметризованную функцию вызова запроса pg_query_params для передачи необходимых параметров:

$result = pg_query_params($query, $parameters)

Где $parameters - это массив параметров.

Также обратите внимание, что строка запроса $ заключена в одинарные кавычки, поскольку заполнители $ n не используются для интерполяции.Это предотвращает любые ошибки (например, ввод реального имени переменной путем увеличения буквы в первую очередь) и исключает любую возможность внедрения SQL.

1 голос
/ 17 декабря 2010

Для меня, если я получаю сообщение об ошибке, что столбец не существует, обычно это подсказка, что я что-то неверно процитировал (или не указал).

Это подтверждается сообщением об ошибке при попытке обновить только поле имени:

ERROR: syntax error at or near "International" LINE 1:

(Карат должен указывать прямо на проблемную область в запросе.)

Значение, которое вы передаете в поле имени в выражении UPDATE, должно быть заключено в кавычки, так же, как значение, которое вы передаете airport_id. (Я собираюсь сделать дикое предположение, что x и y являются целыми числами, которые не требуют кавычек, поэтому у вас не появляется ошибка, когда вы пытаетесь обновить только это поле.) предположим, что значение, которое вы передаете городу, тоже нужно будет процитировать, но вы, вероятно, вскоре это поймете. :))

Конечный результат расширен UPDATE должен выглядеть примерно так:

UPDATE kayak.airports
SET name='Brisbane International', x = 123, y = 456, city = 'Brisbane'
WHERE ...
1 голос
/ 17 декабря 2010

Вы пытаетесь вставить буквальные значения.Предложение where не имеет смысла.

Для insert вы можете использовать where в insert ... select только для ограничения того, что select возвращает.

Возможно, вына самом деле хотите update существующую запись?

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