【问题标题】:How store multiple language textfield in mysql with php?如何使用 php 在 mysql 中存储多语言文本字段?
【发布时间】:2020-11-19 11:33:01
【问题描述】:

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

数据库

+----------+------------+---------------+
| 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>

PHP

<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST'){

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

$email_id = $_POST['email_id'];
$email_lang = $_POST['email_lang'];
$email_content = $_POST['email_content'];

$sentence->execute(array(
        ':email_id' => $email_id,
        ':email_lang' => $email_lang,
        ':email_content' => $email_content
        ));
}

$languages = ['en', 'fr', 'ru'];

require '../views/new.email.view.php';

?>

预期结果

+----------+------------+-----------------+
| email_id | email_lang |  email_content  |
+----------+------------+-----------------+
|        1 | en         | english content |
|        1 | fr         | french content  |
+----------+------------+-----------------+

【问题讨论】:

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

标签: php mysql pdo


【解决方案1】:

HTML 部分

HTML 表单中的输入字段需要有名称,以便您识别语言。在 HTML 中,您可以使用方括号创建字段名称。当 PHP 接收到这些值时,它会将它们视为一个数组。您可以像这样定义&lt;textarea&gt;

<textarea name="email_content[fr]">

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

$french = $_POST['email_content']['fr'];

注意事项:

  • HTML &lt;textarea&gt; 没有 typevalue 属性。
  • 无需将hidden 属性添加到&lt;input&gt; 元素,只需指定type="hidden"
  • 在 HTML 中输出任何动态内容时,您应该注意XSS protection
  • 您可以使用更短的语法&lt;?=$var ?&gt; 而不是&lt;?php echo $var ?&gt;

您的完整 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>

在 PHP 中收到表单后,您的 $_POST 应该包含以下内容:

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)) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多