【问题标题】:Submitting multiple values on checkbox using PHP and SQL使用 PHP 和 SQL 在复选框上提交多个值
【发布时间】:2020-05-25 16:56:17
【问题描述】:

我正在尝试使用 HTML 表单创建一个网页,其中包括多个复选框及其各自的值。

我想创建一个布尔数组,它将数据发送到 SQL 服务器,换句话说,我想将复选框上的值分配给数据库中的几列。但是,即使我检查了复选框上的某些值,数据库中的值也始终为 0 或 false。

在调试时,我发现 $_POST["lang_list"] 有效,因此,我认为问题一定出在 foreach 循环中。

我是 PHP 和 SQL 的新手,所以我完全知道我的解决方案可能很糟糕。

HTML:

<div class="form-group>
    <div class="custom-checkbox">
        <input class="custom-control-input" name="lang_list[]" id="nj" type="checkbox" value="nj">
        <label class="custom-control-label" for="nj">NJ</label>
    </div>
    <div class="custom-checkbox">
        <input class="custom-control-input" name="lang_list[]" id="aj" type="checkbox" value="aj">
        <label class="custom-control-label" for="aj">AJ</label>
    </div>
    <div class="custom-checkbox">
        <input class="custom-control-input" name="lang_list[]" id="fj" type="checkbox" value="fj">
        <label class="custom-control-label" for="fj">FJ</label>
    </div>
</div>

PHP:

<?php

    require_once("config.php");

    if (!empty($_POST['lang_list'])) 
    {
        $checkboxes = $conn->real_escape_string($_POST['lang_list']);

        $bool_arr = array();
        $check_arr = array("aj","nj","fj");

        foreach ($check as $check_arr) 
        {
            array_push($bool_arr, in_array($check, $checkboxes) ? 1 : 0);
        }

        list ($aj, $nj, $fj) = $lang_bool;
        $sql = "INSERT INTO signups (aj, nj, fj) VALUES ('".$nj."', '".$aj."', '".$fj."')";

        if (!$result = $conn->query($sql)) 
        {
            die('There was an error running the query ['.$conn->error.']'); 
        }
        else 
        {
            echo "Thank you! We will contact you soon"; 
        }
    }
    else 
    {
        echo "Please fill Name and Email"; 
    }

?>

有人可以帮助我吗?谢谢

【问题讨论】:

  • foreach ($check as $check_arr) 应该是foreach ($check_arr as $check)
  • $_POST['lang_list'] 是一个数组,因此尝试在其上使用real_escape_string 毫无意义。
  • 警告:您的代码容易受到 SQL 注入攻击。您应该使用参数化查询和准备好的语句来帮助防止攻击者通过使用恶意输入值来破坏您的数据库。 bobby-tables.com 给出了风险解释,以及如何使用 PHP / mysqli 安全地编写查询的一些示例。 切勿将未经处理的数据直接插入您的 SQL。按照您现在编写代码的方式,有人可以轻松窃取、错误更改甚至删除您的数据。 (如前所述,您对 real_escape_string 的使用毫无意义)
  • $lang_bool 来自哪里?

标签: php html sql database forms


【解决方案1】:
<?php 
    require_once("config.php");

    if(!empty($_POST['lang_list'])) {
        $checkboxes = $_POST['lang_list']; // no meaning of real_escape_string on array

        $bool_arr = array();
        $check_arr = array("aj","nj","fj");

        foreach ($check_arr as $check) { // corrected loop flow & inside code
            $bool_arr[$check]  = in_array($check, $checkboxes) ? 1 : 0;
        }

        $sql = "INSERT INTO signups (aj, nj, fj) 
                VALUES ('".$bool_arr['aj']."', '".$bool_arr['nj']."', '".$bool_arr['fj']."')";

        if (!$result = $conn->query($sql)) {
            die('There was an error running the query [' . $conn->error . ']'); }
        else {
            echo "Thank you! We will contact you soon"; }
    }
    else {
        echo "Please fill Name and Email"; }
?>

【讨论】:

    【解决方案2】:

    对我来说!如果您不想像这样在 db 中添加未经检查的值,我会使用 in_array() 执行 if 语句来检查值是否存在:

    $arr = array("aj", "fj", "nj"); 
    
    if (in_array("aj", $arr, TRUE)) { 
        echo $arr[1]; 
      } else{ 
        echo "not found \n"; 
      } 
    
    if (in_array("fj", $arr, TRUE)) { 
        echo $arr[2];  
      } else { 
        echo "not found \n"; 
      }
    }
    if (in_array("nj", $arr, TRUE)) { 
        echo $arr[3]; 
      } else { 
        echo "not found \n"; 
      }
    }
    

    并且您的代码对 sql 注入开放,它易于使用准备语句并使您的代码安全:

    if(!empty($_POST['lang_list'])) {
        $checkboxes = $_POST['lang_list'];
    
        $bool_arr  = array();
        $check_arr = array("aj","nj","fj");
    
        foreach ($check_arr as $check) {
            array_push($bool_arr, in_array($check, $checkboxes) ? 1 : 0);
        }
        //No need list(); function but if you wanna use it then change it to
        list($aj, $fj, $nj) = $bool_arr;
        // Prepare an insert statement
        $sql = "INSERT INTO signups (aj, fj, nj) VALUES (?, ?, ?)";
    
        if($stmt = mysqli_prepare($conn, $sql)){
            // Bind variables to the prepared statement as parameters
            //Note : you can call values like this $check_arr[1]; $check_arr[2]; is well.
            mysqli_stmt_bind_param($stmt, "sss", $aj, $fj, $nj);
            if(mysqli_stmt_execute($stmt)){
                echo "Thank you! We will contact you soon";
            } else{
                echo "Please fill Name and Email";
            }
        }
    
        // Close statement
        mysqli_stmt_close($stmt);
    }
    

    我使用了procedural Procedural风格,我看到你也在使用procedural,你也可以检查面向对象的风格。

    更多信息请看这里:https://www.php.net/manual/en/mysqli.prepare.php

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 2013-06-06
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多