如何使用php在mysql中存储多语言文本字段?

如何使用php在mysql中存储多语言文本字段?,php,mysql,pdo,Php,Mysql,Pdo,我正在尝试按语言保存多个文本字段,如果保存时有任何语言的空文本字段,请忽略它,但由于某些错误,我的代码无法正常工作,当我单击“提交”时,仅保存第一个文本字段 数据库 +----------+------------+---------------+ | email_id | email_lang | email_content | +----------+------------+---------------+ | | | |

我正在尝试按语言保存多个文本字段,如果保存时有任何语言的空文本字段,请忽略它,但由于某些错误,我的代码无法正常工作,当我单击“提交”时,仅保存第一个文本字段

数据库

+----------+------------+---------------+
| email_id | email_lang | email_content |
+----------+------------+---------------+
|          |            |               |
+----------+------------+---------------+
Html

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">

   <input type="text" value="<?php echo $_GET['id']; ?>" name="email_id" hidden>

   <?php foreach ($languages as $lang): ?>
   <input type="text" value="<?php echo $lang ?>" name="email_lang">
   <textarea type="text" value="1" name="email_content"></textarea>
   <?php endforeach ?>

<button type="submit" name="save">Save</button>
</form>
HTML部分 HTML表单中的输入字段需要有名称,以便识别语言。在HTML中,可以使用方括号创建字段名。当PHP接收到这些值时,它会将它们视为一个数组。您可以这样定义

<form action="<?=htmlspecialchars($_SERVER['PHP_SELF'])?>" method="post">
    <input type="hidden" value="<?=$id?>" name="email_id">

    <?php foreach ($languages as $lang) : ?>
        <textarea value="1" name="email_content[<?=htmlspecialchars($lang)?>]" placeholder="<?=htmlspecialchars($lang)?>" value="<?=htmlspecialchars($lang)?>"></textarea>
    <?php endforeach ?>

    <button type="submit" name="save">Save</button>
</form>
array (
  'email_id' => '12',
  'email_content' => 
  array (
    'en' => '',
    'fr' => 'French text',
    'ru' => '',
  ),
  'save' => '',
)

然后,在PHP中,您可以使用以下语法访问该值:

$french=$\u POST['email\u content']['fr'];
注:

  • HTML
    没有
    类型
    属性
  • 只需指定
    type=“hidden”
    ,而不是向
    元素添加
    hidden
    属性
  • 当输出HTML中的任何动态内容时,您应该注意
  • 您可以使用较短的语法,而不是
您的完整HTML表单可能如下所示:

<form action="<?=htmlspecialchars($_SERVER['PHP_SELF'])?>" method="post">
    <input type="hidden" value="<?=$id?>" name="email_id">

    <?php foreach ($languages as $lang) : ?>
        <textarea value="1" name="email_content[<?=htmlspecialchars($lang)?>]" placeholder="<?=htmlspecialchars($lang)?>" value="<?=htmlspecialchars($lang)?>"></textarea>
    <?php endforeach ?>

    <button type="submit" name="save">Save</button>
</form>
array (
  'email_id' => '12',
  'email_content' => 
  array (
    'en' => '',
    'fr' => 'French text',
    'ru' => '',
  ),
  'save' => '',
)
PHP部分 要使用PDO在PHP中保存多个值,需要使用循环。在循环之前,您应该准备语句和绑定参数
PDO_stmt::bind_param()
很少使用,但在这种情况下,它可以使代码更干净。您还应该在事务内部执行所有插入

$pdo->beginTransaction();

