sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo almacenar campos de texto en varios idiomas en mysql con php?

parte HTML

Sus campos de entrada en el formulario HTML deben tener nombres que le permitan identificar el idioma. En HTML, puede crear nombres de campo con corchetes. Cuando PHP recibe estos valores, los tratará como una matriz. Puede definir un <textarea> así:

<textarea name="email_content[fr]">

Luego, en PHP, puede acceder al valor usando la siguiente sintaxis:

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

Notas:

  • HTML <textarea> no tiene type ni value atributos.
  • En lugar de agregar hidden atributo al <input> elementos, simplemente especifique el type="hidden" .
  • Al generar cualquier contenido dinámico dentro de HTML, debe tener cuidado con Protección XSS .
  • En lugar de <?php echo $var ?> puede usar la sintaxis más corta <?=$var ?>

Su formulario HTML completo podría verse así:

<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 vez que se recibe el formulario en PHP, su $_POST debe contener algo como esto:

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

parte de PHP

Para guardar múltiples valores en PHP usando PDO, necesita usar un bucle. Antes del ciclo, debe preparar la declaración y vincular los parámetros. PDO_stmt::bind_param() rara vez se usa, pero en esta situación puede hacer que su código sea más limpio. También debe realizar todas las inserciones dentro de una transacción.

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

Si desea usar la sintaxis más simple, puede usar PDO_stmt::execute() para pasar los parámetros sin enlace previo.

$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 siguiente línea verifica si se proporcionaron contenidos y si el idioma está en la matriz de idiomas que especificó.

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