将$ variable或$ _POST值插入mysql表

Ser*_*gei 4 php mysql

我的问题是关于为什么一段代码工作而另外两段没有,以及我如何获得无效的代码.

有效的代码:

mysql_select_db("webuser1", $con);

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

mysql_close($con);
Run Code Online (Sandbox Code Playgroud)

代码no1没有($ var1包含'value1'等):

mysql_select_db("webuser1", $con);

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

mysql_close($con);
Run Code Online (Sandbox Code Playgroud)

并且代码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);
Run Code Online (Sandbox Code Playgroud)

我不应该能够在mysql中插入$ var或$ _POST吗?我希望你没有发现这个Q傻,但我一直在寻找解决方案,但我还没有理解它们.谢谢

Que*_*tin 7

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

VALUES ('value1', 'value2')"
Run Code Online (Sandbox Code Playgroud)

使用变量时:

VALUES ($var1, $var2)");
Run Code Online (Sandbox Code Playgroud)

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

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

VALUES (value1, value2)"
Run Code Online (Sandbox Code Playgroud)

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

VALUES ('$var1', '$var2')");
Run Code Online (Sandbox Code Playgroud)

但这并不能解决您的主要安全漏洞,并让您的数据以不同的方式破解查询.

您应该避免通过组合变量中的字符串来创建SQL语句.这种方式导致SQL注入安全漏洞.使用支持绑定参数的接口.他们会为您处理报价和逃避.

  • @Sergei这只是错误的答案.没有安全问题,只有格式问题.应该引用和转义SQL查询**中的字符串**,否则您将遇到格式错误的查询.这是一个**语法**规则,你必须遵循它******. (2认同)

chi*_*lly 5

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

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

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

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