【问题标题】:Inserting data to MySQL table from multi-language HTML form via PHP通过 PHP 从多语言 HTML 表单将数据插入 MySQL 表
【发布时间】:2018-07-30 16:02:30
【问题描述】:

我的 HTML 格式如下:

目前有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 合并为 1 个条目。

在 PHP 中,我有 $language_array 和所有可能的语言(对于这个例子是 enrufr),我也在使用 substr 从数据中获取语言代码,但接下来呢?我应该以某种方式使用foreach 吗?

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

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

【问题讨论】:

    标签: php html mysql sql


    【解决方案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的详细信息以及prepared statements的用法,请参阅 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>';
    }
    

    结果形式:

    您的$_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 将能够确定如何操纵答案以满足将父级添加到查询中。

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2017-05-16
      • 2023-03-19
      相关资源
      最近更新 更多