Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie speichere ich mehrsprachiges Textfeld in MySQL mit PHP?

HTML-Teil

Ihre Eingabefelder im HTML-Formular müssen Namen haben, anhand derer Sie die Sprache identifizieren können. In HTML können Sie Feldnamen mit eckigen Klammern erstellen. Wenn PHP diese Werte empfängt, behandelt es sie als Array. Sie können einen <textarea> definieren so:

<textarea name="email_content[fr]">

Dann können Sie in PHP mit der folgenden Syntax auf den Wert zugreifen:

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

Hinweise:

  • HTML <textarea> hat keinen type noch value Attribute.
  • Anstatt hidden hinzuzufügen -Attribut zum <input> Elemente, geben Sie einfach type="hidden" an .
  • Bei der Ausgabe dynamischer Inhalte innerhalb von HTML sollten Sie auf XSS-Schutz .
  • Statt <?php echo $var ?> Sie können die kürzere Syntax <?=$var ?> verwenden

Ihr vollständiges HTML-Formular könnte dann etwa 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, ist Ihr $_POST sollte so etwas 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 Parameter binden. PDO_stmt::bind_param() wird selten verwendet, aber in dieser Situation kann es Ihren Code sauberer machen. Sie sollten auch alle Einfügungen innerhalb einer Transaktion durchführen.

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

Wenn Sie die einfachere Syntax verwenden möchten, können Sie PDO_stmt::execute() verwenden um die Parameter ohne vorherige Bindung zu übergeben.

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

Die folgende Zeile prüft, ob Inhalte bereitgestellt wurden und die Sprache in dem von Ihnen angegebenen Array von Sprachen enthalten ist.

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