Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment stocker un champ de texte multilingue dans mysql avec php?

Partie HTML

Vos champs de saisie dans le formulaire HTML doivent avoir des noms qui vous permettront d'identifier la langue. En HTML, vous pouvez créer des noms de champs avec des crochets. Lorsque PHP reçoit ces valeurs, il les traite comme un tableau. Vous pouvez définir un <textarea> comme ceci :

<textarea name="email_content[fr]">

Ensuite, en PHP, vous pouvez accéder à la valeur en utilisant la syntaxe suivante :

$french = $_POST['email_content']['fr'];

Remarques :

  • HTML <textarea> n'a pas de type ni value attributs.
  • Au lieu d'ajouter hidden attribut au <input> éléments, spécifiez simplement le type="hidden" .
  • Lors de la sortie de tout contenu dynamique au sein de HTML, vous devez faire attention à Protection XSS .
  • Au lieu de <?php echo $var ?> vous pouvez utiliser la syntaxe plus courte <?=$var ?>

Votre formulaire HTML complet pourrait alors ressembler à ceci :

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

Une fois le formulaire reçu en PHP votre $_POST devrait contenir quelque chose comme ceci :

array (
  'email_id' => '12',
  'email_content' => 
  array (
    'en' => '',
    'fr' => 'French text',
    'ru' => '',
  ),
  'save' => '',
)

Partie PHP

Pour enregistrer plusieurs valeurs en PHP à l'aide de PDO, vous devez utiliser une boucle. Avant la boucle, vous devez préparer l'instruction et les paramètres de liaison. PDO_stmt::bind_param() est rarement utilisé, mais dans cette situation, il peut rendre votre code plus propre. Vous devez également effectuer toutes les insertions à l'intérieur d'une transaction.

$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();

Si vous souhaitez utiliser la syntaxe plus simple, vous pouvez utiliser PDO_stmt::execute() pour passer les paramètres sans liaison préalable.

$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();

La ligne suivante vérifie si le contenu a été fourni et si la langue est dans le tableau de langues que vous avez spécifié.

if ($contents && in_array($lang, $languages, true)) {