Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果变量不为空,则更新多个列_Php_Mysql - Fatal编程技术网

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

Php 如果变量不为空,则更新多个列,php,mysql,Php,Mysql,我知道如何更新数据库中的行,我知道如何将数据从一个页面传输到另一个页面,但我不知道的是,只要变量不是空的,更新多个不同行的数据库的好方法 我正在做的是一个用户页面,上面有更改实名、用户名、密码和类似内容的设置,但我不知道如何在更改后更新。例如,如果我将“Username”留空,然后按“Change Settings”,则会清空Username行。如何使其忽略空变量?类似的内容可能(未测试)。。。尽管您需要防止sql注入。这只是一个大概的想法 if(isset($_POST['submit']))

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

我正在做的是一个用户页面,上面有更改实名、用户名、密码和类似内容的设置,但我不知道如何在更改后更新。例如,如果我将“Username”留空,然后按“Change Settings”,则会清空Username行。如何使其忽略空变量?

类似的内容可能(未测试)。。。尽管您需要防止sql注入。这只是一个大概的想法

if(isset($_POST['submit'])) { $query = "UPDATE tbl SET "; if(isset($_POST['firstname']) && $_POST['firstname'] != "") $query .= "firstname = ".$_POST['firstname']; //execute query } 如果(isset($_POST['submit'])) { $query=“更新tbl集合”; 如果(isset($\u POST['firstname'])和&$\u POST['firstname']!=”)$query.=“firstname=”.$\u POST['firstname']; //执行查询 } 像这样的东西可能(未经测试)。。。尽管您需要防止sql注入。这只是一个大概的想法

if(isset($_POST['submit'])) { $query = "UPDATE tbl SET "; if(isset($_POST['firstname']) && $_POST['firstname'] != "") $query .= "firstname = ".$_POST['firstname']; //execute query } 如果(isset($_POST['submit'])) { $query=“更新tbl集合”; 如果(isset($\u POST['firstname'])和&$\u POST['firstname']!=”)$query.=“firstname=”.$\u POST['firstname']; //执行查询
} 为什么不使用存储在数据库中的当前值填充表单的字段

例如


为什么不使用存储在数据库中的当前值填充表单的字段

例如

您可以这样做:
  $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);
?>
你可以这样做:
  $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);
?>

为什么要将值设为空。你可以在表格中描述。例如:

<input type="text" name="firstname" values=<?php echo $firstname;?>

为什么要将值设为空。你可以在表格中描述。例如:

<input type="text" name="firstname" values=<?php echo $firstname;?>

如果在查询中使用$\u POST/$\u 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).'');
}
?>


希望它对您有意义。

如果您在查询中使用$\u POST/$\u 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).'');
}
?>


希望它对您有意义。

仍然无法让它工作。我曾尝试过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_查询(“更新$tbl_名称集 css=“$css”,其中用户名=“$u_name'”


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

仍然无法使其工作。我曾尝试过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_查询(“更新$tbl_名称集 css=“$css”,其中用户名=“$u_name'”


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

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

现在,由于您希望根据某些条件更新不同的列,因此可以选择一些方法来继续

一种方法是使用几个update语句(每个要更新的列对应一个语句),并将它们捆绑在一个数据库中。在事务中捆绑语句将确保并有助于减轻使用多个SQL语句代替一个SQL语句对性能的影响(除非您有多个并发用户,否则这一点可能不重要)

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

为了简洁起见,我省略了错误处理;您需要检查连接故障和准备语句以及执行语句时出现的问题。如果在第一行
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();
您可以更进一步并生成查询,这是相当安全的,因为您不依赖/使用用户输入来生成查询。不过,这会很快变得毛茸茸的

其他方法可能是这里已经提到的方法,或者将查询的动态生成与准备好的语句相结合。您可能还希望尝试对API执行同样的操作


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

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

现在,由于您希望根据某些条件更新不同的列,因此可以选择一些方法来继续

一种方法是使用几个update语句(每个要更新的列对应一个语句),并将它们捆绑在一个数据库中。在事务中捆绑语句将确保并有助于减轻使用多个SQL语句代替一个SQL语句对性能的影响(除非您有多个并发用户,否则这一点可能不重要)

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

为了简洁起见,我省略了错误处理;您需要检查连接故障和准备语句以及执行语句时出现的问题。如果在第一行
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();
您可以更进一步并生成查询,这是相当安全的,因为您不依赖/使用用户输入来生成查询。不过,这会很快变得毛茸茸的

其他方法可能是这里已经提到的方法,或者结合dyn