我在一个数据库中有两个表,
tbl_language: tbl_users lang_id lang_name user_id user_name user_lang 1 English 2 Spanish 3 German 4 Portuguese
我有PHP代码从tbl_lang中选择语言,现在我在一个表单中有一个多选项,用户可以选择多种语言。在数据库中插入值时,我想在一个列/属性中存储多个语言值。其中user_lang属性仅存储以逗号(,)分隔的tbl_language的lang_ids。
喜欢
tbl_users: user_id user_name user_lang 1 ABC 1,2 2 XYZ 1,4
如何使用PHP和MySQL实现这一目标?
我这里有示例代码:
<?php
$user_name = $_POST['user_name'];
$user_lang = $_POST['user_lang']; // user_lang as array from multiple select
$qry = ""; // I need help with this query
答案 0 :(得分:2)
从您的设置中,考虑user_id
是自动增量PK:
$user_name = mysql_real_escape_string($_POST['user_name']);
$user_lang = mysql_real_escape_string(implode(',', $_POST['user_lang']);
$sql = "INSERT INTO tbl_users (`user_name`, `user_lang`) VALUES ('{$user_name}', '{$user_lang}');
Howerver,正如其他人所提到的,你应该寻找一个3 rd 级别的表:
tbl_users_lang
user_id lang_id
并插入(例如,没有错误处理,只是一个建议)
$user_name = mysql_real_escape_string($_POST['user_name']);
$sql = "INSERT INTO tbl_users (`user_name`) VALUES ('{$user_name}');"
mysql_query($sql);
$user_id = mysql_insert_id();
foreach ($user_lang as $lang) {
$lang = mysql_real_escape_string($lang);
$sql = "INSERT INTO tbl_users_lang (`user_id`, `lang_id`) VALUES ({$user_id}, '{$lang}');"
mysql_query($sql);
}
作为奖励,使用此查询,您可以为任何给定用户的语言列表获取逗号分隔行。以为您可能会感兴趣:
SELECT DISTINCT u.user_id, u.user_name, GROUP_CONCAT(l.lang_name)
FROM `tbl_users` as u
LEFT JOIN `tbl_users_lang` as ul ON u.user_id = ul.user_id
LEFT JOIN `tbl_language` as l on ul.lang_id = l.lang_id
-- add WHERE clause here to filter (ex : WHERE u.user_name LIKE 'John%')
答案 1 :(得分:1)
这就是你想要的:
档案view.html
<form method="POST" action="test.php">
<label>Select langs: </label>
<select name="languages[]" multiple="yes" size="5">
<!--OR PUT lang id's instead of "en, fr, de" -->
<option value="en">English</option> <option value="fr">French</option> <option value="de">Deutsch</option>
</select>
<button type="submit">Sub the form</button>
</form>
文件:test.php
<?php
// check if form submitted if so do
if ( !empty($_POST) ){
//$_POST['languages'] is an array itself
$langs = implode(', ', $_POST['languages']);
//$langs you want to insert into the table:
print $langs;
}
答案 2 :(得分:0)
与上面提到的Marc B一样,我不会在同一列中存储多个值 - 这是不好的做法。您可以在第二个表中为每种语言保存一行,并使用group_concat
仍然可以达到所需的结果,如下所示:
select t2.user_id, t2.user_name,
group_concat(t1.lang_name separator ', ') as language
from tbl_users, tbl_language
where t1.lang_id = t2.user_lang
您可以看到示例here
答案 3 :(得分:0)
首先,是的,没有将多个值放入一个字段,电子表格单元格或数组元素是官方答案。但是,当您需要:
使用模数函数确定字段中的值
if ( field % 3 == 0 ) { english() ;}
if ! (field % 5) { french() ;}
我首先使用这种技术来存储尺寸。
例如,第一力矩杠杆臂的尺寸值为35 ==质量*长度。 为了将小数维度存储在一个整数中,我将小数维度乘以所有小数的乘积并在处理中处理它。
请不要让代码提取分数维。所有这些都是40年前的APL。