HTML-Teil
Ihre Eingabefelder im HTML-Formular müssen Namen haben, anhand derer Sie die Sprache identifizieren können. In HTML können Sie Feldnamen mit eckigen Klammern erstellen. Wenn PHP diese Werte empfängt, behandelt es sie als Array. Sie können einen <textarea>
definieren so:
<textarea name="email_content[fr]">
Dann können Sie in PHP mit der folgenden Syntax auf den Wert zugreifen:
$french = $_POST['email_content']['fr'];
Hinweise:
- HTML
<textarea>
hat keinentype
nochvalue
Attribute. - Anstatt
hidden
hinzuzufügen -Attribut zum<input>
Elemente, geben Sie einfachtype="hidden"
an . - Bei der Ausgabe dynamischer Inhalte innerhalb von HTML sollten Sie auf XSS-Schutz .
- Statt
<?php echo $var ?>
Sie können die kürzere Syntax<?=$var ?>
verwenden
Ihr vollständiges HTML-Formular könnte dann etwa so aussehen:
<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>
Sobald das Formular in PHP eingegangen ist, ist Ihr $_POST
sollte so etwas enthalten:
array (
'email_id' => '12',
'email_content' =>
array (
'en' => '',
'fr' => 'French text',
'ru' => '',
),
'save' => '',
)
PHP-Teil
Um mehrere Werte in PHP mit PDO zu speichern, müssen Sie eine Schleife verwenden. Vor der Schleife sollten Sie die Anweisung vorbereiten und Parameter binden. PDO_stmt::bind_param()
wird selten verwendet, aber in dieser Situation kann es Ihren Code sauberer machen. Sie sollten auch alle Einfügungen innerhalb einer Transaktion durchführen.
$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();
Wenn Sie die einfachere Syntax verwenden möchten, können Sie PDO_stmt::execute()
verwenden um die Parameter ohne vorherige Bindung zu übergeben.
$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();
Die folgende Zeile prüft, ob Inhalte bereitgestellt wurden und die Sprache in dem von Ihnen angegebenen Array von Sprachen enthalten ist.
if ($contents && in_array($lang, $languages, true)) {