sql >> Database >  >> RDS >> Mysql

Hoe een tekstveld in meerdere talen op te slaan in mysql met php?

HTML-gedeelte

Uw invoervelden in het HTML-formulier moeten namen hebben waarmee u de taal kunt identificeren. In HTML kunt u veldnamen maken met vierkante haken. Wanneer PHP deze waarden ontvangt, zal het ze als een array behandelen. U kunt een <textarea> . definiëren zoals dit:

<textarea name="email_content[fr]">

Dan heb je in PHP toegang tot de waarde met behulp van de volgende syntaxis:

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

Opmerkingen:

  • HTML <textarea> heeft geen type noch value attributen.
  • In plaats van hidden toe te voegen attribuut aan de <input> elementen, specificeer gewoon de type="hidden" .
  • Bij het uitvoeren van dynamische inhoud in HTML moet u zorgen voor XSS-beveiliging .
  • In plaats van <?php echo $var ?> u kunt de kortere syntaxis gebruiken <?=$var ?>

Uw volledige HTML-formulier kan er dan ongeveer zo uitzien:

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

Zodra het formulier in PHP is ontvangen, wordt uw $_POST zou zoiets als dit moeten bevatten:

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

PHP-gedeelte

Om meerdere waarden in PHP op te slaan met PDO, moet je een lus gebruiken. Vóór de lus moet u de instructie en de bindparameters voorbereiden. PDO_stmt::bind_param() wordt zelden gebruikt, maar in deze situatie kan het uw code schoner maken. U moet ook alle invoegingen van een transactie uitvoeren.

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

Als u de eenvoudigere syntaxis wilt gebruiken, kunt u PDO_stmt::execute() gebruiken om de parameters door te geven zonder voorafgaande binding.

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

De volgende regel controleert of de inhoud is verstrekt en of de taal in de reeks talen staat die u hebt opgegeven.

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



  1. Kerstmis komt vroeg (Oracle 12.2)

  2. PHP-coderingsfout bij het produceren van XML uit database

  3. Een getal opmaken als valuta in MariaDB

  4. MySQL:geef de primaire sleutel een naam in de CREATE TABLE-instructie