Phần HTML
Các trường đầu vào của bạn trong biểu mẫu HTML cần phải có tên cho phép bạn xác định ngôn ngữ. Trong HTML, bạn có thể tạo tên trường bằng dấu ngoặc vuông. Khi PHP nhận các giá trị này, nó sẽ coi chúng như một mảng. Bạn có thể xác định một <textarea>
như thế này:
<textarea name="email_content[fr]">
Sau đó, trong PHP, bạn có thể truy cập giá trị bằng cú pháp sau:
$french = $_POST['email_content']['fr'];
Ghi chú:
- HTML
<textarea>
không cótype
cũng không phải giá trịvalue
thuộc tính. - Thay vì thêm
hidden
thuộc tính cho<input>
phần tử, chỉ cần chỉ địnhtype="hidden"
. - Khi xuất bất kỳ nội dung động nào trong HTML, bạn nên quan tâm đến Bảo vệ XSS .
- Thay vì
<?php echo $var ?>
bạn có thể sử dụng cú pháp ngắn hơn<?=$var ?>
Khi đó, biểu mẫu HTML hoàn chỉnh của bạn có thể trông giống như sau:
<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>
Sau khi nhận được biểu mẫu trong PHP, $_POST
của bạn nên chứa một cái gì đó như thế này:
array (
'email_id' => '12',
'email_content' =>
array (
'en' => '',
'fr' => 'French text',
'ru' => '',
),
'save' => '',
)
Phần PHP
Để lưu nhiều giá trị trong PHP bằng PDO, bạn cần sử dụng một vòng lặp. Trước vòng lặp, bạn nên chuẩn bị câu lệnh và các tham số ràng buộc. PDO_stmt::bind_param()
hiếm khi được sử dụng, nhưng trong tình huống này, nó có thể làm cho mã của bạn sạch hơn. Bạn cũng nên thực hiện tất cả các lần chèn bên trong giao dịch.
$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();
Nếu bạn muốn sử dụng cú pháp đơn giản hơn, bạn có thể sử dụng PDO_stmt::execute()
để chuyển các tham số mà không có ràng buộc trước.
$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();
Dòng sau kiểm tra xem nội dung đã được cung cấp chưa và ngôn ngữ có nằm trong mảng ngôn ngữ bạn đã chỉ định hay không.
if ($contents && in_array($lang, $languages, true)) {