【问题标题】:Insert dropdown multiple checkboxs to mysql db将下拉多个复选框插入到 mysql db
【发布时间】:2017-04-25 16:31:42
【问题描述】:

我有一个 register.php,我正在尝试将数据插入用户表中。我遇到的问题是“语言”字段 - 我创建了一个带有多个复选框的下拉列表。我当然希望用户能够在他的个人资料中插入他说的一种以上的语言。这是注册表的一部分:

 <script type="text/javascript">

         var expanded = false;

        function showCheckboxes() {
          var checkboxes = document.getElementById("checkboxes");
          if (!expanded) {
            checkboxes.style.display = "block";
            expanded = true;
          } else {
            checkboxes.style.display = "none";
            expanded = false;
          }
        }   
        </script>


        <tr>
      <td>Languages</td>
      <td dir="rtl">
          <div class="multiselect" dir="rtl">
          <div class="selectBox" onclick="showCheckboxes()" dir="rtl">
        <select>
        <option>Select an language</option>
        </select>
        <div class="overSelect" dir="rtl"></div>
        </div>
        <div id="checkboxes" name="languages">
        <label for="one">  
            <input type="checkbox" id="one" />German</label>
            <label for="two">
            <input type="checkbox" id="two" />English</label>
            <label for="three">
            <input type="checkbox" id="three" />French</label>
    </div>
  </div>  
      </td>
      </tr>

现在 - 这是我将注册表单插入数据库中的用户表的查询[代码的相关部分,其他部分工作正常]:

 $languages= mysqli_real_escape_string($db, $_POST['languages']);

        $sql="INSERT INTO users(
       ....
         languages, 
        ) 

        VALUES(...
        '$languages', 
                )";

        mysqli_query($db,$sql);  

如果例如用户将复选框标记为“english”和“german”,那么插入数据的正确方法是什么,那么数据库中的语言字段将是这样的:“german,english”?至少目前没有插入任何内容。

更新:根据这里的答案,我写了这个:

 <td>Languages</td>
      <td dir="rtl">
          <div class="multiselect" dir="rtl">
          <div class="selectBox" onclick="showCheckboxes()" dir="rtl">
        <select>
        <option>Select an option</option>
        </select>
        <div class="overSelect" dir="rtl"></div>
        </div>
        <div id="checkboxes">
        <label for="one">  
            <input type="checkbox"  id="one" name="languages[]">German</label>
            <label for="two">
            <input type="checkbox" id="two" name="languages[]" >English</label>
            <label for="three">
            <input type="checkbox" id="three" name="languages[]">French</label>
    </div>
  </div>  
      </td>

还有:

$sql="INSERT INTO users(
...
 languages,
...
) 

VALUES(
...,
'" . implode(",", $_POST['languages']) . "', 
        )";

但是当我选中所有复选框时,我得到“开,开,开”或两个复选框,然后是“开,开” - 这是什么意思? 答:没关系。忘记放值字段了。

【问题讨论】:

  • 没有name="" 属性的输入字段将不会被发送到 PHP 脚本!
  • inputlabel 字段中?可能不是编写那段代码的最佳方式。
  • 我看不出有什么问题,如果像 english,german 这样的值被插入到数据库中,您可以轻松地将其转换为数组,无论是使用 PHP - explode - 还是 JS - .split().
  • 您的代码可能容易受到SQL injection attacks 的攻击。您应该使用mysqliPDO 准备好的语句和this post 中所述的绑定参数。

标签: javascript php


【解决方案1】:

如以下代码所示,首先为所有复选框添加相同的'name'属性。这样您就可以将用户选择的所有选项抓取到 PHP 脚本中的数组中。

<input type="checkbox" id="one" name="language[]" />German</label>
<label for="two">
<input type="checkbox" id="two" name="language[]" />English</label>
<label for="three">
<input type="checkbox" id="three" name="language[]" />French</label>

现在在 PHP 脚本中,您可以将选定的值抓取到 PHP 数组中。

$languages= mysqli_real_escape_string($db, $_POST['language']);

现在要将所选语言添加到数据库,您需要编写一个包含 $languages 数组中所有值的字符串,因为您有一个列来存储数据库中的所有语言。您可以使用逗号作为分隔符来组成字符串,如下面的代码所示。

