Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como armazenar campos de texto em vários idiomas no mysql com php?

Parte HTML


Seus campos de entrada no formulário HTML precisam ter nomes que permitam identificar o idioma. Em HTML você pode criar nomes de campo com colchetes. Quando o PHP recebe esses valores, ele os trata como um array. Você pode definir um <textarea> assim:
<textarea name="email_content[fr]">

Então no PHP você pode acessar o valor usando a seguinte sintaxe:
$french = $_POST['email_content']['fr'];

Notas:
  • HTML <textarea> não tem type nem value atributos.
  • Em vez de adicionar hidden atributo para o <input> elementos, apenas especifique o type="hidden" .
  • Ao gerar qualquer conteúdo dinâmico em HTML, você deve cuidar de Proteção XSS .
  • Em vez de <?php echo $var ?> você pode usar a sintaxe mais curta <?=$var ?>

Seu formulário HTML completo pode ficar assim:
<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>

Assim que o formulário for recebido em PHP seu $_POST deve conter algo assim:
array (
  'email_id' => '12',
  'email_content' => 
  array (
    'en' => '',
    'fr' => 'French text',
    'ru' => '',
  ),
  'save' => '',
)

parte PHP


Para salvar vários valores em PHP usando PDO você precisa usar um loop. Antes do loop, você deve preparar a instrução e os parâmetros de ligação. PDO_stmt::bind_param() é raramente usado, mas nesta situação pode tornar seu código mais limpo. Você também deve realizar todas as inserções dentro de uma transação.
$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 você deseja usar a sintaxe mais simples, você pode usar PDO_stmt::execute() para passar os parâmetros sem ligação prévia.
$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();

A linha a seguir verifica se o conteúdo foi fornecido e o idioma está na matriz de idiomas que você especificou.
if ($contents && in_array($lang, $languages, true)) {