我有一个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']) . "',
)";
但是当我选中所有复选框时,我会“打开,打开,打开”或两个复选框,然后“打开”,这是什么意思? 答:没关系。忘了投入价值领域。
答案 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)
您的代码存在一些问题,例如:
name="languages"
毫无意义。您仍然没有使用此name
属性,删除此内容不会对您的代码产生任何影响。<select ...> ... </select>
和<input type="checkbox" ...
同样的目的,即选择多种语言。仅为此目的使用一个,而不是两个。 name
和value
属性,这就是为什么您没有使用$_POST
数组获取任何值的原因。在每个复选框输入元素中添加name
和value
属性。所以你的代码应该是这样的:
<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)
您的方法需要考虑以下几点:
$_POST
读取值时,您需要以某种方式解释数组。要向服务器传达您希望将复选框解释为一系列选项,标准是为它们命名后跟方括号:[]
我已完成的工作已添加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>
一旦您知道您正在按照您的意愿将值发送到PHP,您就可以使用希望使用的格式访问值:
// combine the languages, separated by commas
$my_string = implode(",", $_POST['languages']);
此代码会将数组$_POST['languages']
的所有元素组合成一个字符串,非常类似于您正在查找的字符串,例如german,english,french
。
考虑添加一些逻辑来检查意外或无效的值,包括空数组。