我的数据库中有大表,而不是指定每个列名,我试图动态构建查询。
我正在尝试根据收到的POST数据在'主板'表中进行更新。我收到的$data
对象包含的字段多于表格。 (我为一些标志添加了一些字段。)
因此,我正在检索我即将更新的记录,并将每个列与我构建UPDATE查询的$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
变量的查询。
我怎样才能做到这一点?
答案 0 :(得分:3)
请不要使用这种方法,如果你想要一个超过年龄的SOLID应用程序,请使用特定的列名,而不是为你构建SQL的一些垃圾foreach循环。如果你想逃避SQL的编写,使用ORM,那里有大量的存在,并且大多数都是在一开始就与框架捆绑在一起,这使得学习绳索更加简单!
简单易学的框架示例:(但不一定是弱框架)
答案 1 :(得分:0)
您需要更改一些代码......
$result = mysqli_query($con, $query);
$existingData = mysqli_fetch_assoc($result);
现在你的$existingData
是一个你可以循环的数组;
答案 2 :(得分:0)
老实说,我建议您利用ORM框架或仅使用独立的ORM。我建议使用Laravel或CodeIgniter(如果你不熟悉编程,那么CodeIgniter将是最简单的。)
接下来,为什么你的POST数据JSON编码?为什么不只发布所有表单变量?我会推荐这种方式来简化它(甚至来自JS)。
最后,您必须确保清理输入。你可以使用mysqli_real_escape_string()。我假设您将使用MySQLi DB接口。 (参考:http://php.net/manual/en/mysqlinfo.api.choosing.php)
实际上最后一点是:在我看来,Laravel是PHP框架的未来。它美观,轻巧,功能强大。我强烈建议你学习它。参考:http://laravel.com/
答案 3 :(得分:0)
我设法让它发挥作用。现在,我根据现有数据与用户更新之间的差异构建查询。 foreach
循环现在看起来像这样:
foreach ($existingData as $key => $value) {
if ($existingData[$key] != $data[$key]) {
$statement .= $key . " = \"" . $data[$key] . "\" , ";
$flag = true;
}
}
这是我感兴趣的部分。其余代码应根据最新的API进行更新。