php sql语句形成

时间:2011-12-16 21:24:23

标签: php javascript html

我正在尝试获取整个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']"

单引号和双引号搞砸了我的陈述。另外,我有一个自定义函数,它是转义这些字符串的字符,以帮助停止注入。

5 个答案:

答案 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]