2013-06-01 82 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過濾器的數據。