sql >> Databáze >  >> RDS >> Mysql

Jak uložit vícejazyčné textové pole v mysql s php?

Část HTML

Vaše vstupní pole ve formuláři HTML musí mít názvy, které vám umožní identifikovat jazyk. V HTML můžete vytvářet názvy polí s hranatými závorkami. Když PHP obdrží tyto hodnoty, bude je považovat za pole. Můžete definovat <textarea> takhle:

<textarea name="email_content[fr]">

Potom v PHP můžete přistupovat k hodnotě pomocí následující syntaxe:

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

Poznámky:

  • HTML <textarea> nemá type ani value atributy.
  • Místo přidání hidden atribut do <input> prvků, stačí zadat type="hidden" .
  • Při výstupu jakéhokoli dynamického obsahu v rámci HTML byste měli dbát na Ochrana XSS .
  • Namísto <?php echo $var ?> můžete použít kratší syntaxi <?=$var ?>

Váš úplný HTML formulář by pak mohl vypadat nějak takto:

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

Po obdržení formuláře v PHP váš $_POST by měl obsahovat něco takového:

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

část PHP

Chcete-li uložit více hodnot v PHP pomocí PDO, musíte použít smyčku. Před smyčkou byste měli připravit příkaz a parametry vazby. PDO_stmt::bind_param() se používá zřídka, ale v této situaci může váš kód čistší. Měli byste také provést všechna vložení uvnitř transakce.

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

Pokud chcete použít jednodušší syntaxi, můžete použít PDO_stmt::execute() předat parametry bez předchozí vazby.

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

Následující řádek zkontroluje, zda byl poskytnut obsah a zda je jazyk v poli jazyků, které jste zadali.

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



  1. MySQL- Proč mi LAST_INSERT_ID() nefunguje?

  2. Upgrade Grid Control po ručním upgradu DB

  3. Nejlepší způsoby, jak opravit poškozenou tabulku InnoDB v MySQL

  4. Jak tento web opravuje kódování?