我正在尝试获取整个post数组并将每个值放入一个将更新前一个值的select语句中。我在使用字符串转义的php中执行此操作时遇到了麻烦。
这是我试图传递的SQL语句:
UPDATE test1l.testtable SET age=106, weight=345, WHERE id=11
因此,提交页面首先将$ _POST数组放入变量中。然后我尝试设置语句,以便每个post变量都在正确的位置。
$dataArray = $_POST;
$Sql =" UPDATE test1l.testtable SET age=$dataArray['age'],weight=$dataArray['weight'] WHERE id=$dataArray['id']"
单引号和双引号搞砸了我的陈述。另外,我有一个自定义函数,它是转义这些字符串的字符,以帮助停止注入。
答案 0 :(得分:2)
使用连接:
'update ... SET age = ' . $dataArray['age'] . ', weight = ...'
并确保验证并正确转义帖子属性以避免SQL注入。甚至更好:使用准备好的陈述来确定。见http://php.net/manual/fr/mysqli.prepare.php
答案 1 :(得分:1)
将经过验证的用户输入(mysql_real_escape_string
表示未知输入)存储在变量中,然后使用sprintf
,如下所示。除非某些变量未定义,或者数据库信息不正确,否则这行代码永远不会中断。
$query = sprintf("UPDATE test1l.testtable SET age='%s', weight='%s' WHERE id='%s'", $age, $weight, $id);
答案 2 :(得分:1)
这样的事情会更安全:
$dataArray = $_POST;
$Sql =" UPDATE test1l.testtable SET age=?, weight=? WHERE id=?";
$Statement = $mysqli->prepare($Sql);
$Statement->bind_param('iii', $dataArray['age'],
$dataArray['weight'],
$dataArray['id']);
$Statement->execute();
答案 3 :(得分:1)
如果你要使用这样的格式:
$Sql =" UPDATE test1l.testtable SET age=$dataArray['age'],weight=$dataArray['weight'] WHERE id=$dataArray['id']"
应该这样做:
$Sql ="UPDATE test1l.testtable SET age={$dataArray['age']},weight={$dataArray['weight']} WHERE id={$dataArray['id']}";
在双引号内工作时,你必须用{}包围数组和对象之类的复杂变量。
$string = "print {$object->param} and {$array['key']}";
另外不要忘记你的查询正在处理所有整数字段 - 一旦你到达db中的字符串字段,如varchar,char,text - 你的查询必须用单引号括起来,如下所示:
$Sql ="UPDATE test1l.textfield SET textfield='{$dataArray['age']}' WHERE id={$dataArray['id']}";
同样如上所述,任何基于用于SQL部分陈述的用户输入的变量都应使用参数化语句或函数mysql_real_escape_string。
作为注释,您必须更改为字符串构建格式,如:
$sql= 'UPDATE test1l.testtable SET age='.mysql_real_escape_string($dataArray['age']).', weight='.mysql_real_escape_string($dataArray['weight']).' WHERE id='.mysql_real_escape_string($dataArray['id']);
理想情况下,您可以将其解压缩为可重用的函数,该函数将使用mysql_real_escape_string对数据库的所有字段进行清理,因此您不必继续制作如此丑陋/不可读的sql字符串。
答案 4 :(得分:0)
$mysqli->query("UPDATE test1l.testtable SET age='".$dataArray['age']."',
weight='".$dataArray['weight']."' WHERE id='".$dataArray['id']."' ")
如果您不知道,可以从括号内删除刻度:$dataArray[age]