0

ユーザーシムは、私のmysqlデータベースからテキストフィールドを選択する方法に興味があります.追加のユーザー情報が保存されている「profile_fields」というテキストフィールドを持つusersという名前のテーブルがあります。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

シンプルでクリーンな方法で 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 に答える