将下拉列表中的多个复选框插入mysql db

时间:2017-04-25 16:31:43

标签: javascript php

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

 <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>

现在 - 这是我的查询,用于将注册表单插入到数据库中的users表中[代码的相关部分,另一个工作正常]:

 $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']) . "', 
        )";

但是当我选中所有复选框时,我会“打开,打开,打开”或两个复选框,然后“打开”,这是什么意思? 答:没关系。忘了投入价值领域。

4 个答案:

答案 0 :(得分:4)

如下面的代码所示,首先在所有复选框中添加相同的'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.',':
}

现在运行查询以在数据库中存储teh值。

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

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

    mysqli_query($db,$sql); 

答案 1 :(得分:0)

两部分:

第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用户(语言)VALUES('$ languages')”;

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

答案 2 :(得分:0)

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

  • div 元素中使用name="languages"毫无意义。您仍然没有使用此name属性,删除此内容不会对您的代码产生任何影响。
  • 不确定您为什么同时使用<select ...> ... </select><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 :(得分:0)

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

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

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