Wie speichere ich mehrsprachiges Textfeld in MySQL mit PHP?
Ich versuche, mehrere Textfelder nach Sprache zu speichern. Wenn beim Speichern ein leeres Textfeld einer Sprache vorhanden ist, ignorieren Sie es, aber bei einem Fehler funktioniert mein Code nicht richtig. Wenn ich auf Senden klicke, speichern Sie nur das erste Textfeld
Datenbank
+----------+------------+---------------+
| 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';
?>
Erwartete Ergebnisse
+----------+------------+-----------------+
| email_id | email_lang | email_content |
+----------+------------+-----------------+
| 1 | en | english content |
| 1 | fr | french content |
+----------+------------+-----------------+
Antworten
HTML-Teil
Ihre Eingabefelder im HTML-Formular müssen Namen haben, mit denen Sie die Sprache identifizieren können. In HTML können Sie Feldnamen in eckigen Klammern erstellen. Wenn PHP diese Werte empfängt, werden sie als Array behandelt. Sie können Folgendes definieren <textarea>
:
<textarea name="email_content[fr]">
In PHP können Sie dann mit der folgenden Syntax auf den Wert zugreifen:
$french = $_POST['email_content']['fr'];
Anmerkungen:
- HTML
<textarea>
hat nochtype
keinevalue
Attribute. - Anstatt
hidden
den<input>
Elementen ein Attribut hinzuzufügen , geben Sie einfach das antype="hidden"
. - Bei der Ausgabe von dynamischen Inhalten in HTML sollten Sie auf den XSS-Schutz achten .
- Stattdessen
<?php echo $var ?>
können Sie die kürzere Syntax verwenden<?=$var ?>
Ihr vollständiges HTML-Formular könnte dann ungefähr so aussehen:
<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>
Sobald das Formular in PHP eingegangen ist, $_POST
sollte es ungefähr Folgendes enthalten:
array (
'email_id' => '12',
'email_content' =>
array (
'en' => '',
'fr' => 'French text',
'ru' => '',
),
'save' => '',
)
PHP-Teil
Um mehrere Werte in PHP mit PDO zu speichern, müssen Sie eine Schleife verwenden. Vor der Schleife sollten Sie die Anweisung vorbereiten und die Parameter binden. PDO_stmt::bind_param()
wird selten verwendet, aber in dieser Situation kann es Ihren Code sauberer machen.
$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();
}
}
Wenn Sie die einfachere Syntax verwenden möchten, können Sie PDO_stmt::execute()
die Parameter ohne vorherige Bindung übergeben.
$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,
]);
}
}
In der folgenden Zeile wird überprüft, ob Inhalte bereitgestellt wurden und die Sprache in dem von Ihnen angegebenen Spracharray enthalten ist.
if ($contents && in_array($lang, $languages, true)) {