Вставка данных в таблицу MySQL из многоязычной HTML-формы через PHP

0

У меня есть HTML-форма, как показано ниже:

Изображение 174551

На данный момент в будущем будет 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-формы. Пожалуйста, дайте мне какое-нибудь предложение.

Теги:

1 ответ

1
Лучший ответ

Простейшим решением было бы получить поля формы из ваших данных $_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>';
}

Результирующая форма:

Изображение 174551

Ваши данные $_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 таблице или ее ассоциации (ассоциациях) не была предоставлена, она была исключена из моего ответа. Я предполагаю, что ОП сможет определить, как манипулировать ответом, чтобы удовлетворить добавление родителя к запросу.

  • 0
    Спасибо, это сработало для меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню