从PHP中的POST数据构建动态查询


Dynamic query building from POST data in PHP

我的数据库中有大表,我尝试动态构建查询,而不是指定每个列名。

我正在尝试根据收到的POST数据对"主板"表进行更新。我接收到的$data对象的字段比表的字段多。(我为一些标志添加了一些字段。)因此,我正在检索即将更新的记录,并通过将它的每一列与我的$data对象字段进行比较来构建update查询。

我是php的新手,所以我对语法不太了解。

这是代码:

<?php
$data = json_decode($_POST["data"], true);
$id = $data["ID"];
include_once 'dbconnect.php';
$query = sprintf("SELECT * FROM `motherboard` WHERE ID = " . $id . ";");
$result = mysqli_query($con, $query);
$existingData = mysqli_fetch_assoc($result);
include_once 'dbclose.php';

$statement = "";
$statement = "UPDATE motherboard SET ";
$flag = false;
foreach ($existingData as $key => $value) {
    if ($existingData->$key != $data->$key) {
        $statement .= $key . " = " . $data->$key . " , ";
        $flag = true;
    }
}
if ($flag)
    $statement = substr($statement, 0, strrchr($statement, ',') - 1);
$statement .= " WHERE ID = " . $id . ";";
echo $statement;
?>

我的主要问题是在foreach循环中。我不知道如何比较$existingData$data变量,然后使用它们来构建查询。

我怎样才能做到这一点?

请不要使用这种方法,如果你想要一个超越年龄的SOLID应用程序,请使用特定的列名,而不是一些为你构建SQL的垃圾foreach循环。如果你想逃避SQL的编写,可以使用ORM,那里有很多,而且大多数都从一开始就与一个框架捆绑在一起,这样学习技巧就更简单了!

简单易学框架的例子:(但不一定是弱框架)

  • 蛋糕PHP
  • Laravel

祝好运

您需要更改一些代码。。。

$result = mysqli_query($con, $query);
$existingData = mysqli_fetch_assoc($result);

现在您的$existingData是一个可以循环的数组;

老实说,我建议您利用一个带有ORM的框架,或者只是一个独立的ORM。我建议使用Laravel或CodeIgniter(如果你是编程新手,那么CodeIgnitor将是最简单的)。

接下来,为什么对POST数据进行JSON编码?为什么不直接POST所有的表单变量呢?我建议用这种方式来简化它(甚至从JS)。

最后,你必须确保你的输入消毒。您可以使用mysqli_real_escape_string()。我假设您将使用MySQLi DB接口。(参考:http://php.net/manual/en/mysqlinfo.api.choosing.php)

最后一点:在我看来,Laravel是PHP框架的未来。它美观、轻便、有力。我强烈建议你学习一下。参考:http://laravel.com/

我设法让它工作起来。现在,我正在根据现有数据和用户更新之间的差异构建查询。foreach循环现在看起来是这样的:

foreach ($existingData as $key => $value) {
    if ($existingData[$key] != $data[$key]) {
        $statement .=  $key . " = '"" . $data[$key] . "'" , ";
        $flag = true;
    }
}

这是我感兴趣的部分。其余的代码应该根据最新的API进行更新。