sql >> データベース >  >> RDS >> Mysql

phpを使用して複数言語のテキストフィールドをmysqlに保存するにはどうすればよいですか?

    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() はめったに使用されませんが、この状況ではコードをよりクリーンにすることができます。また、トランザクション内ですべての挿入を実行する必要があります。

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

    より単純な構文を使用する場合は、PDO_stmt::execute()を使用できます。 事前にバインドせずにパラメータを渡す。

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

    次の行は、コンテンツが提供され、言語が指定した言語の配列に含まれているかどうかを確認します。

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



    1. MySQL接続文字列のpooling=falseはどういう意味ですか?

    2. XAMPPでmysqlデータベースを復元する方法は?

    3. PostgreSQLクエリの一部として整数を文字列に変換するにはどうすればよいですか?

    4. SQLインジェクションとは何ですか?