HTML部分
HTMLフォームの入力フィールドには、言語を識別できる名前を付ける必要があります。 HTMLでは、角かっこでフィールド名を作成できます。 PHPがこれらの値を受け取ると、それらを配列として扱います。 <textarea>
を定義できます このように:
<textarea name="email_content[fr]">
次に、PHPでは、次の構文を使用して値にアクセスできます。
$french = $_POST['email_content']['fr'];
注:
- HTML
<textarea>
type
がありません また、value
属性。 hidden
を追加する代わりに<input>
の属性 要素には、type="hidden"
を指定するだけです。 。- HTML内で動的コンテンツを出力するときは、XSS保護 。
-
<?php echo $var ?>
の代わりに 短い構文<?=$var ?>
を使用できます
完全な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)) {