0

私はデータベース初心者ですが、PHP 配列の項目と MySQL 内破配列の項目を照合して行を検索するにはどうすればよいですか? 都合によりそのように保管されていますが、私が望むことを行うためのより良い方法があれば、私はすべての耳です. 私はこのようなものを探しています (私は手を振っている場所を示すために* * を使用しています):

$sql = "SELECT * FROM codeunits";
$sql .= " WHERE CASE WHEN private=1 THEN creatorID=:userID ELSE true END";
if (isset($tags))
{
  $tag_ids = join(',',$tags);
  $sql .= " AND ****items in mysql array 'tags'  IN :tags";
  if($stmt = $this->_db->prepare($sql)) {
    $stmt->bindParam(":userID", $userID, PDO::PARAM_STR);
    $stmt->bindParam(":tags", $tag_ids, PDO::PARAM_STR);
    $stmt->execute();
    $stmt->closeCursor();
  }
}

アイテムをDBに保存する方法は次のとおりです。$values は、tags 列のクエリにバインドされているため、MySQL 配列と呼んでいます。

    $tags = array();
    foreach ($_POST['tags'] as $selectedOption)
    {
        $tags[] = $selectedOption;
    }
    $values  = implode(",",array_values($tags));
    $sql = "INSERT INTO "
      ."codeunits(tags)"
      ." VALUES(:tags)";
      if($stmt = $this->_db->prepare($sql)) {             
          $stmt->bindParam(":tags", $values, PDO::PARAM_STR);
          $stmt->execute();

          $stmt->closeCursor();

          return true;
        }

これにより、データベースに「tag1,tag2,tag3」のようなエントリが作成されます。とてもシンプルな文字列。

4

1 に答える 1

0

これは、この種のクエリには適切なデータベース設計ではありません。タグを見つけるには LIKE を使用する必要があります。

代わりに、1行に1つのタグを保持するテーブル「タグ」が必要です。その後、「IN」ステートメントで結合を使用できます。

SELECT * FROM codeunits JOIN tags ON tags.codeunit_id=codeunits.ID WHERE tags.name IN (:tags) AND CASE WHEN private=1 THEN creatorID=:userID ELSE true END
于 2013-03-20T23:20:17.970 に答える