我正在构建一个应用程序,用户可以在其中添加、编辑和删除数据库中的用户。
我已经完成了“查看用户”(选择返回连接表的语句)和“添加用户”(返回一个表单供用户填写并在验证后插入数据库)
但是我在“编辑用户”方面遇到了麻烦。
我的编辑表单与添加表单相同,但文本框的值是用数据库中的值填充的。
提交后,逻辑检查用户输入和数据库值之间是否不匹配(因此我们知道我们实际上在数据库中更新了什么)
所以我最终得到了一个包含所有需要更改的值的数组,例如:
$values_to_update = array (
"telephone" => "07788991010"
"email_address" => "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="422f3b1d2c27351d272f232b2e1d23262630273131022a2d31366c212d2f" rel="noreferrer noopener nofollow">[email protected]</a>"
);
这个数组中的值是动态的,我需要一种方法来动态更新每个字段。
此外,这些字段也可能来自不同的表。
我不想做:
if ( isset ( $values_to_update[ "telephone" ] ) )
$database->update("UPDATE users SET telephone = '{$values_to_update[ "telephone" ]}' WHERE user_id = $user_id");
else if ( isset ( $values_to_update[ "email_address" ] ) )
$database->update("UPDATE authentication SET email_address = '{$values_to_update[ "email_address" ]}' WHERE user_id = $user_id");
else if ( /* ... */)
// etc etc etc
有人对我可以做到这一点的更好方法有任何想法吗?
我在想也许我可以使用一个巨大的更新语句来使用与获取数据相同的选择语句。但我不知道这是如何运作的。
应用程序将字段数组存储到表中以进行动态查询生成是标准做法吗?
最佳答案
我发现了一种在 PDO 风格的 ORM 映射器(Zend Framework 中也使用)中执行此操作的干净方法:
public function save($model) {
// Possible values to insert
$values = array(
":id" => $model->id,
":name" => $model->name,
//...
":contact_number" => $model->telephone
);
// If model id is set, we are updating a record, otherwise inserting
if (isset($model->id)) {
$sql = "UPDATE tbl SET name = :name, ..., contact_number = :contact_number WHERE id = :id LIMIT 1";
} else {
// Don't pass the ID when it isn't in the query
unset($values[":id"]);
$sql = "INSERT INTO tbl (name, ..., contact_number) VALUES (:name, ..., :contact_number)";
}
// Execute the query with our values (below is a PDO example)
$stmt = $this->db->prepare($sql);
$stmt->execute($values);
$stmt->closeCursor();
// Get the new ID if we inserted
if (!isset($model->id)) {
$model->id = $this->db->lastInsertId();
}
return $model;
}
通常这相当于为每个模型编写一个save
方法。您可以通过保留最初检索的模型的副本来在 UPDATE 情况下扩展此功能,以便仅更新已更改的列,但是我没有看到更新所有列有任何巨大的开销。
关于php - 如何在 PHP 中动态更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9193031/