2014-11-01 3 views
0

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

Я следующий запрос:

insert into midstep (street)(select street from addresses limit 10) 

Колонку улица адреса таблицы имеет много скобках, звездочки и т.д. выше работы кода, как и ожидалось. То, что я хочу сделать что-то вроде этого:

prepare midstreet (text) AS insert into midstep (street)(select $1 from addresses limit 10); 
execute midstreet (street from addresses); 

Однако, когда я вхожу в этом коде я получаю следующее сообщение об ошибке:

ERROR: syntax error at or near "from" 
SQL state: 42601 
Character: 29 

Я пробовал кучу вариаций этого кода и прочитайте документацию по Prepare и Execute, но всегда получайте сообщения об ошибках. Любая помощь приветствуется!

EDIT: Я забыл упомянуть, я использую postgresql 9.3, а мой os - Ubuntu. Пожалуйста, спросите, нужна ли вам дополнительная информация, чтобы помочь!

ответ

0

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

+0

Если параметрирование - это не выход, что бы вы посоветовали избавиться от скобок и звездочек? Я буду передавать эти данные в геокодер, который не знает, как обращаться со скобками и звездочками. –

+0

Когда вы запрашиваете внутри РСУБД, нет никакой опасности SQL-инъекции. SQL-инъекция является возможной угрозой, когда вы запрашиваете что-то и добавляете параметры из-за СУРБД. Если у вас есть ценность, например, я голоден, вы не получите ошибок из-за «. Проблема заключается в том, когда вы создаете свой запрос, и результат выглядит следующим образом: select * от пользователей, где username = ''; удалить из пользователей; –