将MySQL内爆数组中的项与查询中的PHP数组匹配

时间:2013-03-20 22:52:38

标签: php mysql

我是数据库菜鸟,如何通过将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();
  }
}

以下是我将这些项目存储到数据库中的方法。 $ 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'。非常简单的字符串。

1 个答案:

答案 0 :(得分:0)

对于这种查询,这不是一个好的数据库设计,你必须使用LIKE来查找标记。

相反,你应该有一个表“tags”每行一个标签,然后你可以使用“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