2015-05-01 1 views
0

Когда я готовлю инструкцию с bindValue, метка-заглушка не заменяется, если она окружена одинарными кавычками. Это проблематично, поскольку строки SQL окружены одинарными кавычками, чтобы избежать конфликтов ключевых слов. Посмотрите мои прикрепления со скринами содержимого базы данных после вставки и один раз без одинарных кавычек. Я уже сообщал о bug, но пока я не уверен, если это не просто проблема с кодировкой. Правильно ли использовать одинарные кавычки, т. Е. Если эта работа/это действительно ошибка?Одиночные кавычки запрещают bindValue заменять метку заполнителя

С quoutes enter image description here Без quoutes enter image description here

ответ

2

Это не ошибка. Просто не используйте одиночные кавычки. Механизм bindValue не просто заменяет ваш: путь строкой в ​​вашем заявлении. Никакой риск конфликтов имен. Смотрите это как своеобразное пространство имен. :-)

: Подготовленные операторы обычно выполняются с помощью двоичного протокола, отличного от SQL, для обеспечения эффективности и защиты от SQL-инъекций, но с некоторыми СУБД, такими как MySQL, также доступны с использованием синтаксиса SQL для целей отладки.

http://en.wikipedia.org/wiki/SQL_injection#Parameterized_statements: В большинстве платформ разработки могут использоваться параметризованные операторы, которые работают с параметрами (иногда называемые заполнителями или связующими переменными) вместо того, чтобы вставлять пользовательский ввод в оператор. Заполнитель может хранить только данные данного типа, а не произвольный фрагмент SQL. Следовательно, SQL-инъекция просто будет рассматриваться как странное (и, вероятно, недопустимое) значение параметра.

+0

На самом деле я хотел бы просто поверить вам, но не могли бы вы дать мне сложную ссылку? – ManuelSchneid3r

+0

Сложный запрос. Может ли косвенное «доказательство» удовлетворить вас? См. Здесь: http://www.ibm.com/developerworks/library/se-bindvariables/ или http://use-the-index-luke.com/sql/where-clause/bind-parameters. Связанная переменная - это, помимо прочего, защита от инъекций sql. Это связано с тем, что они не просто заменяют их держателей мест. Связанные переменные никогда не выполняются и по этой причине никогда не вступают в конфликт с ключевыми словами SQL. Я не знаю, могу ли я найти лучшие ссылки, чем те, которые были выше. – Greenflow

+0

Ну, я новичок в кодировании базы данных. Я даже не знал, что за bindValue есть этот «огромный» механизм. С ссылкой я думал о qt docs, но так как это, как правило, связано с sql, я полностью удовлетворен. Спасибо, сэр. – ManuelSchneid3r