【发布时间】:2010-12-30 23:27:06
【问题描述】:
为什么在使用 mysql_real_escape_string() 时需要有一个链接标识符作为输入。我知道该函数应该与 MySQL 查询一起使用,但该函数实际上只是一个字符串操作。
【问题讨论】:
为什么在使用 mysql_real_escape_string() 时需要有一个链接标识符作为输入。我知道该函数应该与 MySQL 查询一起使用,但该函数实际上只是一个字符串操作。
【问题讨论】:
转义 unescaped_string 中的特殊字符,考虑到连接的当前字符集,以便将其放在 mysql_query() 中是安全的。如果要插入二进制数据,则必须使用该函数。
和:
如果未指定链接标识符,则假定最后一个由 mysql_connect() 打开的链接。如果没有找到这样的链接,它将尝试创建一个,就好像 mysql_connect() 没有参数被调用一样。如果没有找到或建立连接,则会生成 E_WARNING 级别的错误。
需要一个连接来确定字符集。
【讨论】:
转义 unescaped_string 中的特殊字符,考虑连接的当前字符集,以便将其安全地放在 mysql_query() 中。 p>
【讨论】:
阅读http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html
例如,如果使用 GBK 字符集,它不会将无效的多字节序列 0xbf27 (¿') 转换为 0xbf5c27(¿\' 或 GBK 中的单个有效多字节字符后跟单引号)。要确定正确的转义方法,mysql_real_escape_string() 需要知道使用的字符集,通常从数据库连接游标中检索。
也许是这篇文章的结果,但显然在它之后,函数mysql_set_charset() 已添加到 mysql 扩展中。字符集是 mysql 连接(资源)的属性。
如果您有多个连接,您真的应该将它们传递给mysql_real_escape_string()(并且始终使用 mysql_set_charset() 而不是 SET NAMES)。
如果您不传递连接资源,该函数将使用您的脚本建立的最后一个连接。如果两个(或更多连接)的字符集不同,则 real_escape_string() 的结果可能会被服务器误解(期望另一种编码,因此需要不同的转义规则)。
而且,即使您只有一个连接,这样做也没有什么坏处(您可以绝对肯定地说直到时间结束都会如此吗?),请始终通过它。
【讨论】: