用户如何选择我的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'] ......”正确的方式?
答案 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过滤器的数据。