У меня две таблицы в одной БД,
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
Из вашей установки, учитывая, что 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
вы можете увидеть пример здесь
Во-первых, да, не размещение нескольких значений в одном поле, ячейке таблицы или элементе массива является официальным ответом. Однако, когда вам нужно:
Используйте функции modulo, чтобы определить, какие значения находятся в поле
if ( field % 3 == 0 ) { english() ;} if ! (field % 5) { french() ;}
Сначала я использовал эту технику для хранения измерений.
Например, рычаг рычага первого момента будет иметь размерное значение 35 == масса * длины. Чтобы хранить дробные размеры в целых числах, я умножал дробные размеры на продукт всех из них и обрабатывал его при обработке.
Пожалуйста, не просите код извлекать дробные размеры. Все это было 40 лет назад в APL.