0

すべてのエントリに 3 つのレベルのキーワード システムを構築したいと考えています。提案されているように、カテゴリの情報用に 1 つのテーブル (ctypes) を作成し、エントリを含む関係テーブル用に 1 つ (カテゴリ) を作成しました。

CREATE TABLE ctypes (
cat_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
cat_name VARCHAR(20) NOT NULL,
cat_level INT UNSIGNED NOT NULL,
parent_id INT UNSIGNED,
PRIMARY KEY (cat_id),
UNIQUE (cat_name)
);

CREATE TABLE categories (
entry_id INT UNSIGNED NOT NULL,
cat_ids VARCHAR(100) NOT NULL,
UNIQUE (entry_id)
);

次に、チェックボックスでキーワード情報を収集するフォームを作成しました。

<form action="add_category.php" method="post">
<table>
<tr>
    <td><b>Level 1(A,B,C)</b></td>
    <td><b>Level 2(Aa,Ab,Ac)</b></td>
    <td><b>Level 3(Aa1,Aa2,Aa3)</b></td>
</tr>
<tr>
    <td>A</td>
    <td>Aa</td>
    <td><input type="checkbox" name="cat[]" value="5" />Aa1<td>
</tr>
<tr>
    <td></td>
    <td></td>
    <td><input type="checkbox" name="cat[]" value="6" />Aa2</td>
</tr>
<tr>
    <td></td>
    <td>Ab</td>
    <td><input type="checkbox" name="cat[]" value="7" />Ab1</td>
</tr>
...
</table>
<input type="hidden" name="eid" value="1" />
<input type="submit" name="submit" value="submit" />
</form>

そして、entry_id と cat_id の関係テーブルを作成しました。$cat[] データをテーブルに保存する方法を教えてください。

では、このエントリごとのキーワードの編集(追加/削除)と、(1番目、2番目、3番目のキーワード)でエントリを検索する方法を教えてください。

4

2 に答える 2

0

あなたが何を達成しようとしているのか完全にはわかりません。指摘されているように、あなたのテーブル構造は理想的ではありませんが、正確な最終目標を知らなければ、あなたを支援したりアドバイスしたりすることは本当に困難です.

主な謎は、各カテゴリに 3 つのレベルがあるのに、1 つのレベルに 1 つのチェックボックスしかない理由だと思います。

つまり、これがあります:

<tr>
    <td>A</td>
    <td>Aa</td>
    <td><input type="checkbox" name="cat[]" value="5" />Aa1<td>
</tr>

しかし、「A」または「Aa」を選択できないのはなぜですか?

多分これはあなたが意図していることかもしれませんし、(あなたのコメントの多くによると) あなたが達成しようとしていることの基本的な例を示そうとしているだけで、答えが得られたら必要に応じてコードを変更します.

また、mysql に挿入する配列を作成する必要があるため、ソリューションは機能しません。変数に追加するだけで、配列データ全体を 1 つの値として 1 つの行を挿入します。

入力を支援するために、これを行うことができます:

//Initialise some things so can work with them (and no errors)
$arySqlQry = array();
$strError = FALSE;

//make sure you have posted data first
if (isset($_POST['cat']) && is_array($_POST['cat']))
  {

    foreach ($_POST['cat'] as $strCatKey => $strCatValue)
      {

        //ensure data is what you want, no SQL injection etc
        if ($strCatValue != 'Aa1'
            && $strCatValue != 'Aa2'
            && $strCatValue != 'Ab1')
          {
            $strError = TRUE;
          }
        else
          {
            //clean data and construct sql values ready for insert
            $strCatValue = mysql_real_escape_string($strCatValue);             
            $arySqlQry[] = "('".$eid."', '".$strCatValue."')";
          }

        //if we have an error in the array
        //stop the loop as further looping is pointless
        if ($strError == TRUE)
          {
            break;
          }


      }//end foreach


    //if we have a new array with results, and no errors
    //insert into DB
    //if not, this wont run and the error catch below will work
    if (!empty($arySqlQry) && $strError != TRUE)
      {
        $qryQuery = '"INSERT INTO categories (entry_id, cat_ids) 
                      VALUES '.implode(',', $arySqlQry).'"';
        $qryExecute = mysqli_query($dbc, $qryQuery);
      }


  } //end if $_POST is set and is array
else //(POST not there so is error)
  {
    $strError = TRUE;
  }

//if there are any errors
if ($strError == TRUE)
  {
    //do some error reporting
    //ie tell user nothing entered in form, and therefore nothing was saved
  }

行を でコメントアウトし$qryExecute、 var をエコーする$qryQueryことで、これが機能していることを確認できます。これにより、構築された mysql クエリ文字列と、データベースに挿入されるものが表示されます。

データを取り戻すことに関しては、これは単純な選択であり、while を使用するか、配列を取得して foreach などを使用します。

前述したように、mysql_拡張機能は PHP 5.5.0 で廃止され、PDO または mysqli の使用を検討して、管理性とセキュリティを強化する準備済みステートメントを使用することを検討する必要があります。

于 2013-08-27T17:07:25.410 に答える