【问题标题】:Inserting strings into MySQL将字符串插入 MySQL
【发布时间】:2011-07-05 23:41:54
【问题描述】:

我遇到了一个问题,我认为我在 MySQL 中的插入语句弄乱了输入数据库的字符串。

我在 PHP 代码中有这样的插入语句:

$sql = 'insert into my_table ( numeric_id , string_value ) 
        values ( '.$some_number.' , "'.$some_text.'" )';

当后来我从数据库中获取$some_text 时,它会弄乱字符串,例如 don\'t 而不是不要,并在输出中添加 \r\n 之类的内容。

知道为什么会发生这种情况以及我应该改变什么吗?

【问题讨论】:

  • 最好的办法是同时显示用于插入和输出数据的代码,以及输出的具体内容。
  • 顺便说一句,您的代码受到Bobby Tables attack 的影响。
  • 您可能启用了魔术引号。
  • @CanSpice 恰恰相反,这是这部愚蠢漫画的后果。
  • 大家好,我已经禁用了魔术引号。

标签: php mysql forms encoding


【解决方案1】:

$sql = "插入 my_table (numeric_id, string_value) 值 ('$some_number' , '$some_text')"; $query = mysql_query($sql);

/** 只需使用 (") 而不是 ('); */

【讨论】:

    【解决方案2】:

    始终使用prepared statements 将数据插入 SQL。那么你根本不需要做任何转义。

    【讨论】:

      【解决方案3】:

      您的某些代码进行了两次转义。
      您只需要找到第二次执行此操作的代码并将其删除即可。

      首先你必须打印出你的变量来查看它的实际内容。
      很难根据假设来解决被蒙蔽的事情。

      在转义之前打印出$some_text 变量并查看。如果它已经被转义了 - 那么在代码前面的某个地方进行了额外的转义。

      【讨论】:

      • 直到每次安装启用了 magic_quotes 的 PHP 都从轨道上被删除,然后其包含的宇宙同样从元节中删除。
      • @Col 没有证据表明他没有魔术引号,并且还通过单独的函数调用转义输入,正如我一直告诉你的那样。需要来自 OP 的更多信息!
      • @Andy 如果他有魔术引号并且两次转义,那么don't 将是don\\\'t。你没看到吗?
      • @Col FFS 试试这个:(创建 tmp 表)insert into test values ('don\\\'t');select * from test;,你会得到:don\'t。我在回答之前运行了这个,是吗?
      • @Andy 你做测试真好。现在尝试在输出中获取文字 \r\n
      【解决方案4】:

      这应该可以工作

      $sql = "插入 my_table ( numeric_id , string_value ) 值 ( '.$some_number.' , '".$some_text."' )";

      【讨论】:

      • 这段代码比开篇更有效的原因是什么?
      【解决方案5】:

      首先,转义你的输入:

      $sql = 'insert into my_table ( numeric_id , string_value ) values (' . mysql_real_escape_string($some_number) . ', "' . mysql_real_escape_string($some_text) . '")';
      

      其次,斜线的问题可能是由于 PHP 魔术引号引起的。你可以在这里阅读更多信息:http://www.php.net/manual/en/security.magicquotes.disabling.php

      您可以通过运行以下命令检查魔术引号是否打开:

      var_dump(get_magic_quotes_gpc());
      

      如果它打开,您可以禁用它(如果您可以访问 php.ini),或者您可以使用 PHP 代码来解决魔术引号造成的问题:

      if (get_magic_quotes_gpc()) {
          function stripslashes_gpc(&$value) {
              $value = stripslashes($value);
          }
          array_walk_recursive($_GET, 'stripslashes_gpc');
          array_walk_recursive($_POST, 'stripslashes_gpc');
          array_walk_recursive($_COOKIE, 'stripslashes_gpc');
          array_walk_recursive($_REQUEST, 'stripslashes_gpc');
      }
      

      (取自 PHP.net)

      【讨论】:

      • 转义不是“输入”,而是仅转义字符串。魔术引号不能是因为它们不会转义\r\n
      • @Col 你怎么知道他将数值转换为int?你的反对票非常激进。
      • @Andy 这是过去 10 分钟内第三个逃过一劫的问题。其中 2 人已经接受了错误的答案。我只是害怕这个。确实害怕。
      • 真的... 2 票否决? @Col,我在这里遗漏了什么还是您自己保留正确答案?
      • @Andy 看,就像洪水一样!很多错误的答案!是不是也吓到你了?
      猜你喜欢
      • 2016-06-30
      • 1970-01-01
      • 2018-05-04
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 2023-03-30
      • 2017-05-14
      相关资源
      最近更新 更多