Comment stocker un champ de texte en plusieurs langues dans mysql avec php?
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
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'atype
nivalue
attributs. - Au lieu d'ajouter un
hidden
attribut aux<input>
éléments, spécifiez simplement le fichiertype="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 $_POST
devriez 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)) {