2016-09-19 10 views
0

У меня есть подготовленный оператор, который должен обновить поле.MySQL подготовленный оператор nvarchar

CREATE PROCEDURE `update_table` (in id INT, in col nvarchar(11), in val nvarchar(10)) 
BEGIN 
SET @sql = concat('UPDATE table SET ', col, ' = ', val , ' WHERE id = ', id); 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END 

Если я вызвать процедуру со строкой, содержащей дефис (например, А-В)

ВЫЗОВ update_table (1, 'р', 'A-B');

я

Ошибка 1054: Неизвестный столбец 'A' ​​в 'списке полей'

Можете ли вы помочь в решении этого вопроса?

Редактировать: Я просто вычислил, что дефис не является причиной ошибки. Если я попытаюсь обновить «AB», появится такая же ошибка. Поле, которое нужно обновить, равно nvarchar с той же длиной поля.

+0

что же таблица и фактический вызов процедуры выглядит? – Flint

ответ

4

Вы уязвимы перед sql injection attacks, в основном. Ваш sproc сгенерирована SQL:

UPDATE ... WHERE reg = A-B 

Обратите внимание на отсутствие кавычек вокруг A-B. Вы не сохраняете строку A-B в поле reg. Вы делаете математическое вычитание: reg = A minus B, и ни A, ни B - это поля, которые существуют в вашей таблице.

Как минимум Голый вам потребуется:

SET @sql = concat('UPDATE table SET ', col, ' = "', val , '" WHERE id = ', id); 
               ^----------^ 

так вы генерируете

UPDATE ... reg = "A-B" 
+0

Большое спасибо за ваш вклад. Я знаю проблему с sql-инъекцией и стараюсь ее избежать, используя небольшой скрипт php, который использует «mysqli_real_escape_string» и «strip_tags», чтобы избежать внедрения sql. – Otto

+0

Кроме того, на самом деле это не то, как вы должны использовать подготовленный оператор. –