PHP从MySQL字段中删除特定数字

时间:2015-07-26 19:19:09

标签: php mysql arrays explode implode

我的数据库结构如下:

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,但剩下的就是剩下的。它似乎只能处理一行。

1 个答案:

答案 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值。这应该可以防止注射的可能性。

您应该将驱动程序切换为PDOMYSQLI。一旦使用其中一个驱动程序,您就可以使用预准备语句。

如果2是唯一的值,此解决方案也会在groups字段中放置一个空值。