在php中设置mysqli对象之后,我想将一些POST变量插入到表中,但我对如何引用它们有疑问:
$sql = "INSERT INTO whatever (a, b, c)
VALUES ('$_POST[a]','$_POST[b]','$_POST[c]')";
但是,我知道,大部分时间我都使用了像POST或GET这样的全局变量,变量名称周围有引号 - 我的问题是我在上面的sql语句中是否必须这样做?那么我应该绕这些变量名称转义单引号或双引号吗?不确定报价是否必要......
答案 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']}')";
如果它们是字符串,你需要变量周围的引号,如果你引用一个整数,它就不会中断,所以你可以随时使用引号。
答案 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]")";
在这种情况下,它会呈现错误,因此您必须转义引号。