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