0

複数のスタック オーバーフロー メンバーからのガイダンスを使用して、MySQL データベースと通信するための PHP フォームを取得しました。今、チェックボックスに配列を使用していますが、情報はMySQLテーブルに届きます...一種の..

以下のコードは、すべてのレコードをデータベースに挿入しますが、チェックボックスが対応する列には、割り当てられた値ではなく値「配列」が含まれます...:

<?php
 function renderForm($articletitle, $articleorganization, $articledate, $articleurl,     $articletags )
 {
 ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="style.css">
  </head>
  <body>
    <div id="stylized" class="myform">
      <form id="form" name="form" action="" method="post">
. . .
          <input type="checkbox" name="articletags[]" value="checkbox" id="articletags_0" />
          <input type="checkbox" name="articletags[]" value="checkbox 2" id="articletags_1" />
. . .
        <footer><input type="submit" name="submit" value="Add this Article"></footer></form>
    </div>
  </body>
</html><?php 
 }
. . .

 if(count($articletags) > 0)
{
 $articletags_string = implode(",", $articletags);
}

 if (isset($_POST['submit']))
 { 
 $articletitle = mysql_real_escape_string(htmlspecialchars($_POST['articletitle']));
 $articleorganization = mysql_real_escape_string(htmlspecialchars($_POST['articleorganization']));
 $articledate = mysql_real_escape_string(htmlspecialchars($_POST['articledate']));
 $articleurl = mysql_real_escape_string(htmlspecialchars($_POST['articleurl']));
 $articletags = ($_POST['articletags']);

. . .
 mysql_query("INSERT articles SET articletitle='$articletitle',     articleorganization='$articleorganization', articledate='$articledate',     articleurl='$articleurl', articletags='$articletags' ")
 or die(mysql_error()); 


 header("Location:addsuccess.html"); 
 }
 }
 else

 {
 renderForm('','','','');
 }
?>
4

3 に答える 3

4

は配列なので$_POST['articletags']、テーブルに保存する前に文字列に変換する必要があります。この行を置き換えます:

$articletags = ($_POST['articletags']);

これとともに:

$articletags = implode(',', $_POST['articletags']);
于 2012-06-08T06:29:26.277 に答える
1

さて、私は今これを経験しています、そしてこれが私が考えていることです。

多対多の関係があるため、最良の方法は3つのテーブルを用意することです。これらを「main_table」、「tag_table」、「key_table」と呼びましょう。私が間違っていなければ、これはレベル3の正規化を提供します。

チェックボックスの値を配列に入れます。情報をアップロードするときは、最初に他のデータを「main_table」にアップロードします。タグについて心配する必要はありません。次に、アップロードしたmain_table行のID番号を取得します。

次に、「tags」配列でforeach演算子を使用し、文字列値を生成してINSERT INTO key_table VALUES$stringに入れます。

確かにMySQLの観点からすると、これは少なくとも1つの正しい方法だと思います。これが私が書いたばかりの必要最低限​​のコードです。エラーやセキュリティなどに関して、少し欠けている部分がたくさんあります。

これがフォームです。データベースからフォームをダウンロードして入力します。(「問題が発生した場合にフォームが消去されないように、自動値(checked ='checked')が含まれています。)

            $query1 = "SELECT * FROM tag_table";
            $res1 = mysqli_query ($dbc, $query1);
            while ($row1 = mysqli_fetch_array($res1, MYSQLI_NUM)) {
                    $tag_id = $row1[0];
                    $tag = $row1[1];
                    echo "<div class='check'><label for='tags[]'>$tag</label> "; 
                    echo "<input type='checkbox' name='tags[]' value='$tag_id'";
                    if (in_array("$tags",$tag_id)) echo " checked='checked' ";
                    echo "/></div>";
                }

フォームハンドラーの基本は次のとおりです。ここでは、変数$dbcによって保持されるデータベース接続が既に確立されています。これは、基本情報をアップロードした直後に行われるため、mysqli_insert_idは最新の挿入のID番号を取得します。

    $tags = $_POST (tags);
    if ($tags) {
        $new_main_id =  mysqli_insert_id($dbc);
    foreach ($tags as $value) {
           $qvalues .= "('$new_main_id','$value'),";
    }
    $qvalues = substr("$qvalues", 0, -1); 

    $q2 = "INSERT INTO key_table (id_main,id_tag_table) VALUES $qvalues";
    $res2 = mysqli_query($dbc, $q2);

}

これにより、きれいでクリーンな正規化されたデータベースが得られます。PHP関数substr()を使用して、挿入する値のリストの最後からコンマを削除していることに注意してください。

したがって、2列の3行、たとえば1赤、2青、3緑のタグテーブルがあり、ユーザーが赤と緑をチェックしていて、メイン挿入のmain_tableのID番号が18だった場合、クエリ($ q2)は次のようになります。

INSERT INTO key_table(id_main、id_tag_table)VALUES('18'、' 1')、(' 18'、' 3')

于 2012-08-23T20:17:56.357 に答える
1

はい、配列値をデータベースフィールドに渡しています..そのためには、いくつかの変換方法を実行する必要があります。

いくつかの方法でそれを行うことができます。まず、配列の値を文字列に変換できます。

$articletags = implode(',', $_POST['articletags']);

次に、配列の値をjson形式に変換してから、データベースに入力できます..

于 2012-06-08T06:35:51.477 に答える