Mysql
 sql >> Database >  >> RDS >> Mysql

Come memorizzare il campo di testo in più lingue in mysql con php?

Parte HTML

I tuoi campi di input nel modulo HTML devono avere nomi che ti consentano di identificare la lingua. In HTML puoi creare nomi di campo tra parentesi quadre. Quando PHP riceve questi valori, li tratterà come un array. È possibile definire un <textarea> così:

<textarea name="email_content[fr]">

Quindi in PHP puoi accedere al valore usando la seguente sintassi:

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

Note:

  • HTML <textarea> non ha typevalue attributi.
  • Invece di aggiungere hidden attributo al <input> elementi, basta specificare il type="hidden" .
  • Durante l'output di qualsiasi contenuto dinamico all'interno di HTML, dovresti occuparti di Protezione XSS .
  • Invece di <?php echo $var ?> puoi usare la sintassi più breve <?=$var ?>

Il tuo modulo HTML completo potrebbe quindi assomigliare a questo:

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

Una volta ricevuto il modulo in PHP, il tuo $_POST dovrebbe contenere qualcosa del genere:

array (
  'email_id' => '12',
  'email_content' => 
  array (
    'en' => '',
    'fr' => 'French text',
    'ru' => '',
  ),
  'save' => '',
)

Parte PHP

Per salvare più valori in PHP usando PDO è necessario utilizzare un ciclo. Prima del ciclo, dovresti preparare l'istruzione e associare i parametri. PDO_stmt::bind_param() è usato raramente, ma in questa situazione può rendere il codice più pulito. Dovresti anche eseguire tutti gli inserimenti all'interno di una transazione.

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

Se desideri usare la sintassi più semplice puoi usare PDO_stmt::execute() per passare i parametri senza vincolo preventivo.

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

La riga seguente controlla se i contenuti sono stati forniti e la lingua è nell'array di lingue che hai specificato.

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