Parte HTML
I tuoi campi di input nel modulo HTML devono avere nomi che ti consentano di identificare la lingua. In HTML puoi creare nomi di campo tra parentesi quadre. Quando PHP riceve questi valori, li tratterà come un array. È possibile definire un <textarea>
così:
<textarea name="email_content[fr]">
Quindi in PHP puoi accedere al valore usando la seguente sintassi:
$french = $_POST['email_content']['fr'];
Note:
- HTML
<textarea>
non hatype
névalue
attributi. - Invece di aggiungere
hidden
attributo al<input>
elementi, basta specificare iltype="hidden"
. - Durante l'output di qualsiasi contenuto dinamico all'interno di HTML, dovresti occuparti di Protezione XSS .
- Invece di
<?php echo $var ?>
puoi usare la sintassi più breve<?=$var ?>
Il tuo modulo HTML completo potrebbe quindi assomigliare a questo:
<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>
Una volta ricevuto il modulo in PHP, il tuo $_POST
dovrebbe contenere qualcosa del genere:
array (
'email_id' => '12',
'email_content' =>
array (
'en' => '',
'fr' => 'French text',
'ru' => '',
),
'save' => '',
)
Parte PHP
Per salvare più valori in PHP usando PDO è necessario utilizzare un ciclo. Prima del ciclo, dovresti preparare l'istruzione e associare i parametri. PDO_stmt::bind_param()
è usato raramente, ma in questa situazione può rendere il codice più pulito. Dovresti anche eseguire tutti gli inserimenti all'interno di una transazione.
$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();
Se desideri usare la sintassi più semplice puoi usare PDO_stmt::execute()
per passare i parametri senza vincolo preventivo.
$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();
La riga seguente controlla se i contenuti sono stati forniti e la lingua è nell'array di lingue che hai specificato.
if ($contents && in_array($lang, $languages, true)) {