【问题标题】:Insert into table SET - rows with special characters skipped插入表 SET - 跳过特殊字符的行
【发布时间】:2015-08-01 15:12:00
【问题描述】:

我有这个问题:

$sql = " 插入表集 名称 = '$name', sku = '$number', 描述 = '$desc' ";

但是包含一些特殊字符的行(在我的例子中是')没有被插入。我该如何解决? 提前致谢。

【问题讨论】:

  • 我假设您没有任何错误报告,因为 MySQL 不会“跳过”事情。它可能会在您不知情的情况下默默地失败。说出来!您的 db 类将有一个错误消息的方法。使用 PDO 还是 MySQLi?

标签: mysql special-characters


【解决方案1】:

当您构建查询时,您需要转义您插入的数据。 您至少需要在 PHP 中使用 addlashes() 函数,如下所示:

$sql = "INSERT INTO table SET name = '".addslashes($name)."', sku = '".addslashes($number)."', description = '".addslashes($desc)."'";

但是更正确的方法是使用与添加斜杠不同的函数,它可以正确处理数据中的所有字符,而不仅仅是撇号。

我正在使用我的自定义“转义”功能,如下所示:

function escape($text)
{
   return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $text);
}

所以使用这个函数,你会写:

$sql = "INSERT INTO table SET name = '".escape($name)."', sku = '".escape($number)."', description = '".escape($desc)."'";

【讨论】:

    【解决方案2】:

    您必须使用参数化查询而不是手动附加这些值。目前,如果名称、编号或描述包含任何将执行的 sql。

    更详细的答案在How can I prevent SQL injection in PHP?

    【讨论】:

    • 好点!向我 +1 以获得该提示。 OP 真的应该考虑避免 SQL 注入
    【解决方案3】:

    阅读 mysql 中的转义字符。我认为这是用\完成的

    【讨论】:

    • 是的..它有效..与所有 $data 一起使用很好吗?
    • 应该没问题。在 Mysql 中你也可以使用两个 ': ''
    • 使用 simplexml_load_file 从 xml 读取
    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2020-03-13
    • 1970-01-01
    • 2012-04-25
    相关资源
    最近更新 更多