У меня есть HTML-форма, как показано ниже:
На данный момент в будущем будет 3 языка, поля с префиксом _lang
будут генерировать динамически.
Это поля ввода (name_en
, name_ru
и т.д. Являются заполнителями).
Таблицы MySQL выглядят так:
Parent
стол
Id UserId
Details
таблица
Id ParentId Name Description Language
Я хотел бы вставить данные в Details
:
Id ParentId Name Description Language
1 1 FooEn FooBarEn EN
2 1 FooRu FooBarRu RU
3 1 FooFr FooBarFr FR
И в Parent
стол:
Id UserId
1 123
После отправки формы я могу вставить успешно данные в Parent
таблицу. Я столкнулся с проблемой вставки этих данных в таблицу Details
. У меня нет идеи, как я могу объединить name_en
и description_en
как 1 запись.
В PHP у меня есть $language_array
со всеми возможными языками (для этого примера en
, ru
, fr
) также я использую substr
для получения кода языка из данных, но что дальше? Должен ли я использовать foreach
как-то?
foreach($language_array as $k=>$v) {
// there I've missed my mind
}
Впервые я столкнулся с такой структурой HTML-формы. Пожалуйста, дайте мне какое-нибудь предложение.
Простейшим решением было бы получить поля формы из ваших данных $_POST
.
Предполагая, что ваши данные $_POST
имеют следующую структуру.
Array
(
[name_en] => name_en
[name_ru] => name_ru
[name_fr] => name_fr
[description_en] => description_en
[description_ru] => description_ru
[description_fr] => description_fr
)
Затем вы можете использовать свой $language_array
для перебора и извлечения соответствующих значений полей формы $_POST
следующим образом: $_POST['fieldname_'. $lang]
$_POST['fieldname_'. $lang]
$languages = ['en', 'fr', 'ru'];
$sql = 'INSERT INTO 'table_name' ('Name', 'Description', 'Language') VALUES (?, ?, ?)';
if ($stmt = mysqli_prepare($conn, $sql)) {
mysqli_stmt_bind_param($stmt, 'sss', $name, $description, $language);
foreach ($languages as $lang) {
$name = array_key_exists('name_' . $lang, $_POST) ? $_POST['name_' . $lang] : null;
$description = array_key_exists('description_' . $lang, $_POST) ? $_POST['description_' . $lang] : null;
$language = strtoupper($lang);
mysqli_stmt_execute($stmt);
}
}
Подробнее о
mysqli
и использовании готовых операторов см. В документации по PHP.
Альтернативным решением было бы создать список полей формы, которые вы хотите отобразить пользователю.
$fields = ['name' => 'Name', 'description' => 'Description'];
$languages = ['en', 'ru', 'fr'];
Затем вы можете перебирать все поля и язык для их отображения в браузере.
Обратите внимание, что имена полей ввода имеют префикс их связанного языка в виде массива полей, таких как
LANG[field]
foreach ($fields as $fieldName => $section) {
echo '<fieldset>';
echo '<legend>' . $section. '</legend>';
foreach ($languages as $language) {
$inputName = strtoupper($language) . '[' . $fieldName . ']';
$placeholder = $fieldName . '_' . $language;
echo '<p>';
echo '<label>';
echo '<input type="text" name="' . $inputName . '" placeholder="' . $placeholder . '"/>';
echo '</label>';
echo '</p>';
}
echo '</fieldset>';
}
Результирующая форма:
Ваши данные $_POST
будут иметь следующую структуру
Array
(
[EN] => Array
(
[name] => name_en
[description] => description_en
)
[RU] => Array
(
[name] => name_ru
[description] => description_ru
)
[FR] => Array
(
[name] => name_fr
[description] => description_fr
)
)
Это позволит вам вставлять отдельные записи для каждого языка, итерируя значения формы $_POST
виде массива связанных полей языка.
$sql = 'INSERT INTO 'table_name' ('Name', 'Description', 'Language') VALUES (?, ?, ?)';
if ($stmt = mysqli_prepare($conn, $sql)) {
mysqli_stmt_bind_param($stmt, 'sss', $name, $description, $language);
foreach ($_POST as $language => $fields) {
$name = array_key_exists('name', $fields) ? $fields['name'] : null;
$description = array_key_exists('description', $fields) ? $fields['description'] : null;
mysqli_stmt_execute($stmt);
}
}
Отказ от ответственности: поскольку информация о parent
таблице или ее ассоциации (ассоциациях) не была предоставлена, она была исключена из моего ответа. Я предполагаю, что ОП сможет определить, как манипулировать ответом, чтобы удовлетворить добавление родителя к запросу.