Część HTML
Twoje pola wejściowe w formularzu HTML muszą mieć nazwy, które pozwolą Ci zidentyfikować język. W HTML możesz tworzyć nazwy pól w nawiasach kwadratowych. Gdy PHP otrzyma te wartości, potraktuje je jako tablicę. Możesz zdefiniować <textarea>
tak:
<textarea name="email_content[fr]">
Następnie w PHP możesz uzyskać dostęp do wartości za pomocą następującej składni:
$french = $_POST['email_content']['fr'];
Uwagi:
- HTML
<textarea>
nie matype
anivalue
atrybuty. - Zamiast dodawać
hidden
atrybut do<input>
elementy, po prostu określtype="hidden"
. - Wyprowadzając dowolną zawartość dynamiczną w HTML, należy zadbać o Ochrona XSS .
- Zamiast
<?php echo $var ?>
możesz użyć krótszej składni<?=$var ?>
Twój pełny formularz HTML może wtedy wyglądać mniej więcej tak:
<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>
Po otrzymaniu formularza w PHP Twój $_POST
powinien zawierać coś takiego:
array (
'email_id' => '12',
'email_content' =>
array (
'en' => '',
'fr' => 'French text',
'ru' => '',
),
'save' => '',
)
Część PHP
Aby zapisać wiele wartości w PHP za pomocą PDO, musisz użyć pętli. Przed pętlą należy przygotować instrukcję i parametry powiązania. PDO_stmt::bind_param()
jest rzadko używany, ale w tej sytuacji może sprawić, że Twój kod będzie czystszy. Powinieneś również wykonać wszystkie wstawienia wewnątrz transakcji.
$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();
Jeśli chcesz użyć prostszej składni, możesz użyć PDO_stmt::execute()
aby przekazać parametry bez wcześniejszego wiązania.
$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();
Poniższy wiersz sprawdza, czy zawartość została dostarczona, a język znajduje się w podanej tablicy języków.
if ($contents && in_array($lang, $languages, true)) {