【问题标题】:updating the mysql database table based on checkboxes values which in array using PHP根据使用PHP数组中的复选框值更新mysql数据库表
【发布时间】:2017-03-15 06:40:48
【问题描述】:

我是 PHP 编程新手。

我正在开发一个 PHP 项目,我正在从 mysql 数据库中填充一个动态表,其中每一行都有一个复选框字段。

<?php                                          
 $sql = "select * from caseinstruction where fir_nos='$fir_nos'";
      $result = $con->query($sql);

       if ($result->num_rows > 0) {
      // output data of each row
       $i = 1;
       while($row = $result->fetch_assoc()) {  

          echo "<tr><td class='text-center'>". $i++ ."</td>
              <td><input type='text' value='{$row['Instructions']}' class='form-control input-sm' style='border:none'></td>
              <td class='text-center form-group'><input type='checkbox' name='foo[]' value='1'></td>
          </tr>\n";
        }
       }
?>

它运行良好。当我想用选中的值更新同一个 mysql 表时,就会出现问题。假设如果用户选择了一个复选框,那么它将在 mysql 表中反映 1,如果没有选择任何选项,则它将在 mysql 表中反映 0。

我绑定运行 foreach 命令,它会按预期填充值,但是当我运行更新命令时,它只反映 0。请帮助我。

<?php
require('../php-includes/connect.php');

if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
    $fir_nos = $_POST['fir_nos'];
    $cins = $_POST['foo'];

    echo '<pre>';
    print_r($cins);
    echo '</pre>'

    foreach ($$cins as $value) {
        $sql="update mytable set report02='$value'";
        $result = $con->query($sql);
    }
}

我在这方面遗漏了一些东西。请帮我。提前谢谢大家。

# | Instruction | value |
-------------------------
1 | abc         | 1     | //checked
2 | cdf         | 0     | //unckecked
3 | efg         | 1     | //checked
-------------------------

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您的代码中有一些错误:

    首先:如果您希望能够获得选中的复选框,则需要为每个复选框添加一个标识符。例如,如果您在表 caseinstruction 中有一个列 id,您可以使用:

    <input type='checkbox' name='foo[]' value='{$row['id']}'>
    

    第二:您的代码中有错字。将$$cins 更改为$cins

    第三:我不知道你想对更新查询做什么。由于您的示例没有指定任何WHERE-clause,因此您只会获得多个更新查询,例如update mytable set report02='83'update mytable set report02='84' 等,这将在循环中使用一个值再次更新表中的所有行。

    相反,您需要使用update mytable set report02 = 1 where id = '83' 之类的内容指定要更新的行和列。例如:

    <?php
    require('../php-includes/connect.php');
    
    if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
        $fir_nos = $_POST['fir_nos'];
        $cins = $_POST['foo'];
    
        foreach ($cins as $value) {
            $sql="update mytable set report02 = 1 where id = '$value'";
            $result = $con->query($sql);
        }
    }
    

    我建议使用mysqli_real_escape_string() 来防止sql 注入。并且出于性能原因,只对每个复选框值使用一个更新调用而不是一个:

    <?php
    require('../php-includes/connect.php');
    
    if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
        $fir_nos = $_POST['fir_nos'];
        $cins = $_POST['foo'];
    
        $value = implode(',',$cins); // JOIN ALL ID INTO ONE COMMA SEPARATED STRING
        $value = mysqli_real_escape_string($con, $value); //PREVENT SQL-INJECTION
        // SET VALUE 1 FOR ALLA CHECKED:
        $con->query("update mytable set report02 = 1 where id IN($value)");         
        // SET VALUE 0 FOR ALL THE REST IN THE TABLE:
        $con->query("update mytable set report02 = 0 where id NOT IN($value)"); 
    }
    

    【讨论】:

    • 非常感谢,这正是我所需要的。谢谢
    • 我还有一个疑问,当复选框被选中时它正在更新1,但我还需要为未选中的行更新0,请指导我也实现这一点..跨度>
    • 只需更新数据库表中的所有行并将它们设置为 0 update mytable set report02 = 0,然后再为被检查的行更新为 1...
    • 我已经更新了我的答案,以展示如何更新未选中的内容。还使用一个 db-call 而不是 foreach-loop 优化了代码。让我知道这是否适合您。
    【解决方案2】:

    您需要在以下行中将 $$cins 更改为 $cins。您正在使用双美元符号。

    foreach ($$cins as $value) {
    

    }

    【讨论】:

    • 是的,我已经改变了。我遵循了迈克尔的解决方案,它工作正常。
    猜你喜欢
    • 2012-06-03
    • 2012-08-16
    • 2016-12-14
    • 1970-01-01
    • 2018-09-03
    • 2017-06-06
    • 1970-01-01
    • 2013-09-27
    • 2014-10-20
    相关资源
    最近更新 更多