【问题标题】:How to update MySQL database using only non empty user input fields如何仅使用非空用户输入字段更新 MySQL 数据库
【发布时间】:2019-12-26 09:06:36
【问题描述】:

我有一个数据库,我正在尝试根据一些用户输入表单进行更新。我正在使用以下代码来更新 MySQL 数据库。

$query = "UPDATE supervisorupdate SET shift1PinCount =?, shift2PinCount =?, shift3PinCount =?, shift4PinCount =? WHERE Code=?";

$stmt = mysqli_stmt_init($conn);

if(!mysqli_stmt_prepare($stmt, $query)){
   echo "updating supervisorupdate table when click save button SQL statement failed";
}else{
   mysqli_stmt_bind_param($stmt,"iiiis", $shift1PinCount, $shift2PinCount, $shift3PinCount, $shift4PinCount, $Code);
   mysqli_stmt_execute($stmt);
   $result = mysqli_stmt_get_result($stmt);
}

这里$shift1PinCount$shift2PinCount$shift3PinCount$shift4PinCount 是我从用户输入表单中获得的一些$_POST 变量

我需要什么

假设如果用户没有在 $shift1PinCount 字段中键入任何内容,则查询不应将任何内容更新到 MySQL 数据库的 shift1PinCount 列中。

我的问题

使用我的查询,它总是更新所有 MySQL 列,无论用户是在用户输入表单中键入内容还是将其留空。有人知道怎么做吗?

【问题讨论】:

  • 1.在读取请求参数时,检查其中哪些可以在更新查询中使用。 2.然后重新构造sql语句。 3. 传递输入数据并执行。
  • 你能给我一些示例代码吗?
  • 如果用户没有键入任何内容,那么默认值应该是多少?
  • @tcadidot0 如果用户没有在用户表单中键入任何内容,则数据库不应更改相应字段的任何内容。意味着如果数据库中已经存在一些值,它应该保持不变
  • @Henry 没问题。用户可以留空字段并更新数据库。这里的条件是,如果用户保留一些字段为空,那么数据库的数据将保持不变。我在将现有数据放入表单时遇到了其他问题。这就是为什么我不能这样做

标签: php mysql forms post


【解决方案1】:

尝试将 if 条件放在帖子数据上,例如

<?php
     if(isset($_POST["shift1"]))
{

    $query = "
        Update product SET shift1 = ?,
    ";
    if(isset($_POST["shift2"]))
    {
        $query .= "
         shift2 = ? ,
        ";
    }
    if(isset($_POST["shift3"]))
    {
        $query .= "
         shift3 = ? ,
        ";
    }if(isset($_POST["shift4"]))
    {
        $query .= "
         shift4 = ? ,
        ";
    }
    $query .=" Where Code=?";
    $stmt = mysqli_stmt_init($conn);

    if(!mysqli_stmt_prepare($stmt, $query)){
       echo "updating supervisorupdate table when click save button SQL statement failed";
    }else{
       mysqli_stmt_bind_param($stmt,"iiiis", $_POST["shift1"], $_POST["shift1"], $_POST["shift1"], $_POST["shift1"], $Code);
       mysqli_stmt_execute($stmt);
       $result = mysqli_stmt_get_result($stmt);
    }
}
?>

