Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP实现动态MySQL查询_Php_Mysql - Fatal编程技术网

用PHP实现动态MySQL查询

用PHP实现动态MySQL查询,php,mysql,Php,Mysql,我正在寻找一种对MySQL服务器进行动态查询的方法。目前,这是我用来更新服务器上数据的代码: $deskAttr = json_decode($_POST["desk_attributes"]); foreach($deskAttr as $key => $value) { $sql = "UPDATE desk_attributes SET iw_standard=".$value->iw_standard.", avay

我正在寻找一种对MySQL服务器进行动态查询的方法。目前,这是我用来更新服务器上数据的代码:

$deskAttr = json_decode($_POST["desk_attributes"]);

foreach($deskAttr as $key => $value) {
    $sql = "UPDATE desk_attributes SET iw_standard=".$value->iw_standard.", avaya_standard=".$value->avaya_standard.", avaya_withcallid=".$value->avaya_withcallid.", avaya_withtransfer=".$value->avaya_withtransfer.", dual_screen=".$value->dual_screen.", air_conditioning=".$value->air_conditioning.", iw_obdialler=".$value->iw_obdialler." WHERE id=".$value->id;
    $conn->query($sql);
}
如您所见,SQL列名与
deskAttr
键相同。我正在寻找一种使这一行成为循环的方法,这样,如果我要向MySQL表添加更多列,就不需要更改这一行

它看起来像这样:

$deskAttr = json_decode($_POST["desk_attributes"]);

foreach($deskAttr as $key => $value) {  
    $sql = "UPDATE desk_attributes SET";
    foreach($value as $k => $v) {
        $sql .= " $k = $value->$k ,";
    }
    $sql .= "WHERE id=".$value->id";
}
我该如何编写上面的代码,使其实际工作


**编辑** 知道
$deskAttr
是一个对象数组,列的名称与对象键的名称相同可能会有所帮助

以下是我在伪代码中的意思:

foreach($object in $deskAttr) {
    $sql = "UPDATE table SET ";
    foreach($key in $object) {
        if($key != "id")
            $sql .= "$key = $object->$key, ";
    }
    $sql .= "WHERE id = $object->id;
    $conn->query($sql);
}

显然,这会在WHERE部分之前的查询末尾添加一个额外的逗号,但希望您能得到我想要实现的结果。

您可以通过使用PHP函数在代码中稍作更改来实现这一点

取一个空白数组,将更新参数连接到它

如果不是,则,
内爆()
获取字符串

更新代码:

$sql = "UPDATE desk_attributes SET ";
foreach ($deskAttr as $key => $value) {
 $value = mysqli_real_escape_string($link, $value); // $links is database connection string.
 $key = mysqli_real_escape_string($link, $key); // $links is database connection string.
 $updtAttrs[] = $key ." = '" . $value . "'";
}
$sql .= ! empty($updtAttrs) ? implode(', ', $updtAttrs) : '';
$sql .= " WHERE id=" . $value->id;

您对查询非常开放,应该真正使用而不是连接查询。特别是因为你根本没有逃避用户的输入!您应该切换到prepared语句作为值,白名单作为列名,以避免sql注入。您不能通过prepared语句绑定列名。所以,如果你想在你的SQL查询字符串中放入一个变量字符串,只要正确地转义它们就可以了。这段代码非常不安全。它对SQl注入非常开放。您应该使用准备好的语句,而不是像这样直接连接用户输入。您还应该有一个允许的列名列表。不,不是。不要做一个有准备的人,去阅读
mysqli\u real\u escape\u string
documentation@KiJ也许你应该检查评论的时间线和文章的编辑。1.当我写评论时,
mysqli\u real\u escape\u string()
根本没有包含在答案中。2.
$key
仍然是完全不可替换的,这使得它仍然100%地对SQL注入开放。顺便说一句,实际上有些情况下,
mysqli\u real\u escape\u string()
是不够的:@MagnusEriksson在收到您的评论后,我已经更新了答案。如果我发布了一些类似这样的数据:
$\u post['something hello']='world'
,该查询将中断。如前所述,您应该有一个允许列名的白名单。如果列名不是白名单,请不要将其添加到查询中。永远不要相信用户的输入。