2013-06-01 95 views
0

usersim感兴趣我如何选择一个文本字段形式我的mysql数据库,我有一个名为用户名为用户名为“profile_fields”的用户信息存储在哪里的用户表。我如何在PHP中访问它并删除它?我想删除未验证的人员。从php中选择一个文本字段在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领域显示了(从随机用户行choosen):

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

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

+1

为什么不用简单的'valid_until'日期列?我看到你可以直接在MySQL中查询的唯一方法是使用正则表达式......这将是丑陋的。 – rixo

回答

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”之后添加另一种“虚拟现场”,即将打破...

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”字段,che ck时间戳,并将每个要删除注册表的主键存储在单独的数组中。在循环结束时,对存储在循环中的所有主键执行一次DELETE操作。要做到这一点,请使用implode(',', $arrayPKs)

这不是一条非常直接的路线,取决于寄存器的数量,它可能不会很慢,但它是可靠的。

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