【讨论】:

  • 这只是检查一种可能的组合。可能有很多情况,例如$_POST['shift1PinCount']未设置或$_POST['shift2PinCount']未设置或$_POST['shift1PinCount']$_POST['shift2PinCount']未设置等。那是一大段代码。我相信还有其他简单或整洁的方法可以做到这一点。
  • @Anu 使用 && , || 运算符然后检查它............像这样:@987654326 @
  • 是的,这样做是可以的。但我的意思是,有四个这样的输入,有很多组合和代码。应该有更快或更有效的方法来做到这一点。我只是在等待这样的解决方案
  • @Anu:组合会影响这个吗?因为您只需要检查四个 $_POST 值。从我的角度来看,另一种方法是创建输入字段数组并通过循环检查它
  • 是的,当然会影响。例如,以您发布的场景为例。它只检查条件if(isset($_POST['shift1PinCount']))。假设如果 $_POST['shift1PinCount'] 和 `$_POST['shift2PinCount'] 未设置,它将不会执行您的代码。所以我需要编写所有可能的组合代码以满足所有条件。而且有很多组合。
【解决方案2】:

尝试了一些方法后,我可以通过以下方式完成它。但我相信还有更好的方法可以做。如果有人知道更好的方法,请发布

if(isset($_POST['shift1PinCount']) && !empty($_POST['shift1PinCount'])){
    pinCountUpdateQuery("shift1PinCount", $_POST['shift1PinCount'], $Code);
}

if(isset($_POST['shift2PinCount']) && !empty($_POST['shift2PinCount'])){
    pinCountUpdateQuery("shift2PinCount", $_POST['shift2PinCount'], $Code);
}

if(isset($_POST['shift3PinCount']) && !empty($_POST['shift3PinCount'])){
    pinCountUpdateQuery("shift3PinCount", $_POST['shift3PinCount'], $Code);
}

if(isset($_POST['shift4PinCount']) && !empty($_POST['shift4PinCount'])){
    pinCountUpdateQuery("shift4PinCount", $_POST['shift4PinCount'], $Code);
}

然后使用下面的函数

function pinCountUpdateQuery($shiftPinCountDb, $shiftPinCountUserForm, $Code){
  global $conn;
    $query = "UPDATE supervisorupdate SET ".$shiftPinCountDb." =? WHERE Code=?";
        $stmt = mysqli_stmt_init($conn);
        if(!mysqli_stmt_prepare($stmt, $query)){
            echo "updating supervisorupdate table when click save button SQL statement failed";
        }else{
            mysqli_stmt_bind_param($stmt,"is", $shiftPinCountUserForm, $Code);
            mysqli_stmt_execute($stmt);
            $result = mysqli_stmt_get_result($stmt);
        }
}

【讨论】:

    【解决方案3】:

    一种选择是使用COALESCE(),如下所示:

    UPDATE supervisorupdate SET 
        shift1PinCount = COALESCE(?, shift1PinCount),
        shift2PinCount = COALESCE(?, shift2PinCount),
        shift3PinCount = COALESCE(?, shift3PinCount),
        shift4PinCount = COALESCE(?, shift4PinCount)
    WHERE Code = ?
    

    这句话是:如果没有为给定列的输入提供值,则保留现有值。

    【讨论】:

    • 我试过了,但是数据库的相应列值相对于空的用户输入字段更新为“0”。
    【解决方案4】:

    伪代码

    param1 = req get param1
    param2 = req get param2
    .
    .
    paramN = req get paramN
    
    $query = "UPDATE supervisorupdate SET "
    bool can_be_updated = false
    # now add prepare the rest of sql for inputs
    for range of params count to be updated
        if current param is valid then
            if not can_be_updated then
                can_be_updated = true
            end if
            if current param number is > 1 < param count then
                query += ", "
            end if
            query += 'current param name = ?'
        end if
    end loop
    
    # now complete sql
    if can_be_updated then 
        $query += ' WHERE Code=?'
        .
        .
        # bind sql with valid param inputs like one of the following
        # option 1: if only 2 are valid
        call rel_mysql_func_to_bind_params($stmt,"iiiis", valid param 1, valid param M, $Code);
        # or
        # option N: if all are valid
        call rel_mysql_func_to_bind_params($stmt,"iiiis", $shift1PinCount, $shift2PinCount, $shift3PinCount, $shift4PinCount, $Code);
    
        # now execute your stmt
        relevant_mysql_func_to_execute($stmt);
    else
        # what else you want, perform here
    end if
    

    其他
    请参阅针对 Java @
    How to perform a mysql statement with dynamic count of where clauses in java.sql

    回答的类似要求

    【讨论】:

    • 将伪代码与写得不好的 mysqli 混合在一起是一个糟糕的主意。这比实际代码要长得多。
    • @Dharman 我认为 Ravinder Reddy 的方法可以与 php mysql 编码方式一起使用,尽管它可能很复杂(也许可以使用更简单的算法来完成)。毕竟,我认为解决这个问题只有根据条件构造查询
    • @anu:作为hammer还提到一次尝试执行记录的多个字段会很好。否则,您最终会在一条记录上执行 1 到 N 次更新调用。试试我上面提到的方法。
    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多