php - 如果变量不为空,则更新几列

标签 php mysql

我知道如何更新我数据库中的行,我知道如何将数据从一个页面传输到另一个页面,但我不知道的是更新数据库中几个不同行的好方法,只要变量不为空。

我正在处理的是一个用户页面,其中包含更改真实姓名、用户名、密码等的设置,但我不知道如何在更改后更新。例如,如果我将“用户名”留空并按“更改设置”,则它会清空用户名行。如何让它忽略空变量?

最佳答案

您很可能希望使用准备好的语句来完成此操作。既可以使代码更漂亮、更健壮,又可以避免 SQL injections (alternative)。

现在,由于您希望根据某些条件更新不同的列,因此您有一些关于如何继续的备选方案。

一种方法是使用多个更新语句(一个用于您希望更新的每一列)并将它们捆绑在一个 transaction 中.将语句捆绑在事务中将确保 atomicity并且还将有助于减轻使用多个 SQL 语句代替一个 SQL 语句对性能的影响(除非您有很多并发用户,否则这可能无关紧要)。

它可能看起来像这样(使用 mysqli API):

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("dbhost", "dbuser", "dbpassword", "dbname");
$mysqli->autocommit(FALSE);

if ($userName) {
    $stmt = $mysqli->prepare("UPDATE TABLE users SET username=? WHERE uid=?");
    $stmt->bind_param("si", $userName, $uid);
    $stmt->execute();
}

if ($password) {
    $stmt = $mysqli->prepare("UPDATE TABLE users SET password=? WHERE uid=?");
    $stmt->bind_param("si", $password, $uid);
    $stmt->execute();
}

if ($firstName) {
    $stmt = $mysqli->prepare("UPDATE TABLE users SET firstname=? WHERE uid=?");
    $stmt->bind_param("si", $firstName, $uid);
    $stmt->execute();
}

if ($lastName) {
    $stmt = $mysqli->prepare("UPDATE TABLE users SET lastname=? WHERE uid=?");
    $stmt->bind_param("si", $lastName, $uid);
    $stmt->execute();
}

$mysqli->commit();
$mysqli->close();

为简洁起见,我省略了错误处理;您需要检查连接故障和准备语句以及执行语句的问题。如果在第一个 execute() 行之后出现任何问题,您需要调用 $mysqli->rollback() 以确保未执行任何更改。

你也最好重构代码,这样它就不会重复太多,也许是这样的:

function updateColumn($mysqli, $query, $uid, $value) {
    if ($value) {
        $stmt = $mysqli->prepare($query);
        $stmt->bind_param("si", $value, $uid);
        $stmt->execute();
    }
}

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("dbhost", "dbuser", "dbpassword", "dbname");
$mysqli->autocommit(FALSE);

updateColumn($mysqli, "UPDATE TABLE users SET username=? WHERE uid=?", $uid, $userName);
updateColumn($mysqli, "UPDATE TABLE users SET password=? WHERE uid=?", $uid, $password);
updateColumn($mysqli, "UPDATE TABLE users SET firstname=? WHERE uid=?", $uid, $firstName);
updateColumn($mysqli, "UPDATE TABLE users SET lastname=? WHERE uid=?", $uid, $lastName);

$mysqli->commit();
$mysqli->close();

您可以更进一步并生成查询,这是相当安全的,因为您不依赖/使用用户输入来生成查询。不过,这会很快变得毛茸茸。

其他方法是这里已经提到的方法,或者将查询的动态生成与准备好的语句相结合。您可能还想尝试对 PDO 做同样的事情。 API。

从长远来看,最好的方法可能是使用第三方 ORM框架(参见 this 相关问题的建议)。

关于php - 如果变量不为空,则更新几列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6139304/

相关文章:

php - 最有效的数据收集方式?

php - Laravel SSL 与 MySQL 的连接无法正常工作

javascript - 如何将单双引号放在一起?

php - 表单检查js的文件上传问题

php - 如何使用 php 和 html 根据组合框选择的变化自动更改输入文本框的值

java - java应用程序和远程数据库的问题

php - 传递给选择字段的实体必须被管理

mysql - wordpress mysql查询无法使用concat等创建 View

php - fetch_array 无法正常工作

mysql - 如何避免使用此基本内部联接进行全表扫描?