php - 如何在 PHP 中动态更新表

标签 php sql

我正在构建一个应用程序,用户可以在其中添加、编辑和删除数据库中的用户。

我已经完成了“查看用户”(选择返回连接表的语句)和“添加用户”(返回一个表单供用户填写并在验证后插入数据库)

但是我在“编辑用户”方面遇到了麻烦。

我的编辑表单与添加表单相同,但文本框的值是用数据库中的值填充的。

提交后,逻辑检查用户输入和数据库值之间是否不匹配(因此我们知道我们实际上在数据库中更新了什么)

所以我最终得到了一个包含所有需要更改的值的数组,例如:

$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/

相关文章:

php - 检查连接中是否存在记录并分配并计数

sql - 在任何其他 SQL 之前先执行子查询重构

php - PHP 内部服务器错误

java - PHP 客户端如何通过 Sockets/RPC 与 Java 程序通信,在不刷新页面的情况下检索新结果?

mysql - 如何同时查询 Wordpress 多站点安装 (3.0) 中的所有博客选项表?

javascript - php 文件中未定义 javascript 函数时出现错误

sql - 使用 CTE 的开始和结束日期出现问题

sql - Oracle SQL 多个左连接有重复记录或 "invalid identifier"

php - PHP 和 MySQL 中唯一访问次数的有效计数器

php - 在 PHP 回显之前添加延迟