1

我在一个数据库中有两个表,

  tbl_language:tbl_users
  lang_id lang_name user_id user_name user_lang
  1 英语                                 
  2 西班牙语                                 
  3 德语
  4 葡萄牙语

我有 PHP 代码可以从 tbl_lang 中选择语言,现在我可以在表单中进行多项选择,用户可以选择多种语言。在数据库中插入值时,我想将多个语言值存储在一个列/属性中。其中 user_lang 属性将仅存储 tbl_language 的 lang_ids,以逗号 (,) 分隔。

喜欢

  tbl_users:
  user_id 用户名 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
4

4 回答 4

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}');

但是,正如其他人所提到的,您可能应该寻找第三级表:

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%')
于 2012-08-06T04:00:30.233 回答
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;

 }
于 2012-08-06T04:01:29.970 回答
0

首先,是的,官方的答案是不将多个值放入一个字段、电子表格单元格或数组元素中。但是,当您需要:

  1. 要使用的字段类型是整数或大整数
  2. 使用素数的代码值
    • 3 == 英语
    • 5 == 法语
    • 7 == 西班牙语
    • 11 == 意大利语
  3. 将所有适用于该领域的产品存储起来。
    • 21 == 英语和西班牙语
    • 385 == 法语、西班牙语和意大利语
  4. 使用模函数确定字段中的值

    if ( field % 3 == 0 ) {  english() ;}
    if ! (field % 5) { french() ;}
    
  5. 同一个值可以出现多次
    • 9 == 英语,英语

我首先使用这种技术来存储尺寸。

  • 3 == 时间
  • 5 == 长度
  • 7 == 质量
  • 11 == 收费
  • 13 == 温度
  • 17 == 摩尔

例如,第一力矩杠杆臂的尺寸值为 35 == 质量 * 长度。为了将分数维数存储在整数中,我将分数维数乘以所有分数的乘积并在处理中进行处理。

  • 255255 == 3*5*7*11*13*17
  • 力 == 质量 * 长度 / (秒^2)
  • 力 == ( 7 * 5 / ( 3 * 3 ) ) * 255255 * 255255
  • 力 == 253381002875

请不要要求提取小数维度的代码。这一切都是 40 年前的 APL。

于 2013-03-05T16:46:12.347 回答
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

你可以在这里看到一个例子

于 2012-08-06T04:06:38.060 回答