【问题标题】:MySql insert binary data to db without errorsMySql将二进制数据插入db而不会出错
【发布时间】:2011-09-26 02:07:21
【问题描述】:

我有问题。当我在 php 中进行这样的插入时:

sql = "INSERT INTO mytable (id, value)
VALUES ('sds83','".$EncryptedString."')";

当我运行以下查询时,它有时有效,有时无效。问题是有时 $EncryptedString 包含这样的字符:')') 这会导致语法错误。 $EncryptedString 包含二进制数据,我该如何解决这个问题?

【问题讨论】:

    标签: php mysql insert


    【解决方案1】:

    转义你的加密字符串

    mysql-real-escape-string

    mysql_real_escape_string() 调用 MySQL 的库函数 mysql_real_escape_string,将反斜杠添加到以下内容 字符:\x00、\n、\r、\、'、" 和 \x1a。

    StripSlashes

    【讨论】:

    • 原始字符串已经被转义,但随后使用 mcrypt 对其进行了加密,并将新的加密值放在 $EncryptedString 中。如果我再次转义它会保留所有字符,以便当我从数据库中提取数据时可以解密字符串?
    • 不,在获取数据时你不会逃避它,你会使用stripslashes php.net/manual/en/function.stripslashes.php 一切都会好起来的
    • 我不明白。您是否建议转义字符串或带斜杠。我认为两者都行不通,因为它会改变 $EncryptedString 的值。如果我在插入 $EncryptedString 时转义或删除斜杠,它会更改加密字符串的值,然后当我稍后从数据库中提取它时,它将丢失斜杠,这对于解密字符串至关重要。我错过了什么吗?还是 mysql 转义和斜杠的工作方式不同?
    • 请您发布$EncryptedString的样本
    • 我使用 mcrypt 将加密值存储在 $EncryptedString 中。在网上搜索了一下,我发现你可以使用 base64_encode 使它更优雅地插入到 mysql 中。然后在需要返回值时使用 base64_decode。
    【解决方案2】:

    使用支持预处理语句的 PDO(或其他数据库层)。

    当您使用查询参数而不是执行原始 SQL 时,您可以提高速度(数据库只需针对一个查询进行计划和优化),并且您写入其参数的所有数据都会立即与查询本身完全隔离。

    令人惊讶的是有多少人没有这个功能!采取主动并更新您的代码。

    【讨论】:

      【解决方案3】:

      您需要转义您的$EncryptedString。根据您使用的 MySQL 连接对象/函数的类型,可能是这样的:

      $sql = "
          INSERT INTO mytable (id, value)
          VALUES ('sds83','" . mysql_real_escape_string($EncryptedString) . "')";
      

      【讨论】:

      • 这不会改变 $EncryptedString 的值,我以后就不能解密这个字符串了吗?
      • 不行,他要做的就是用一个不到10年的mysql接口,并且支持参数。
      猜你喜欢
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      相关资源
      最近更新 更多