【问题标题】:Update a row in database while retaining the previous data in other columns if their input is blank如果输入为空,则更新数据库中的一行,同时保留其他列中的先前数据
【发布时间】:2018-01-26 17:22:06
【问题描述】:

我有一个表单,用户可以通过输入学生的用户名来更新学生。但是如果用户只想更新名字并将姓氏留空,这将从 mysql 数据库中删除姓氏。

html表单:

<form class="" action="updateStudent.php" method="post">
    Username: <input type="text" name="username" value="">
    Firstname: <input type="text" name="firstname" value="">
    Lastname: <input type="text" name="lastname" value="">
     <input type="submit" name="" value="Update">
     </form>

php:

<?php
include('connection.php');
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$username = $_POST['username'];
$sql = "update employee set firstname = '$firstname',
lastname = '$lastname',
where username = '$username'";

    if ($conn->query($sql) === TRUE) {
        echo "Record updated successfully";
    }

    else{
    echo "error: $sql. " . mysqli_error($conn);
    }
mysqli_close($conn);
?>

如何更改我的代码,以便当用户只想更改名字并保留姓氏时,它最终不会在数据库中为空?

【问题讨论】:

  • 更新前请检查姓氏是否为空。
  • 或者在你的表单中你应该加载当前数据之前
  • 检查$_POST['lastname'] != ' ' || strlen($_POST['lastname']) &gt; $someValue,如果你希望它不是空的或者有一定长度的姓氏,那么如果那个条件适用你的查询是$sql = "update employee set firstname = '$firstname', where username = '$username'"; 否则 $sql = "update employee set firstname = '$firstname', lastname = '$lastname', where username = '$username'";

标签: php html mysql


【解决方案1】:

在表单中添加这一行

<input type="text" name="lastname" value="<?php echo $lastname; ?>" />

$lastname 是结果集中的姓氏。条件是在渲染页面之前先查询记录。

【讨论】:

  • 当我这样做时,姓氏字段会在文本字段中显示一个默认值,这是我不想要的
  • 你能告诉我你的数据库中为这个特定字段存储了什么吗??
【解决方案2】:

使用 COALESCE:

UPDATE `employee`
     SET `firstname` = COALESCE($firstname, firstname),
     `lastname` = COALESCE($lastname, lastname),
     `username` = COALESCE($username, username)
WHERE `username`= '$username'

并将 value="" 留在 HTML 表单中的输入标签中。

【讨论】:

  • 但我需要 value="",因为我在 php 中调用表单时正在使用它?还是我误会你了?
【解决方案3】:

我在评论中放了同样的东西, 你需要检查这个人是否只改变了它的名字 你可以这样做

include('connection.php');
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$username = $_POST['username'];
/**
*  instead of checking if the input is an empty string, try to set a minimum
*  length for the string lets put it on 5
*/ 
$minLength= 5;
$sql = '';
if(strlen($lastname) > $minLength && strlen($firstname) > $minLength){
    //both have the  required length
    $sql = "update employee 
            set firstname = '$firstname',
                lastname = '$lastname',
            where username = '$username'";
} else if(strlen($firstname) > $minLength) {
    //only first name with required length
    $sql = "update employee 
            set firstname= '$firstname',
            where username = '$username'";
} else if (strlen($lastname) > $minLength) {
    //only lastname with required length 
    $sql = "update employee 
            set lastname= '$lastname',
            where username = '$username'";
} else {
    //none applied
    $sql = false;
}

if($sql){
//it's "true" if it contains something
    if ($conn->query($sql) === TRUE) {
        echo "Record updated successfully";
    } else {
        echo "error: $sql. " . mysqli_error($conn);
    }
    mysqli_close($conn);
}

但我强烈建议如果您是更新信息,在更新表单中默认情况下这些字段在表单加载时获取当前值。

