1

1つのDBに2つのテーブルがあります。

  tbl_language:tbl_users
  lang_id lang_name user_id user_name user_lang
  1英語                                 
  2スペイン語                                 
  3ドイツ語
  4ポルトガル語

tbl_langから言語を選択するためのPHPコードがあります。これで、ユーザーが複数の言語を選択できるフォームに複数の選択があります。データベースに値を挿入するときに、1つの列/属性に複数の言語値を格納したいと思います。user_lang属性は、コンマ(、)で区切られたtbl_languageのlang_idのみを格納します。

好き

  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

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

ただし、他の人が述べているように、おそらく3番目のレベルのテーブルを探す必要があります。

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

上で提案したMarcBのように、同じ列に複数の値を格納することはありません。これは悪い習慣です。2番目の表では、言語ごとに1行を保存しても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 に答える
0

まず、はい、1つのフィールド、スプレッドシートセル、または配列要素に複数の値を配置しないことが公式の答えです。ただし、次のことが必要な場合:

  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

小数次元を抽出するためのコードを要求しないでください。これはすべてAPLで40年前のことです。

于 2013-03-05T16:46:12.347 に答える