Jak przechowywać pola tekstowe w wielu językach w mysql za pomocą php?

Nov 19 2020

Próbuję zapisać wiele pól tekstowych według języka, a podczas zapisywania, jeśli jest puste pole tekstowe w jakimkolwiek języku, zignoruj ​​je, ale z powodu jakiegoś błędu mój kod nie działa poprawnie, a kiedy kliknę Prześlij, zapisz tylko pierwsze pole tekstowe

Baza danych

+----------+------------+---------------+
| email_id | email_lang | email_content |
+----------+------------+---------------+
|          |            |               |
+----------+------------+---------------+

HTML

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post"> <input type="text" value="<?php echo $_GET['id']; ?>" name="email_id" hidden>

   <?php foreach ($languages as $lang): ?>
   <input type="text" value="<?php echo $lang ?>" name="email_lang">
   <textarea type="text" value="1" name="email_content"></textarea>
   <?php endforeach ?>

<button type="submit" name="save">Save</button>
</form>

Php

<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST'){

$sentence = $connect->prepare("INSERT INTO emailtemplates (email_id,email_lang,email_content) VALUES (:email_id, :email_lang, :email_content)");

$email_id = $_POST['email_id'];
$email_lang = $_POST['email_lang'];
$email_content = $_POST['email_content'];

$sentence->execute(array( ':email_id' => $email_id,
        ':email_lang' => $email_lang, ':email_content' => $email_content
        ));
}

$languages = ['en', 'fr', 'ru'];

require '../views/new.email.view.php';

?>

Oczekiwane rezultaty

+----------+------------+-----------------+
| email_id | email_lang |  email_content  |
+----------+------------+-----------------+
|        1 | en         | english content |
|        1 | fr         | french content  |
+----------+------------+-----------------+

Odpowiedzi

2 Dharman Nov 20 2020 at 18:26

Część HTML

Twoje pola wejściowe w formularzu HTML muszą mieć nazwy, które pozwolą Ci zidentyfikować język. W HTML możesz tworzyć nazwy pól z nawiasami kwadratowymi. Kiedy PHP otrzyma te wartości, potraktuje je jako tablicę. Możesz zdefiniować coś <textarea>takiego:

<textarea name="email_content[fr]">

Następnie w PHP możesz uzyskać dostęp do wartości za pomocą następującej składni:

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

Uwagi:

  • HTML <textarea>nie ma typeani valueatrybutów.
  • Zamiast dodawać hiddenatrybut do <input>elementów, po prostu określ type="hidden".
  • Podczas wyprowadzania jakiejkolwiek dynamicznej zawartości w HTML należy zadbać o ochronę XSS .
  • Zamiast <?php echo $var ?>ciebie możesz użyć krótszej składni<?=$var ?>

Twój pełny formularz HTML może wtedy wyglądać mniej więcej tak:

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

Gdy formularz zostanie odebrany w PHP, $_POSTpowinieneś zawierać coś takiego:

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

Część PHP

Aby zapisać wiele wartości w PHP za pomocą PDO, musisz użyć pętli. Przed pętlą należy przygotować instrukcję i powiązać parametry. PDO_stmt::bind_param()jest rzadko używany, ale w tej sytuacji może sprawić, że kod będzie czystszy.

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

Jeśli chcesz użyć prostszej składni, możesz użyć PDO_stmt::execute()do przekazania parametrów bez wcześniejszego wiązania.

$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,
        ]);
    }
}

Poniższy wiersz sprawdza, czy zawartość została dostarczona, a język znajduje się w podanej tablicy języków.

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