我的问题是关于为什么一段代码工作而另外两段没有,以及我如何获得无效的代码.
有效的代码:
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傻,但我一直在寻找解决方案,但我还没有理解它们.谢谢
在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注入安全漏洞.使用支持绑定参数的接口.他们会为您处理报价和逃避.
mysql 需要单引号将字符串括起来......所以你需要这样的东西:
mysql_query("INSERT INTO users (column 1, column2) VALUES ('".$_POST['value1']."', '".$_POST['value2']."')");
Run Code Online (Sandbox Code Playgroud)
对于不是字符串的所有内容,您不需要单引号 (')
如前所述,您不应忘记转义要放入数据库的字符串。例如使用准备好的语句。通过绑定参数,可以确保您传递的值是您在准备好的语句中指定的类型。