PHP로 mysql에 여러 언어 텍스트 필드를 저장하는 방법은 무엇입니까?

Nov 19 2020

여러 텍스트 필드를 언어별로 저장하려고하는데, 어떤 언어의 빈 텍스트 필드가 있으면 저장할 때 무시하지만 일부 오류로 인해 코드가 올바르게 작동하지 않으며 제출을 클릭하면 첫 번째 텍스트 필드 만 저장합니다.

데이터 베이스

+----------+------------+---------------+
| 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';

?>

예상 결과

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

답변

2 Dharman Nov 20 2020 at 18:26

HTML 부분

HTML 양식의 입력 필드에는 언어를 식별 할 수있는 이름이 있어야합니다. HTML에서 대괄호로 필드 이름을 만들 수 있습니다. PHP는 이러한 값을 받으면 배열로 처리합니다. 다음 <textarea>과 같이 정의 할 수 있습니다 .

<textarea name="email_content[fr]">

그런 다음 PHP에서 다음 구문을 사용하여 값에 액세스 할 수 있습니다.

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

메모:

  • HTML <textarea>에는 속성 type도 없습니다 value.
  • 요소에 hidden속성을 추가하는 대신 .<input>type="hidden"
  • HTML 내에서 동적 콘텐츠를 출력 할 때 XSS 보호에 주의해야합니다 .
  • 대신 <?php echo $var ?>더 짧은 구문을 사용할 수 있습니다.<?=$var ?>

완성 된 HTML 양식은 다음과 같습니다.

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

PHP에서 양식을 받으면 $_POST다음과 같은 내용을 포함해야합니다.

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

PHP 부분

PDO를 사용하여 PHP에서 여러 값을 저장하려면 루프를 사용해야합니다. 루프 전에 명령문을 준비하고 매개 변수를 바인드해야합니다. PDO_stmt::bind_param()거의 사용되지 않지만이 상황에서는 코드를 더 깔끔하게 만들 수 있습니다.

$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_stmt::execute()하려면 사전 바인딩없이 매개 변수를 전달하는 데 사용할 수 있습니다 .

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

다음 줄은 내용이 제공되었고 언어가 지정한 언어 배열에 있는지 확인합니다.

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