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 част
За да запазите множество стойности в PHP, използвайки PDO, трябва да използвате цикъл. Преди цикъла трябва да подготвите изявлението и параметрите за свързване. 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)) {