【问题标题】:Inserting $variable or $_POST value into mysql table [duplicate]将 $variable 或 $_POST 值插入 mysql 表 [重复]
【发布时间】:2012-03-25 22:55:16
【问题描述】:

我的问题是为什么一段代码有效而两段无效,以及如何让无效的代码有效。

有效的代码:

mysql_select_db("webuser1", $con);

mysql_query("INSERT INTO users (column 1, column2) VALUES ('value1', 'value2')");

mysql_close($con);

不存在的代码 no1($var1 包含 'value1' 等):

mysql_select_db("webuser1", $con);

mysql_query("INSERT INTO users (column 1, column2) VALUES ($var1, $var2)");

mysql_close($con);

并且代码 no2 不起作用($_POST['value1'] 包含 'value1' 等):

mysql_select_db("webuser1", $con);

mysql_query("INSERT INTO users (column 1, column2) VALUES ($_POST['value1'], $_POST['value2'])");

mysql_close($con);

我不应该能够在 mysql 中插入 $var 或 $_POST 吗?我希望你不会觉得这个 Q 很愚蠢,但我一直在寻找解决方案,但我不理解它们。 谢谢

【问题讨论】:

  • 您可以在查询中直接插入 $_POST,但 you shouldn't
  • 您正在寻找的解决方案只是一个基本语法。学习您正在使用的语言的语法是必不可少的。

标签: php mysql


【解决方案1】:
$var1=$_POST['variable_name1'];
$var2=$_POST['variable_name2'];
$q="INSERT INTO `users` (`column 1`, `column2`) VALUES ($var1, $var2)";

$result=mysql_query($q);

【讨论】:

    【解决方案2】:

    使用此解决方案,其 100% 有效

    mysql_query("INSERT INTO users (column 1, column2) VALUES ('{$_POST[value1]}', '{$_POST[value2]}')");
    

    使用 {} 时,不需要在 ' ' 中写入值

    【讨论】:

      【解决方案3】:

      在SQL中,字符串值需要被引用:

      VALUES ('value1', 'value2')"
      

      当你使用变量时:

      VALUES ($var1, $var2)");
      

      它们没有被引用……除非引号在值本身中。

      所以如果$var1 = 'value1'; $var2 = 'value2' 那么(在你的字符串中插入变量之后)你的 SQL 看起来像这样:

      VALUES (value1, value2)"
      

      您可以通过添加引号来解决您的直接问题:

      VALUES ('$var1', '$var2')");
      

      但这并不能修复您的主要安全漏洞,并让您的数据以不同的方式破坏查询。

      您应该避免通过组合变量字符串来创建 SQL 语句。这种方式会导致 SQL 注入安全漏洞。使用支持bound arguments 的接口。他们将为您处理引用和转义。

      【讨论】:

      • 我知道存在安全风险,但我在 LAN 中的本地 Web 服务器上执行此操作只是为了了解它是如何工作的,它不会在存在安全问题的任何地方使用。谢谢你的好回答。
      • 输入数据中的拼写错误可能会导致数据出现问题,因此信任所有用户并不是一个明智的想法。以正确的方式做事并不艰巨,您应该养成遵循最佳做法的习惯。
      • @Sergei 这只是错误的答案。没有安全问题,只有格式问题。 SQL 查询中的字符串应该被引用和转义,否则你会得到一个格式错误的查询。这是一个语法规则,您必须始终遵守它。
      【解决方案4】:

      mysql 需要用单引号将字符串括起来......所以你需要这样的东西:

      mysql_query("INSERT INTO users (column 1, column2) VALUES ('".$_POST['value1']."', '".$_POST['value2']."')");
      

      对于不是字符串的所有内容,您不需要单引号 (')

      如前所述,您不应忘记转义要放入数据库的字符串。 例如使用准备好的语句。通过绑定参数,可以确保您传递的值是您在准备好的语句中指定的类型。

      【讨论】:

      【解决方案5】:

      因为 POST 变量中包含 ',所以您必须改为连接。

      I.E.

      mysql_query("INSERT INTO users (column 1, column2) VALUES (".$_POST['value1'].", ".$_POST['value2'].")");
      

      或者

      mysql_query("INSERT INTO users (column 1, column2) VALUES ({$_POST['value1']}, {$_POST['value2']})");
      

      在变量周围加上引号也是一个好主意,以防它为空(或字符串而不是整数)

      【讨论】:

      • 危险:这里有a security vulnerability。无论如何它都行不通,最终的 SQL 需要在值周围加上引号。
      【解决方案6】:

      您的变量未被识别为变量。它们是您字符串的一部分。

      试试:

      mysql_query("INSERT INTO users (column 1, column2) VALUES ('".$var1."', '".$var2."')");
      

      第二个问题也是如此。

      【讨论】:

      • 这也不能解决问题,因为它仍然没有在最终的 SQL 中插入引号。
      • 编辑意味着代码现在可以工作了,但仍然存在 SQL 注入问题。
      【解决方案7】:
      mysql_select_db("webuser1", $con);
      
      mysql_query("INSERT INTO users (column 1, column2) VALUES ('$var1', '$var2')");
      
      mysql_close($con);
      

      当不在值周围使用撇号时,它应该是非字符串值。

      【讨论】:

        【解决方案8】:

        似乎你没有正确地转义和引用你的参数到 mysql。

        要在 MySQL 中插入变量,您至少需要对它们进行转义:$var = mysql_real_escape_string($_POST['variable']) 然后".. VALUES ('".$var."')"

        您还应该考虑使用库来连接到 MySQL,例如 DOCTRINE: http://www.doctrine-project.org/ 来为您处理这个问题。

        【讨论】:

        • PDO(或 mysqli)就足够了,像学说这样成熟的 ORM 对于简单的任务来说可能太多了
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-22
        • 2022-11-21
        • 1970-01-01
        相关资源
        最近更新 更多