从php中的mysql中选择一个文本字段

时间:2013-06-01 15:26:58

标签: php mysql

用户如何选择我的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'] ......”正确的方式?

2 个答案:

答案 0 :(得分: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'之后添加另一个“虚拟字段”,那将会破坏......

答案 1 :(得分: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过滤器的数据。