Comment stocker un champ de texte en plusieurs langues dans mysql avec php?

Nov 19 2020

J'essaie d'enregistrer plusieurs champs de texte par langue, et lors de l'enregistrement s'il y a un champ de texte vide de n'importe quelle langue, ignorez-le, mais pour une erreur, mon code ne fonctionne pas correctement et lorsque je clique sur Soumettre, enregistrez uniquement le premier champ de texte

Base de données

+----------+------------+---------------+
| email_id | email_lang | email_content |
+----------+------------+---------------+
|          |            |               |
+----------+------------+---------------+

HTML

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post"> <input type="text" value="<?php echo $_GET['id']; ?>" name="email_id" hidden>

   <?php foreach ($languages as $lang): ?>
   <input type="text" value="<?php echo $lang ?>" name="email_lang">
   <textarea type="text" value="1" name="email_content"></textarea>
   <?php endforeach ?>

<button type="submit" name="save">Save</button>
</form>

Php

<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST'){

$sentence = $connect->prepare("INSERT INTO emailtemplates (email_id,email_lang,email_content) VALUES (:email_id, :email_lang, :email_content)");

$email_id = $_POST['email_id'];
$email_lang = $_POST['email_lang'];
$email_content = $_POST['email_content'];

$sentence->execute(array( ':email_id' => $email_id,
        ':email_lang' => $email_lang, ':email_content' => $email_content
        ));
}

$languages = ['en', 'fr', 'ru'];

require '../views/new.email.view.php';

?>

Résultats attendus

+----------+------------+-----------------+
| email_id | email_lang |  email_content  |
+----------+------------+-----------------+
|        1 | en         | english content |
|        1 | fr         | french content  |
+----------+------------+-----------------+

Réponses

2 Dharman Nov 20 2020 at 18:26

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 recevra ces valeurs, il les traitera 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:

  • Le HTML <textarea>n'a typeni valueattributs.
  • Au lieu d'ajouter un hiddenattribut aux <input>éléments, spécifiez simplement le fichier type="hidden".
  • Lors de la sortie de tout contenu dynamique dans HTML, vous devez prendre soin de la 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, vous $_POSTdevriez 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 en utilisant 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.

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

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

$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,
        ]);
    }
}

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