PHP,制作MySQL语句和使用引号

时间:2010-08-14 17:32:20

标签: php mysql

在php中设置mysqli对象之后,我想将一些POST变量插入到表中,但我对如何引用它们有疑问:

$sql = "INSERT INTO whatever (a, b, c)
 VALUES ('$_POST[a]','$_POST[b]','$_POST[c]')";
但是,我知道,大部分时间我都使用了像POST或GET这样的全局变量,变量名称周围有引号 - 我的问题是我在上面的sql语句中是否必须这样做?那么我应该绕这些变量名称转义单引号或双引号吗?不确定报价是否必要......

5 个答案:

答案 0 :(得分:4)

由于您已经使用MySQLi,为什么不使用预准备语句?

if ($stmt = $mysqli->prepare('INSERT INTO whatever (a,b,c) VALUES (?,?,?)') {
   $stmt->bind_param('sss', $_POST['a'], $_POST['b'], $_POST['c']);
   ....

这将自动安全地处理报价(针对SQL注入)。

有关使用示例,请参阅http://www.php.net/manual/en/mysqli-stmt.bind-param.php

答案 1 :(得分:0)

你会这样做:

VALUES ('{$_POST['a']}','{$_POST['b']}','{$_POST['c']}')";

如果它们是字符串,你需要变量周围的引号,如果你引用一个整数,它就不会中断,所以你可以随时使用引号。

确保转义/清除全局变量,不要信任用户数据记忆:) PDO附带清理功能prepare

答案 2 :(得分:0)

如果要将值放入mysql数据库,则需要将它们放在“s或s”中(除非它们是数字)。

发布变量就像数组一样工作,因此你必须像这样调用它们:$_POST['a'] $_POST['b'] etc。因此,将它们放入mysql查询中(即使查询用双引号括起来)也行不通。

你必须这样做:

$sql = "INSERT INTO whatever (a, b, c) VALUES ('".$_POST['a']."','".$_POST['b']."','".$_POST['c']."')";

或者如果你想嵌入变量,你可以这样做:

for($_POST as $key => $val){
    $$key = $val;
}

然后执行此操作:

$sql = "INSERT INTO whatever (a, b, c) VALUES ('$a','$b','$c')";

答案 3 :(得分:0)

您需要先使用mysqli_real_escape_string()来清理输入。

建议:

$a = mysqli_real_escape_string($_POST["a"]);
$b = mysqli_real_escape_string($_POST["b"]);
$c = mysqli_real_escape_string($_POST["c"]);

$sql = "INSERT INTO whatever (a, b, c) VALUES ('$a','$b','$c')";

或者(更好)使用支持预准备语句的包装器。

编辑:啊,mysqli确实支持准备好的statemtns。见Kenny的回答。

答案 4 :(得分:0)

引号主要是指对字符串或其他内容进行分组。例如,您正在插入Hello我是数据库中的某个人,那么您的查询将是INSERT INTO tables VAlueS (Hello I am someone, other data, again another data),这将不会阐明您的参数。

转义引号是不错的选择,但前提是你在报价中使用相同的引号,例如

$sql = "INSERT INTO whatever (a, b, c)
 VALUES ("$_POST[a]","$_POST[b]","$_POST[c]")";

在这种情况下,它会呈现错误,因此您必须转义引号。