Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да съхранявате многоезично текстово поле в mysql с php?

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)) {



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql Как да изберете само от колона, ако колоната съществува

  2. ГРЕШКА:Зареждането на локални данни е деактивирано - това трябва да бъде активирано както от страна на клиента, така и от страна на сървъра

  3. AUTO_INCREMENT и LAST_INSERT_ID

  4. Най-добри практики за дължина на колоната на SQL varchar

  5. Избиране на отделна комбинация от 2 колони в mysql