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 temtype
nemvalue
atributos. - Em vez de adicionar
hidden
atributo para o<input>
elementos, apenas especifique otype="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)) {