通过PHP从多语言HTML表单向MySQL表插入数据

时间:2018-02-20 10:14:13

标签: php html mysql sql

我有 HTML 表单,如下所示:

sample form

目前,将来有3种语言会更多,前缀为_lang的字段会动态生成。

这些是输入字段(name_enname_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_endescription_en合并为一个条目。

在PHP中,$language_array包含所有可能的语言(对于此示例enrufr)我也使用substr从数据中获取语言代码,但下一步是什么?我应该以某种方式使用foreach吗?

foreach($language_array as $k=>$v) {
   // there I've missed my mind
}

我第一次遇到像这样的HTML表单结构。拜托,给我任何建议。

1 个答案:

答案 0 :(得分: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]

$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 documentation

另一种解决方案是创建您希望向用户显示的表单字段列表。

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

结果表格:

Form Example

您的$_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表格与其关联或其关联的信息很少,因此我的答案被排除在外。我认为OP将能够确定如何操作答案以满足将父级添加到查询中。