在单个属性中插入多个值

时间:2012-08-06 03:42:02

标签: php mysql arrays loops

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

  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

4 个答案:

答案 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)

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

  1. 要使用的字段类型是整数或大整数
  2. 使用作为素数的代码值
    • 3 ==英语
    • 5 ==法语
    • 7 ==西班牙文
    • 11 ==意大利语
  3. 将所有适用的产品存储到现场。
    • 21 ==英语和西班牙语
    • 385 ==法语,西班牙语和意大利语
  4. 使用模数函数确定字段中的值

    if ( field % 3 == 0 ) {  english() ;}
    if ! (field % 5) { french() ;}
    
  5. 相同的值可以多次出现
    • 9 ==英语,英语
  6. 我首先使用这种技术来存储尺寸。

    • 3 ==时间
    • 5 == length
    • 7 ==质量
    • 11 ==充电
    • 13 ==温度
    • 17 == moles

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

    • 255255 == 3 * 5 * 7 * 11 * 13 * 17
    • force == mass * length /(second ^ 2)
    • force ==(7 * 5 /(3 * 3))* 255255 * 255255
    • force == 253381002875

    请不要让代码提取分数维。所有这些都是40年前的APL。