我的数据库结构如下:
id | posts | groups
----+--------+-----------
1 | 10 | 2
2 | 30 | 2
3 | 20 | 2
4 | 50 | 2,8
5 | 54 | 2,8
当用户获得50个或更多帖子时,我希望该脚本删除该组' 2'。已经有一个先前的脚本添加了''。
我有这个:
$cusstring = mysql_query("SELECT `groups` FROM `users` WHERE `postnum` >= 50 ");
$row = mysql_fetch_array($cusstring);
$array = explode(',', $row[groups]);
$pos = array_search('2', $array);
unset($array[$pos]);
$row[groups] = implode(',', $array);
mysql_query("UPDATE `users` SET `groups` = $row[groups] WHERE `postnum` >= 50 ");
但它似乎并没有更新。我不知道这是因为它在数组中拾取了多个字段,或者我是否对大于或等于符号做错了。
有人能提供解决方案吗?
感谢。
编辑: 我已经知道,如果我将符号更改为等于查询在第一行上工作,则会发现帖子计数为50,但剩下的就是剩下的。它似乎只能处理一行。
答案 0 :(得分:3)
我认为这对你有用。我认为SQL方法会更有效,但是你已经说过要用PHP保存它。
$cusstring = mysql_query("SELECT `groups`, `id ` FROM `users` WHERE `postnum` >= 50 ");
while($row = mysql_fetch_array($cusstring)) {
$groups = mysql_real_escape_string(preg_replace('~(^|\s+)2(,|$)~', '', $row['groups']));
//regex demo https://regex101.com/r/eX7qD1/1
$id = (int)$row['id'];
mysql_query("UPDATE `users` SET `groups` = '$groups' WHERE `id ` = $id ");
}
您的代码只获取一条记录,因为您没有循环获取。
另外,不要将来自数据库的数据直接放回查询中,否则会导致SQL注入。注意我将ID
转换为int并转义groups
值。这应该可以防止注射的可能性。
您应该将驱动程序切换为PDO
或MYSQLI
。一旦使用其中一个驱动程序,您就可以使用预准备语句。
如果2是唯一的值,此解决方案也会在groups字段中放置一个空值。