$selectedLanguages = "";
foreach($languages as $value){
    $selectedLanguages .= $value.',':
}

现在您运行一个查询以将这些值存储在数据库中。

    $sql="INSERT INTO users(
   ....
     languages, 
    ) 

    VALUES(...
    '{$selectedLanguages}', 
            )";

    mysqli_query($db,$sql); 

【讨论】:

    【解决方案2】:

    您的代码存在一些问题,例如:

    • div 元素中使用 name="languages" 毫无意义。无论如何,您都没有使用此 name 属性,删除它不会对您的代码产生任何影响。
    • 不知道您为什么同时使用&lt;select ...&gt; ... &lt;/select&gt;&lt;input type="checkbox" ... 用于完全相同的目的,即选择多种语言。为此目的只使用一个,而不是两个。
    • 您的复选框元素中没有namevalue 属性,这就是为什么您没有使用$_POST 数组获得任何值的原因。在每个复选框输入元素中添加 namevalue 属性。

    所以你的代码应该是这样的:

    <div id="checkboxes">
        <label for="one">  
        <input type="checkbox" name="languages[]" value="german" id="one" />German</label>
        <label for="two">
        <input type="checkbox" name="languages[]" value="english" id="two" />English</label>
        <label for="three">
        <input type="checkbox" name="languages[]" value="french" id="three" />French</label>
    </div>
    

    随后,您需要通过以下方式更改您的 SQL 查询,

    $sql="INSERT INTO users(..., languages, ...) 
    VALUES(..., '" . implode(",", $_POST['languages']) . "', ...)";
    

    旁注:了解prepared statement,因为现在您的查询容易受到 SQL 注入攻击。另见how you can prevent SQL injection in PHP

    【讨论】:

      【解决方案3】:

      两部分:

      第 1 部分:更改 HTML 以便脚本接收 $_POST['languages'] 的数组

      HTML 应如下所示:

      <input type=checkbox name="languages[]" value="German">German
      <input type=checkbox name="languages[]" value="french">french
      <input type=checkbox name="languages[]" value="english">english
      

      第 2 部分: 我建议使用 php 函数 serialize() 将数组转换为字符串,而不是将逗号分隔的值存储在数据库中。

      示例:

      $languages = serialize($_POST['languages']; $sql="INSERT INTO users(languages) VALUES('$languages')";

      也:上面的代码是不安全的。您应该在存储到数据库之前清理用户的输入。

      【讨论】:

        【解决方案4】:

        您的方法需要考虑以下几点:

        1. 为了让 PHP 访问您的值,每个复选框都需要一个名称和一个值。
        2. 在 PHP 中从 $_POST 读取值时,您需要以某种方式解释数组。

        第 1 部分:让 PHP 可以访问它们

        要与服务器通信,您希望复选框被解释为一系列选项,标准是给它们一个名称,后跟方括号:[]

        我所做的是将name="languages[]" 添加到您的输入中以对它们进行分组并将它们称为语言,并添加value="..." 以为其分配一个值。

        <label for="one">  
            <input type="checkbox" id="one" name="languages[]" value="german" /> German
        </label>
        <label for="two">
            <input type="checkbox" id="two" name="languages[]" value="english" /> English
        </label>
        <label for="three">
            <input type="checkbox" id="three" name="languages[]" value="french" /> French
        </label>
        

        第 2 部分:用 PHP 阅读它们

        一旦您知道要按照您的意愿将值发送到 PHP,您就可以按照您希望使用的格式访问这些值:

        // combine the languages, separated by commas
        $my_string = implode(",", $_POST['languages']);
        

        此代码会将数组$_POST['languages'] 的所有元素组合成一个字符串,就像您要查找的字符串一样,例如german,english,french.

        考虑添加一些逻辑来检查意外或无效值,包括空数组。

        【讨论】:

        • @Toto88 我相信您现在知道这一点,但您在更新中错过的是复选框上的 value 属性。祝你的项目好运。
        猜你喜欢
        • 1970-01-01
        • 2020-11-07
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-19
        • 2014-10-31
        相关资源
        最近更新 更多