Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过PHP从多语言HTML表单向MySQL表插入数据_Php_Html_Mysql_Sql - Fatal编程技术网

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

通过PHP从多语言HTML表单向MySQL表插入数据,php,html,mysql,sql,Php,Html,Mysql,Sql,我有如下HTML表单: 因为现在有3种语言在未来将会更多,前缀为_lang的字段正在动态生成 这些是输入字段name_en、name_ru等。它们是占位符 MySQL表如下所示: 父表 明细表 我想在以下详细信息中插入数据: Id ParentId Name Description Language 1 1 FooEn FooBarEn EN 2 1 FooRu FooBarRu

我有如下HTML表单:

因为现在有3种语言在未来将会更多,前缀为_lang的字段正在动态生成

这些是输入字段name_en、name_ru等。它们是占位符

MySQL表如下所示:

父表

明细表

我想在以下详细信息中插入数据:

Id    ParentId    Name     Description    Language
1     1           FooEn    FooBarEn       EN
2     1           FooRu    FooBarRu       RU
3     1           FooFr    FooBarFr       FR
Id    UserId
1     123
和如下所示的父表:

Id    ParentId    Name     Description    Language
1     1           FooEn    FooBarEn       EN
2     1           FooRu    FooBarRu       RU
3     1           FooFr    FooBarFr       FR
Id    UserId
1     123
提交表单后,我可以成功地将数据插入父表。我在将这些数据插入细节表时遇到了一个问题。我不知道如何将name_en和description_en合并为一个条目

在PHP中,我有$language_数组,其中包含本例中所有可能的语言en、ru、fr,我还使用substr从数据中获取语言代码,但接下来呢?我应该用foreach吗


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

最简单的解决方案是从$\u POST数据中检索表单字段

假设$\u 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\u数组迭代并提取关联的$\u POST表单字段值,如:$\u POST['fieldname.'$lang]

有关mysqli的详细信息以及对已准备语句的用法,请参阅 这个

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

$fields = ['name' => 'Name', 'description' => 'Description'];
$languages = ['en', 'ru', 'fr'];
然后,您可以迭代每个字段和语言以在浏览器中呈现它们

请注意,输入字段名称的前缀是其关联语言 作为字段数组,如LANG[field]

这将允许您通过迭代$\u 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);
    }
}
免责声明:由于没有提供有关父表的相关信息或其关联的信息,因此我的回答中没有提供父表。我假设OP将能够确定如何操作答案,以满足将父项添加到查询的要求

$fields = ['name' => 'Name', 'description' => 'Description'];
$languages = ['en', 'ru', 'fr'];
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>';
}
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
        )

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