【讨论】:

    【解决方案4】:

    我假设您的意思是,如果有人将输入表单字段留空,您不想更新该列。 为此,请构建一个动态查询。

    <?php
    include 'connection.php';
    $username = $_POST['username'];
    $sql = "UPDATE employee SET ";
    //where username = '$username'";
    $countColumns = 0; // track how many columns we are going to update
    $columns = ['firstname', 'lastname']; // add more columns to this list if needed.
    foreach($columns as $key ) {
        if ( ! empty($_POST[$key] ) {
            $value = $_POST[$key];
            if ( $countColumns > 0 ) $sql .= ',';
            $sql .= "  `{$key}` = '{$value}'";
            $countColumns++;
        }
    }
    if ( $countColumns > 0 ) {
        $sql .= " WHERE username = '{$username}'";
        if ($conn->query($sql) === TRUE) {
            echo "Record updated successfully";
        }
    
        else {
            echo "error: $sql. " . mysqli_error($conn);
        }
    }
    else {
        // Nothing to update
    }
    mysqli_close($conn);
    

    【讨论】:

      【解决方案5】:

      MySQLi 中使用准备好的语句,它们更安全,可以帮助您防止SQL 注入攻击!

      要解决您的问题,您只需检查哪些值为空并设置适当的查询,如下所示:

      <?php
      $conn = new mysqli($servername, $username, $password, $dbname);
      
      // check if all fields came in and if username is not empty
      if(isset($_POST['username']) && !empty($_POST['username']) && isset($_POST['firstname']) && isset($_POST['lastname']))
      {
         // you can use strlen($_POST['firstname']) > 2 to check if it at least has 2 characters
         if(!empty($_POST['firstname']) && empty($_POST['lastname']))
         {
             $sql = $conn->prepare("UPDATE employee SET firstname = ? WHERE username = ?";
             $sql->bind_param("ss", $_POST['firstname'], $_POST['username']);
         }
         else if(empty($_POST['firstname']) && !empty($_POST['lastname']))
         {
             $sql = $conn->prepare("UPDATE employee SET lastname = ? WHERE username = ?";
             $sql->bind_param("ss", $_POST['lastname'], $_POST['username']);
         }
         else if(!empty($_POST['firstname']) && !empty($_POST['lastname']))
         {
             $sql = $conn->prepare("UPDATE employee SET firstname = ?, lastname = ? WHERE username = ?";
             $sql->bind_param("sss", $_POST['firstname'], $_POST['lastname'], $_POST['username']);
         }
      
         if ($sql->execute())
         {
            echo "Record updated successfully";
         }
         else
         {
            echo "error: " . mysqli_error($conn);
         }
      
         $sql->close();
      }
      
      $conn->close();
      ?>
      

      【讨论】:

        【解决方案6】:

        无论他们想要更新哪个,或者他们想要同时更新两者,这都应该有效。虽然我不确定您是否必须在 IF 语句中的字符串中转义单引号。

        $firstname = $_POST['firstname'];
        $lastname = $_POST['lastname'];
        $username = $_POST['username'];
        
        $flen = strlen($firstname);
        $llen = strlen($lastname);
        $c = $flen + $llen;
        
        if ($flen>0) {
          $fname = "firstname = '$firstname'" ;
        }
        
        if ($c=2) {
          $com =  "," ;
        }
        
        if ($llen>0) {
          $lname = "lastname = '$lastname'" ;
        }
        
        $sql = "update employee set " . $fname . $com . $lname . "
        where username = '$username' ";
        
            if ($conn->query($sql) === TRUE) {
                echo "Record updated successfully";
            }
        
            else{
            echo "error: $sql. " . mysqli_error($conn);
            }
        mysqli_close($conn);
        ?>
        

        【讨论】:

          【解决方案7】:

          我最近创建了一个表单,我需要确保填写所有字段,因此我使用以下代码确保在继续执行我的 sql 查询之前填写所有字段。可能不是最干净的,但它可以防止空字段。这样就不会留下任何空白,并且会相应地更新。

          $firstName = $_POST['firstName'];
          $lastName = $_POST['lastName'];
          
          $flen = strlen($firstName);
          $llen = strlen($lastName);
          
          switch ($flen) {
            case 0:
            echo "Click Back button and please make sure to fill in all fields";
            exit;
          }
          switch ($llen) {
            case 0:
            echo "Click Back button and please make sure to fill in all fields";
            exit;
          }
          

          【讨论】:

          • 如果在这种情况下字段不是必填项怎么办?您试图强制用户输入所有字段,即使它不是强制性的。
          • 这只是我表单中 5 个字段中的两个。在我的例子中,4 个字段是强制性的,一个不是,所以如果他们把它留空,它会发送一个 NULL。但就我而言,我不必担心会覆盖现有数据,因为每次提交都是独一无二的。这只是一种快速简单的方法,可以确保如果数据在数据库中,它不会被空值覆盖。
          • 这里的问题是关于覆盖表中的现有数据。所以这不可能是一个答案。
          • 问题指出,如果他们将字段留空,它将用 NULL 值覆盖数据库中的数据。我在这里要说明的是,通过要求填写这些字段,这不会发生。所以这是一个答案,虽然可能不是最好的。鉴于我的经验,我现在可以提供什么。
          • 别以为我小看了你。请参阅我在帖子中的回答。与其做所有的烂摊子,不如展示桌子上的东西。如果用户希望清除,他可以更新。如果保留不同的数据。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-08
          • 2018-07-23
          • 2014-06-08
          • 2018-12-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多