Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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中POST数据的动态查询构建_Php - Fatal编程技术网

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

PHP中POST数据的动态查询构建,php,Php,我的数据库中有很大的表,我尝试动态地构建查询,而不是指定每个列名 我正在尝试根据收到的POST数据更新“主板”表。我收到的$data对象的字段比表中的字段多。(我为一些标志添加了一些字段。) 因此,我正在检索要更新的记录,并通过将它的每一列与我的$data对象字段进行比较,构建更新查询 我是php新手,因此不太懂语法 代码如下: <?php $data = json_decode($_POST["data"], true); $id = $data["ID"]; include_once

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

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

我是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
变量来构建查询


我怎样才能做到这一点呢?

请不要使用这种方法,如果您想要一个可靠的应用程序,它将运行多年,请使用特定的列名,而不是一些为您构建SQL的垃圾foreach循环。如果您想避免编写SQL,请使用ORM,存在大量的ORM,并且大多数ORM都从一开始就与框架捆绑在一起,从而简化了学习过程

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

  • 蛋糕PHP
  • 拉维尔

祝你好运

你需要更改一些代码

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

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

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

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

最后,您必须确保对输入进行消毒。您可以使用mysqli\u real\u escape\u string()。我假设您将使用MySQLi数据库接口。(参考号:)


实际上还有最后一点:在我看来,Laravel是PHP框架的未来。它美观、轻便、功能强大。我强烈建议你学习它。参考:

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

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

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

危险:您正在使用并且应该使用。您还容易受到现代API的影响,因为它会使您更容易使用。@Quentin。。快告诉我吧。我不明白先从DB中选择的必要性。如果一行只有某些数据要更新,则只更新该数据。您不需要在UPDATE语句中说明每个fiedl。您的foreach循环完全没有用-您正在尝试在mysqli结果句柄上循环。它不是那样的。@MikeBrant我想先检查列值是否与post数据不同。只有这样,我才会将该列添加到更新查询中。1。ORM框架不会是一个优势。如果我需要在运行时创建表,据我所知,ORM将是一个问题。2.POST数据是JSON编码的,因为我使用的是Knockout.js。3.我以后会消毒的。现在我只想让它工作。之后,我可以添加一些验证和保护。如果您需要在运行时创建变量模式,您可能应该将这些模式限制在临时表中,或者您甚至应该研究不将您限制在特定模式中的NoSQL解决方案。JSON数据没有问题,尽管我想说,如果您要发布JSON,实际上使用
应用程序/JSON
内容类型发布JSON,并从原始输入中解码发布的数据,而不是使用表单编码信封中发送的JSON数据的混合(即填充
$\u POST
)。