我知道如何更新我数据库中的行,我知道如何将数据从一个页面传输到另一个页面,但我不知道的是更新数据库中几个不同行的好方法,只要变量不为空。
我正在处理的是一个用户页面,其中包含更改真实姓名、用户名、密码等的设置,但我不知道如何在更改后更新。例如,如果我将“用户名”留空并按“更改设置”,则它会清空用户名行。如何让它忽略空变量?
最佳答案
您很可能希望使用准备好的语句来完成此操作。既可以使代码更漂亮、更健壮,又可以避免 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。
关于php - 如果变量不为空,则更新几列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6139304/