我在我的网站上实施了一个标签系统。插入新帖子时,我想检查tags
表中是否存在标记。此表的目的是跟踪标签的使用次数。
如果存在,则更新标记count = count + 1
。
如果它不存在则创建它。
tags
表有两列:tag
和count
。
$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)
假设如果没有记录就会出现错误,但会产生另一组问题。
最好的方法是:检查条目是否存在,是否创建条目,是否更新条件?
答案 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
}
}