如果变量不为空,则更新多个列

时间:2011-05-26 13:31:29

标签: php mysql

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

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

7 个答案:

答案 0 :(得分:2)

您很可能希望使用预准备语句来完成此任务。两者都是为了使代码更漂亮,更健壮,并避免SQL injectionsalternative)。

现在,由于您希望根据某些条件更新不同的列,因此您可以选择如何继续使用。

一种方法是使用多个更新语句(每个列一个用于您希望更新)并将它们捆绑在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执行相同操作。

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

答案 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'“);

这对我来说相当不错,但无法正确更新几个选项,因为它们都不应为空。如果任何为空,则用户可能会删除其用户名或密码。