我的问题是关于为什么一段代码有效,另外两段没有,以及我如何获得无法正常工作的代码。
有效的代码:
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傻,但我一直在寻找解决方案,但我还没有理解它们。 谢谢
答案 0 :(得分:7)
在SQL中,需要引用字符串值:
VALUES ('value1', 'value2')"
使用变量时:
VALUES ($var1, $var2)");
他们没有被引用......除非引号在值本身中。
所以如果$var1 = 'value1'; $var2 = 'value2'
那么(在你的字符串中插入变量之后)你的SQL看起来像这样:
VALUES (value1, value2)"
您可以通过添加引号来解决您的问题:
VALUES ('$var1', '$var2')");
但这不会修复您的主要安全漏洞,并会让您的数据以不同方式破解查询。
您应该通过汇总变量中的字符串来避免创建SQL语句。这种方式导致SQL注入安全漏洞。使用支持bound arguments的界面。他们会为您处理报价和逃避。
答案 1 :(得分:3)
mysql需要单引号来包含一个字符串......所以你需要这样的东西:
mysql_query("INSERT INTO users (column 1, column2) VALUES ('".$_POST['value1']."', '".$_POST['value2']."')");
对于不是字符串的所有内容,您不需要单引号(')
如前所述,您不应忘记转义要放入数据库的字符串。 例如,使用准备好的陈述。通过绑定参数,可以确保传递的值是您在预准备语句中指定的类型。
答案 2 :(得分:2)
有一件事你必须明白:
你不能将$ variable或$ _POST值插入mysql表。
您只能将它们插入另一个PHP变量中。
哪个变量(如果碰巧是有效的SQL查询)可以发送到mysql,这将在表中添加相应的值。
因此,您必须首先学习正确的PHP字符串语法。
因此,PHP允许您以3种不同的方式将关联数组成员添加到字符串中:
$array['key'] = 'world';
$str = "Hello ".$array['key'];
$str = "Hello {$array['key']}";
$str = "Hello $array[key]";
您还遇到SQL语法问题 SQL查询中的字符串必须进行转义和引用。你的代码都没有。
答案 3 :(得分:0)
好像你没有正确地转义和引用mysql的参数。
要在MySQL中插入变量,您至少需要转义它们:$var = mysql_real_escape_string($_POST['variable'])
然后".. VALUES ('".$var."')"
你也应该考虑使用库来连接MySQL,例如DOCTRINE
:http://www.doctrine-project.org/来处理这个问题。
答案 4 :(得分:0)
$var1=$_POST['variable_name1'];
$var2=$_POST['variable_name2'];
$q="INSERT INTO `users` (`column 1`, `column2`) VALUES ($var1, $var2)";
$result=mysql_query($q);
答案 5 :(得分:0)
使用此解决方案,其100%正常工作
mysql_query("INSERT INTO users (column 1, column2) VALUES ('{$_POST[value1]}', '{$_POST[value2]}')");
当你使用{}时,你不需要在''
中写入值答案 6 :(得分:-1)
您的变量不会被识别为变量。它们是你的一部分。
尝试:
mysql_query("INSERT INTO users (column 1, column2) VALUES ('".$var1."', '".$var2."')");
第二个问题也是如此。
答案 7 :(得分:-1)
因为POST变量中包含',所以你必须连接。
即
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']})");
在变量周围加上引号也是个好主意,以防它是空的(或字符串而不是整数)
答案 8 :(得分:-1)
mysql_select_db("webuser1", $con);
mysql_query("INSERT INTO users (column 1, column2) VALUES ('$var1', '$var2')");
mysql_close($con);
当不在值周围使用Apostrophes时,它应该是非字符串值。