Wie speichere ich mehrsprachiges Textfeld in MySQL mit PHP?

Nov 19 2020

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

2 Dharman Nov 20 2020 at 18:26

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 noch typekeine valueAttribute.
  • Anstatt hiddenden <input>Elementen ein Attribut hinzuzufügen , geben Sie einfach das an type="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, $_POSTsollte 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)) {