Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để lưu trữ trường văn bản nhiều ngôn ngữ trong mysql với php?

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ỉ định type="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)) {



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn cập nhật MySQL bằng cách sử dụng kết hợp bên trái

  2. Mệnh đề Where works không hoạt động trên tinyint

  3. TẢI THÔNG TIN DỮ LIỆU:Chuỗi ký tự ut8mb4 không hợp lệ

  4. Làm cách nào để bạn chọn mọi hàng thứ n từ mysql

  5. Ba Nhóm đầu tiên có Điểm cao nhất phải có điểm cụ thể