вставить несколько значений в один атрибут

У меня две таблицы в одной БД,

   tbl_language: tbl_users
   lang_id lang_name user_id user_name user_lang
   1 Английский                                 
   2 Испанский                                 
   3 Немецкий
   4 Португальский

У меня есть PHP-код для выбора языков из tbl_lang. Теперь у меня есть множественный выбор в форме, где пользователи могут выбирать более одного языка. Вставляя значения в базу данных, я хочу сохранить несколько языковых значений в одном столбце / атрибуте. Где атрибут user_lang хранит только lang_ids tbl_language, разделенные запятой (,).

подобно

   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 

Related of "вставить несколько значений в один атрибут"

Из вашей установки, учитывая, что 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- го уровня:

 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%') 

Это то, что вы хотите:

Файл 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; } 

Как и в предыдущем марке B, я не буду хранить несколько значений в одном столбце – это плохая практика. group_concat второй таблице вы можете сохранить одну строку на один язык и все равно достичь требуемого результата с помощью 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 

вы можете увидеть пример здесь

Во-первых, да, не размещение нескольких значений в одном поле, ячейке таблицы или элементе массива является официальным ответом. Однако, когда вам нужно:

  1. Используемый тип поля является целым или большим целым числом
  2. Использовать значения кода, которые являются простыми числами
    • 3 == Английский
    • 5 == Французский
    • 7 == Испанский
    • 11 == Итальянский
  3. Храните продукт всего, что применяется в поле.
    • 21 == Английский и испанский
    • 385 == Французский, испанский и итальянский
  4. Используйте функции modulo, чтобы определить, какие значения находятся в поле

     if ( field % 3 == 0 ) { english() ;} if ! (field % 5) { french() ;} 
  5. Такое же значение может появляться несколько раз
    • 9 == Английский, английский

Сначала я использовал эту технику для хранения измерений.

  • 3 == время
  • 5 == длина
  • 7 == масса
  • 11 == charge
  • 13 == температура
  • 17 == моль

Например, рычаг рычага первого момента будет иметь размерное значение 35 == масса * длины. Чтобы хранить дробные размеры в целых числах, я умножал дробные размеры на продукт всех из них и обрабатывал его при обработке.

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

Пожалуйста, не просите код извлекать дробные размеры. Все это было 40 лет назад в APL.