如何在PHP中动态更新表

如何在PHP中动态更新表,php,sql,Php,Sql,我正在构建一个应用程序,用户可以在其中添加、编辑和删除数据库中的用户 我已经完成了“查看用户”Select语句,该语句返回连接的表,“添加用户”返回一个表单供用户填写,并在验证后插入到数据库中 但我在“编辑用户”方面遇到了麻烦 我的编辑表单与添加表单相同,但文本框的值由数据库中的值填充 提交时,逻辑检查用户输入和数据库值之间的不匹配,以便我们知道数据库中实际更新的内容 因此,我最终得到了一个包含所有需要更改的值的数组,例如: $values_to_update = array ( "te

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

我已经完成了“查看用户”Select语句,该语句返回连接的表,“添加用户”返回一个表单供用户填写,并在验证后插入到数据库中

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

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

提交时,逻辑检查用户输入和数据库值之间的不匹配,以便我们知道数据库中实际更新的内容

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

$values_to_update = array (
    "telephone" => "07788991010"
    "email_address" => "my_new_email_address@host.com"
);
这个数组中的值是动态的,我需要找到一种方法来动态更新每个字段

此外,字段也可能来自不同的表

我不想做:

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
有没有人能想出更好的办法让我这么做

我在想也许我可以使用一个巨大的update语句,使用与获取数据相同的select语句。但我不知道这是怎么回事


应用程序将字段数组存储到表中以生成动态查询是否是一种标准做法?

我发现,在Zend Framework中也使用PDO样式的ORM映射器中,这是一种干净的方法:

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;
}

通常这相当于为每个模型编写一个保存方法。在更新情况下,您可以通过保留原始检索模型的副本来扩展此功能,以便只更新已更改的列,但是我看不到更新所有列会带来任何巨大的开销。

我发现,在Zend Framework中也使用PDO样式的ORM映射器中,可以使用一种干净的方法来完成此操作:

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;
}

通常这相当于为每个模型编写一个保存方法。在更新情况下,您可以通过保留最初检索到的模型的副本来扩展此功能,以便只更新已更改的列,但是我看不到更新所有列会带来任何巨大的开销。

这里有许多可爱的SQL注入漏洞。如果有人开卡车经过他们,那就太可惜了。这不是复制的代码。它的代码我很快就写出来了。谢谢你,你真是太棒了。如果有人开卡车经过他们,那就太可惜了。这不是复制的代码。它的代码我很快就写出来了。谢谢你