【问题标题】:importance of link identifier in mysql_real_escape_string()mysql_real_escape_string() 中链接标识符的重要性
【发布时间】:2010-12-30 23:27:06
【问题描述】:

为什么在使用 mysql_real_escape_string() 时需要有一个链接标识符作为输入。我知道该函数应该与 MySQL 查询一起使用,但该函数实际上只是一个字符串操作。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    来自the PHP manual

    转义 unescaped_string 中的特殊字符,考虑到连接的当前字符集,以便将其放在 mysql_query() 中是安全的。如果要插入二进制数据,则必须使用该函数。

    和:

    如果未指定链接标识符,则假定最后一个由 mysql_connect() 打开的链接。如果没有找到这样的链接,它将尝试创建一个,就好像 mysql_connect() 没有参数被调用一样。如果没有找到或建立连接,则会生成 E_WARNING 级别的错误。

    需要一个连接来确定字符集。

    【讨论】:

      【解决方案2】:

      mysql_real_escape_string:

      转义 unescaped_string 中的特殊字符,考虑连接的当前字符集,以便将其安全地放在 mysql_query() 中。 p>

      【讨论】:

        【解决方案3】:

        阅读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() 的结果可能会被服务器误解(期望另一种编码,因此需要不同的转义规则)。
        而且,即使您只有一个连接,这样做也没有什么坏处(您可以绝对肯定地说直到时间结束都会如此吗?),请始终通过它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-09
          • 1970-01-01
          相关资源
          最近更新 更多