我知道如何更新数据库中的行,我知道如何将数据从一个页面传输到另一个页面,但我不知道是一个很好的方法来更新几个不同行的数据库,只要变量不是空的。
我正在处理的是一个用户页面,其中包含更改真实姓名,用户名,密码等设置,但我不清楚如何只更新一次我更改后的内容。如果我将“用户名”留空并按“更改设置”,则会清空用户名行。如何让它忽略空变量?
答案 0 :(得分:2)
您很可能希望使用预准备语句来完成此任务。两者都是为了使代码更漂亮,更健壮,并避免SQL injections(alternative)。
现在,由于您希望根据某些条件更新不同的列,因此您可以选择如何继续使用。
一种方法是使用多个更新语句(每个列一个用于您希望更新)并将它们捆绑在transaction内。将事务中的语句捆绑在一起将确保atomicity,并且还有助于减轻使用多个SQL语句代替一个SQL语句对性能的影响(除非您有许多并发用户,否则这些事情不太重要)。
它可能看起来像这样(使用mysqli API):
$mysqli = @new mysqli("dbhost", "dbuser", "dbpassword", "dbname");
$mysqli->autocommit(FALSE);
if ($userName) {
$stmt = $mysqli->prepare("UPDATE TABLE users WHERE uid=? SET username=?");
$stmt->bind_param("i", $uid);
$stmt->bind_param("s", $userName);
$stmt->execute();
}
if ($password) {
$stmt = $mysqli->prepare("UPDATE TABLE users WHERE uid=? SET password=?");
$stmt->bind_param("i", $uid);
$stmt->bind_param("s", $password);
$stmt->execute();
}
if ($firstName) {
$stmt = $mysqli->prepare("UPDATE TABLE users WHERE uid=? SET firstname=?");
$stmt->bind_param("i", $uid);
$stmt->bind_param("s", $firstName);
$stmt->execute();
}
if ($lastName) {
$stmt = $mysqli->prepare("UPDATE TABLE users WHERE uid=? SET lastname=?");
$stmt->bind_param("i", $uid);
$stmt->bind_param("s", $lastName);
$stmt->execute();
}
$mysqli->commit();
$mysqli->close();
为简洁起见,我省略了错误处理;您需要检查连接失败和准备语句以及执行它们的问题。如果在第一个execute()
行之后发生任何问题,您需要致电$mysqli->rollback()
以确保不会执行任何更改。
你也建议你重构代码,这样它就不会重复这么多了,或许这样:
function updateColumn($mysqli, $query, $uid, $value) {
if ($value) {
$stmt = $mysqli->prepare($query);
$stmt->bind_param("i", $uid);
$stmt->bind_param("s", $value);
$stmt->execute();
}
}
$mysqli = @new mysqli("dbhost", "dbuser", "dbpassword", "dbname");
$mysqli->autocommit(FALSE);
updateColumn($mysqli, "UPDATE TABLE users WHERE uid=? SET username=?", $uid, $userName);
updateColumn($mysqli, "UPDATE TABLE users WHERE uid=? SET password=?", $uid, $password);
updateColumn($mysqli, "UPDATE TABLE users WHERE uid=? SET firstname=?", $uid, $firstName);
updateColumn($mysqli, "UPDATE TABLE users WHERE uid=? SET lastname=?", $uid, $lastName);
$mysqli->commit();
$mysqli->close();
您可以更进一步并生成查询,这是相当安全的,因为您不依赖/使用用户输入来生成查询。这会很快变得毛茸茸。
其他方式将是这里已经提到的方法,或者将查询的动态生成与预准备语句相结合。您可能还想尝试使用PDO API执行相同操作。
答案 1 :(得分:1)
为什么不用存储在数据库中的当前值填充表单的字段?
例如
<input type="text" name="name" value="<?php echo $(value currently in db);?>" />
所以,即使他们没有改变,你仍然会有旧的价值。
答案 2 :(得分:1)
你可以这样做:
$values = array();
foreach($user_data as $key => $value)
if (isset($value) && trim($value) != '')
$values[] = $key.' = "'.mysql_real_escape_string($value).'"';
$sql = 'UPDATE users SET '.implode(', ', $values).' WHERE id = '.$id;
mysql_query($sql);
?>
答案 3 :(得分:0)
这样的事情可能(未经测试)......虽然你需要防止sql注入。这只是一个普遍的想法。
if(isset($_POST['submit'])) { $query = "UPDATE tbl SET "; if(isset($_POST['firstname']) && $_POST['firstname'] != "") $query .= "firstname = ".$_POST['firstname']; //execute query }
答案 4 :(得分:0)
为什么要将值设为空。您可以在表单中进行描述。如:
<input type="text" name="firstname" values=<?php echo $firstname;?>
并提交检查
$query = "Update table SET "
if(isset($_POST['firstname']) && strlen($_POST['firstname'])>0){
$query.= "firstname = ".$_POST['variable'];
}
答案 5 :(得分:0)
如果在查询中使用$ _POST / $ _ GET,则可以像这样构建它。
$ _POST示例:
<?php
$MoreSQL = '';
if (trim($_POST['username'] != '')) {
$MoreSQL .= 'username="'.trim($_POST['username']).'"';
}
if (trim($_POST['password'] != '')) {
if ($MoreSQL)
$MoreSQL .= ', '; // add comma if $MoreSQL is not empty
$MoreSQL .= 'password="'.trim($_POST['password']).'"';
}
if (trim($_POST['firstname'] != '')) {
if ($MoreSQL)
$MoreSQL .= ', '; // add comma if $MoreSQL is not empty
$MoreSQL .= 'firstname="'.trim($_POST['firstname']).'"';
}
if (trim($_POST['lastname'] != '')) {
if ($MoreSQL)
$MoreSQL .= ', '; // add comma if $MoreSQL is not empty
$MoreSQL .= 'lastname="'.trim($_POST['lastname']).'"';
}
if (!$MoreSQL) { // if everything is empty, no need to fire mysql_query
echo 'nothing to update';
} else { // otherwise, update the record
mysql_query('UPDATE mytable SET '.$MoreSQL.' WHERE membersID='.($_POST['membersID'] + 0).'');
}
?>
希望你有意义。
答案 6 :(得分:0)
仍然无法让它发挥作用。我已经尝试过RRStoyanov建议,因为它似乎是最合理的,我最终得到了这个:
if (trim($_POST['style'] != '')) {
if ($MoreSQL)
$MoreSQL .= ', '; // add comma if $MoreSQL is not empty
$MoreSQL .= 'css="'.trim($_POST['style']).'"';
}
if (!$MoreSQL) { // if everything is empty, no need to fire mysql_query
echo 'nothing to update';
} else { // otherwise, update the record
mysql_query("UPDATE ´database SET '.$MoreSQL.' WHERE usernamename='.$u_name.'");
}
在此之前我用过:
mysql_query(“UPDATE $ tbl_name SET css ='$ css'WHERERE username ='$ u_name'“);
这对我来说相当不错,但无法正确更新几个选项,因为它们都不应为空。如果任何为空,则用户可能会删除其用户名或密码。