单引号防止 bindValue 替换占位符标记
Single quotes prevent bindValue from replacing placeholder mark
当我使用 bindValue 准备语句时,如果占位符被单引号括起来,则它不会被替换。这是有问题的,因为在 SQL 中,字符串被单引号包围以避免关键字冲突。
请参阅我的附件,其中包含一次插入单引号和一次不插入单引号的数据库内容屏幕截图。
我已经报告了 bug,但同时我不确定这是否不仅仅是一个编码问题。使用单引号是否正确,即这应该有效/这真的是一个错误吗?
带引号
没有引号
这不是错误。只是不要使用单引号。 bindValue 机制不只是将您的 :path 替换为语句中的字符串。没有名称冲突的风险。将其视为某种不同的命名空间。 :-)
http://en.wikipedia.org/wiki/Prepared_statement:准备好的语句通常通过非 SQL 二进制协议执行,以提高效率并防止 SQL 注入,但对于某些 DBMS,例如 MySQL 也可以使用 SQL 语法进行调试。
http://en.wikipedia.org/wiki/SQL_injection#Parameterized_statements:对于大多数开发平台,可以使用使用参数的参数化语句(有时称为占位符或绑定变量),而不是将用户输入嵌入到语句中。 占位符只能存储给定类型的值,不能存储任意 SQL 片段。 因此 SQL 注入将被简单地视为一个奇怪的(并且可能无效)参数值。
当我使用 bindValue 准备语句时,如果占位符被单引号括起来,则它不会被替换。这是有问题的,因为在 SQL 中,字符串被单引号包围以避免关键字冲突。 请参阅我的附件,其中包含一次插入单引号和一次不插入单引号的数据库内容屏幕截图。 我已经报告了 bug,但同时我不确定这是否不仅仅是一个编码问题。使用单引号是否正确,即这应该有效/这真的是一个错误吗?
带引号
这不是错误。只是不要使用单引号。 bindValue 机制不只是将您的 :path 替换为语句中的字符串。没有名称冲突的风险。将其视为某种不同的命名空间。 :-)
http://en.wikipedia.org/wiki/Prepared_statement:准备好的语句通常通过非 SQL 二进制协议执行,以提高效率并防止 SQL 注入,但对于某些 DBMS,例如 MySQL 也可以使用 SQL 语法进行调试。
http://en.wikipedia.org/wiki/SQL_injection#Parameterized_statements:对于大多数开发平台,可以使用使用参数的参数化语句(有时称为占位符或绑定变量),而不是将用户输入嵌入到语句中。 占位符只能存储给定类型的值,不能存储任意 SQL 片段。 因此 SQL 注入将被简单地视为一个奇怪的(并且可能无效)参数值。