0

usersim 感兴趣我如何从我的 mysql 数据库中选择一个文本字段,我有一个名为 users 的表,其中包含一个名为“profile_fields”的文本字段,其中存储了附加用户信息。我如何在 php 中访问它并删除它?我想删除无效的人。

PHP 代码

<?php
//Working connection made before assigned as $connection
$time = time();
$query_unactive_users = "DELETE FROM needed WHERE profile_fields['valid_until'] < $time"; //deletes user if the current time value is higher then the expiring date to validate
mysqli_query($connection , $query_unactive_users);
mysqli_close($connection);
?>

在 phpmyadmin 中,该字段显示(从随机用户行中选择):

a:1:{s:11:"valid_until";i:1370695666;}

“ ... WHERE profile_fields ['valid_until'] ...”是正确的方法吗?

4

2 回答 2

0

无论如何,这是一个非常脆弱的解决方案,使用您对字符串结构的了解和一些SUBSTRING疯狂:

DELETE FROM needed WHERE SUBSTRING(
    profile_fields,
    LOCATE('"valid_until";i:', profile_fields) + 16, 
    LOCATE(';}', profile_fields) - LOCATE('"valid_until";i:', profile_fields) - 16
) < UNIX_TIMESTAMP();

但是请注意,如果您在“valid_until”之后添加另一个“虚拟字段”,那将会中断......

于 2013-06-01T16:00:39.453 回答
0

您不能以简单干净的方式在 SQL 命令中执行此操作。但是,字符串 'a:1:{s:11:"valid_until";i:1370695666;}' 只是一个序列化的 PHP 数组。

做这个测试:

print_r(unserialize('a:1:{s:11:"valid_until";i:1370695666;}'));

输出将是:

Array ( [valid_until] => 1370695666 ) 

因此,如果您执行以下操作,您可以检索您的 valid_until 值:

$arrayProfileData = unserialize('a:1:{s:11:"valid_until";i:1370695666;}');
$validUntil = arrayProfileData['valid_until'];

因此,一种解决方案是选择表中的所有项目,执行 foreach 循环,如上所述反序列化每个“profile_fields”字段,检查时间戳,并将每个要删除的注册表的主键存储在单独的数组中。在循环结束时,对存储在循环中的所有主键执行一次 DELETE 操作。为此,请使用implode(',', $arrayPKs).

这不是一个很直接的路线,而且根据寄存器的数量,它可能不会很慢,但它是可靠的。

考虑 rixo 的评论:如果可以,请将“valid_until”放在单独的列中。序列化数据可以很好地存储非常规数据,但永远不要使用它来存储您可能需要稍后应用 SQL 过滤器的数据。

于 2013-06-01T19:07:00.903 回答