2010-01-15 5 views
1

J'ai ce morceau de code pour vérifier si un utilisateur a déjà créé un compte de la dernière heure:vérifier si un utilisateur enregistré durant la dernière heure

$result = mysql_query("SELECT * FROM accounts WHERE registration_ip = '$_SERVER[REMOTE_ADDR]' AND created > ".(time() - 3600)); 

if (mysql_num_rows($result) > 0) 
    exit('Blablal') 

Il ne sort pas comme je veux le faire, je peut faire combien de comptes je veux.

Vous voyez un problème quelconque? Mes tables et champs db sont corrects

+0

Qu'est-ce que SQL utilisez-vous pour insérer les lignes dans la table? –

+0

pourquoi? Rien de mal là-bas. il insère correctement les comptes INSERT INTO (nom, mot de passe, registration_ip, créé) VALUES ('$ username', '$ password', '$ ip_address', ".time().") – leon

Répondre

0

Testez-le en supprimant la clause registration_ip = '$_SERVER[REMOTE_ADDR]'.

0

Votre requête sql AND created > ".(time() - 3600)); n'est pas correcte pour obtenir la dernière heure. Vous voulez quelque chose comme ceci:

SELECT ... WHERE ... 
AND created > DATE_SUB(now(), INTERVAL 1 HOUR) 
+0

Im stocker mes dates comme timestamp unix .. – leon

0

J'ai testé ce local et pour moi, il se comporte comme prévu. Je dirais que le problème n'est pas dans votre requête, mais ailleurs. Vérifiez vos données et assurez-vous qu'elles sont insérées comme prévu.

En outre, vous pouvez utiliser SELECT COUNT pour compter les colonnes au lieu de SELECT * - cela devrait être plus rapide.


    $result = mysql_query("SELECT COUNT(*) FROM accounts WHERE registration_ip = '$_SERVER[REMOTE_ADDR]' AND created > ".(time() - 3600)); 

    $count = mysql_fetch_array($result); 
    if ($count[0] > 0) exit('BLAH'); 
0

La réponse de Yada est correcte. Le seul autre commentaire que je voudrais faire est que vous échapper à $ _SERVER [REMOTE_ADDR] à l'aide mysql_real_escape pour protéger contre une SQL injection dans hasard que la variable se redéfinie

1

Votre problème est probablement cela, $ _SERVER [REMOTE_ADDR]

Vous l'intégrez directement dans une chaîne entre guillemets. Lorsque vous souhaitez accéder à un tableau dans une chaîne entre guillemets, vous devez placer l'accès au tableau de variables dans une paire d'accolades.

chaîne corrigée:

"SELECT * FROM comptes OU registration_ip = '{$ _SERVER [' REMOTE_ADDR ']}' et créé>" (time() - 3600)

En outre, alway devis. indexes, vous avez utilisé REMOTE_ADDR au lieu de 'REMOTE_ADDR' ou "REMOTE_ADDR"

Espérons que cela aide.

+0

Vous pouvez incorporer un tableau dans une chaîne sans utiliser d'accolades.En outre, lorsque vous référencez un tableau dans une chaîne analysée sans accolades, l'insertion de l'index entre guillemets est inutile. Voir http://us3.php.net/manual/fr/language.types.string.php#language.types.string.parsing - vérifie le premier exemple d'analyse de tableau. – emmychan

0

Vous devez utiliser {} autour des choses que vous intégrez dans le SQL qui sont PHP. Je pense que cela devrait fonctionner. Je fais toujours cela car j'ai trouvé que cela me sauve le temps de déboguer car il semble apparaître un peu fréquemment. Si cela ne fonctionne pas, enregistrez votre requête dans une variable, renvoyez l'écho à la page pour voir ce qu'elle envoie.

$sql = "SELECT COUNT(*) FROM accounts WHERE registration_ip = '{$_SERVER[REMOTE_ADDR]}' AND created > ".({time()} - 3600)"; 

echo $sql; 
1

i juste pris les espaces des travaux bien maintenant

registration_ip='$_SERVER[REMOTE_ADDR]' 
Questions connexes