最好的方法是:检查条目是否存在,是否创建条目,是否更新条目?

时间:2014-07-03 19:41:12

标签: php mysql

我在我的网站上实施了一个标签系统。插入新帖子时,我想检查tags表中是否存在标记。此表的目的是跟踪标签的使用次数。

如果存在,则更新标记count = count + 1

如果它不存在则创建它。

tags表有两列:tagcount

$tags_arr数组就像['hello', 'tag', 'world']

我认为以下方法可以解决问题:

foreach ($tags_arr as $tag) {

    $sql_check = "SELECT * FROM tags WHERE tag='" . $tag . "'";
    $result_check = mysqli_query($con,$sql);

    // If we have one result assume a row for the tag already exists
    if (mysqli_num_rows($result_check) == 1) {
        $sql_tag = "UPDATE tags SET count = count + 1 WHERE tag='" . $tag . "'";
        $result_tag = mysqli_query($con,$sql_tag);
        if (mysqli_num_rows($result_tag) == 1) echo "updated tag " . $tag . "<br />";
        else echo "failed update tag " . $tag . "<br />";
    }

    // If not create the tag
    else {
        $sql_tag = "INSERT INTO tags (tag, count) VALUES ('" . $tag . "', 1)";
        $result_tag = mysqli_query($con,$sql);
        if (mysqli_num_rows($result_tag) == 1) echo "created tag " . $tag . "<br />";
        else echo "failed create tag " . $tag . "<br />";
    }
}

我在循环的每次迭代中得到这个:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /home/rlcoachi/public_html/hat/admin/insertPost.php on line 53

mysqli_num_rows不是检查查询是否返回结果的好方法吗?

我试过检查:

if ($result_check)

假设如果没有记录就会出现错误,但会产生另一组问题。

最好的方法是:检查条目是否存在,是否创建条目,是否更新条件?

5 个答案:

答案 0 :(得分:1)

  

最好的方法是:检查条目是否存在,如果不存在   创建它,如果它确实更新它?

只需设置唯一键约束并使用INSERT INTO ... ON DUPLICATE KEY UPDATE...

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

但是请注意,这会导致id-gap,因为每个 update 也会将自动增量值增加1 - 即使没有 insert

答案 1 :(得分:1)

假设您可以访问数据库中的ALTER权限,请先在标记列上创建一个唯一键(如果您还没有)。

ALTER TABLE tags ADD UNIQUE INDEX `tagname` (`tag`)

然后,您可以将所有这些组合成一个查询:

INSERT INTO tags (tag, count) VALUES ($tag, 1) ON DUPLICATE KEY UPDATE count=count+1

如果$ tag不在表中,这将插入行,否则它将更新count列。

答案 2 :(得分:0)

您的代码中存在多个问题。首先,mysqli_query仅在SELECT,SHOW,DESCRIBE或EXPLAIN成功时返回结果集。对于其他成功的查询,它将返回true,对于失败的查询,它将返回false

您的更新或插入查询失败,并且查询本身存在问题,或者您构建查询的方式 - 使用mysqli_real_escape_string来避免意外。

答案 3 :(得分:0)

INSERT INTO tags (tag, count) VALUES ('" . $tag . "', 1) ON DUPLICATE KEY UPDATE count=count + 1

答案 4 :(得分:0)

这是我会这样做的方式,虽然除了mysql_ *命令之外我什么都不知道,所以他们可能会更新

foreach($tags_arr as $tags) {

    $sql = "SELECT * FROM tags Where tag = '".$tags."'";
    $result = mysql_query($sql);
    $num = mysql_numrows($result);
    if($num<1){
        $query = "INSERT INTO tags (tag, count) VALUES('".$tags."','1')";
        $result = mysql_query($query);
        if (!$result) {
            echo "Failed to insert ".$tag.": ".mysql_error()."<br/>";
        }
    }
    else{
        #use $result to get the count and update database
    }
}