我的数据库中有大表,我尝试动态构建查询,而不是指定每个列名。
我正在尝试根据收到的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进行更新。