$stmt = $pdo->prepare("INSERT INTO emailtemplates (email_id,email_lang,email_content) 
                        VALUES (:email_id, :email_lang, :email_content)");
$stmt->bindParam('email_id', $_POST['email_id']);
$stmt->bindParam('email_lang', $lang);
$stmt->bindParam('email_content', $contents);

foreach ($_POST['email_content'] as $lang => $contents) {
    if ($contents && in_array($lang, $languages, true)) {
        $stmt->execute();
    }
}

$pdo->commit();
如果希望使用更简单的语法,可以使用
PDO_stmt::execute()
来传递参数,而无需事先绑定

$pdo->beginTransaction();

$stmt = $pdo->prepare("INSERT INTO emailtemplates (email_id,email_lang,email_content) 
                        VALUES (:email_id, :email_lang, :email_content)");

foreach ($_POST['email_content'] as $lang => $contents) {
    if ($contents && in_array($lang, $languages, true)) {
        $stmt->execute([
            'email_id' => $_POST['email_id'],
            'email_lang' => $lang,
            'email_content' => $contents,
        ]);
    }
}

$pdo->commit();
下一行检查是否提供了内容以及语言是否在指定的语言数组中

if ($contents && in_array($lang, $languages, true)) {
HTML部分 HTML表单中的输入字段需要有名称,以便识别语言。在HTML中,可以使用方括号创建字段名。当PHP接收到这些值时,它会将它们视为一个数组。您可以这样定义

<form action="<?=htmlspecialchars($_SERVER['PHP_SELF'])?>" method="post">
    <input type="hidden" value="<?=$id?>" name="email_id">

    <?php foreach ($languages as $lang) : ?>
        <textarea value="1" name="email_content[<?=htmlspecialchars($lang)?>]" placeholder="<?=htmlspecialchars($lang)?>" value="<?=htmlspecialchars($lang)?>"></textarea>
    <?php endforeach ?>

    <button type="submit" name="save">Save</button>
</form>
array (
  'email_id' => '12',
  'email_content' => 
  array (
    'en' => '',
    'fr' => 'French text',
    'ru' => '',
  ),
  'save' => '',
)

然后,在PHP中,您可以使用以下语法访问该值:

$french=$\u POST['email\u content']['fr'];
注:

  • HTML
    没有
    类型
    属性
  • 只需指定
    type=“hidden”
    ,而不是向
    元素添加
    hidden
    属性
  • 当输出HTML中的任何动态内容时,您应该注意
  • 您可以使用较短的语法,而不是
您的完整HTML表单可能如下所示:

<form action="<?=htmlspecialchars($_SERVER['PHP_SELF'])?>" method="post">
    <input type="hidden" value="<?=$id?>" name="email_id">

    <?php foreach ($languages as $lang) : ?>
        <textarea value="1" name="email_content[<?=htmlspecialchars($lang)?>]" placeholder="<?=htmlspecialchars($lang)?>" value="<?=htmlspecialchars($lang)?>"></textarea>
    <?php endforeach ?>

    <button type="submit" name="save">Save</button>
</form>
array (
  'email_id' => '12',
  'email_content' => 
  array (
    'en' => '',
    'fr' => 'French text',
    'ru' => '',
  ),
  'save' => '',
)
PHP部分 要使用PDO在PHP中保存多个值,需要使用循环。在循环之前,您应该准备语句和绑定参数
PDO_stmt::bind_param()
很少使用,但在这种情况下,它可以使代码更干净。您还应该在事务内部执行所有插入

$pdo->beginTransaction();

$stmt = $pdo->prepare("INSERT INTO emailtemplates (email_id,email_lang,email_content) 
                        VALUES (:email_id, :email_lang, :email_content)");
$stmt->bindParam('email_id', $_POST['email_id']);
$stmt->bindParam('email_lang', $lang);
$stmt->bindParam('email_content', $contents);

foreach ($_POST['email_content'] as $lang => $contents) {
    if ($contents && in_array($lang, $languages, true)) {
        $stmt->execute();
    }
}

$pdo->commit();
如果希望使用更简单的语法,可以使用
PDO_stmt::execute()
来传递参数,而无需事先绑定

$pdo->beginTransaction();

$stmt = $pdo->prepare("INSERT INTO emailtemplates (email_id,email_lang,email_content) 
                        VALUES (:email_id, :email_lang, :email_content)");

foreach ($_POST['email_content'] as $lang => $contents) {
    if ($contents && in_array($lang, $languages, true)) {
        $stmt->execute([
            'email_id' => $_POST['email_id'],
            'email_lang' => $lang,
            'email_content' => $contents,
        ]);
    }
}

$pdo->commit();
下一行检查是否提供了内容以及语言是否在指定的语言数组中

if ($contents && in_array($lang, $languages, true)) {

代码“工作不正常”到底是怎么回事?有什么问题吗?当我把它保存到数据库时,它没有保存。你有什么错误吗?您是否已将PDO设置为在发生SQL问题时抛出错误?您是否在PHP中正确设置了错误日志记录?如果没有,请设置这些内容,然后重新运行代码并检查错误日志文件。“不保存”不是对您的问题的有用描述-可能有多种原因。请启用错误日志记录,然后执行一些适当的调试工作。我们无法运行您的代码来调试它,只有您可以这样做。在执行查询之前,您应该检查是否按照预期填充了所有POST值,例如.P.S。关于HTML表单的一个更一般的观点是:对于隐藏值,您可以使用实际的
,而不是使用文本字段并将其标记为
hidden
,不幸的是,答案延迟了,因此您可以这样做:将输入命名为
,其中lang是实际语言,然后只需
foreach($\u POST['email\u content']as$lang=>$content)
do在这个循环中插入。代码“工作不正常”到底是怎么回事?有什么问题吗?当我把它保存到数据库时,它没有保存。你有什么错误吗?您是否已将PDO设置为在发生SQL问题时抛出错误?您是否在PHP中正确设置了错误日志记录?如果没有,请设置这些内容,然后重新运行代码并检查错误日志文件。“不保存”不是对您的问题的有用描述-可能有多种原因。请启用错误日志记录,然后执行一些适当的调试工作。我们无法运行您的代码来调试它,只有您可以这样做。在执行查询之前,您应该检查是否按照预期填充了所有POST值,例如.P.S。关于HTML表单的一个更一般的观点是:对于隐藏值,您可以使用实际的
,而不是使用文本字段并将其标记为
hidden
,不幸的是,答案延迟了,因此您可以这样做:将输入命名为
,其中lang是实际语言,然后只需
foreach($\u POST['email\u content']as$lang=>$content)
一个do在这个循环中插入。