PHP 从 MySQL 字段中删除特定数字
PHP remove specific numbers from MySQL field
我的数据库结构如下:
id | posts | groups
----+--------+-----------
1 | 10 | 2
2 | 30 | 2
3 | 20 | 2
4 | 50 | 2,8
5 | 54 | 2,8
当用户达到 50 个或更多 post 时,我希望脚本删除组“2”。已经有一个添加“8”的先前脚本。
我有这个:
$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 ");
它似乎没有更新。我不知道这是因为它在数组中拾取了多个字段,还是我对大于或等于符号做错了。
谁能提供解决方案?
谢谢。
编辑:
我已经计算出,如果我将符号更改为等于查询在第一行工作,它会遇到 post 计数 50,但它会保留其余部分。看起来它只能处理一行。
我认为这对你有用。我认为 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 是唯一的值,此解决方案还将在组字段中放置一个空值。
我的数据库结构如下:
id | posts | groups
----+--------+-----------
1 | 10 | 2
2 | 30 | 2
3 | 20 | 2
4 | 50 | 2,8
5 | 54 | 2,8
当用户达到 50 个或更多 post 时,我希望脚本删除组“2”。已经有一个添加“8”的先前脚本。
我有这个:
$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 ");
它似乎没有更新。我不知道这是因为它在数组中拾取了多个字段,还是我对大于或等于符号做错了。
谁能提供解决方案?
谢谢。
编辑: 我已经计算出,如果我将符号更改为等于查询在第一行工作,它会遇到 post 计数 50,但它会保留其余部分。看起来它只能处理一行。
我认为这对你有用。我认为 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 是唯一的值,此解决方案还将在组字段中放置一个空值。