2010-09-27 4 views
0

J'ai un problème dans mon application où la fonctionnalité «Modifier mon mot de passe» a réinitialisé le mot de passe de TOUS les utilisateurs à la même valeur. J'ai restauré une sauvegarde, donc pas de problème majeur, mis à part ce bug horrible sans autre faute que la mienne.L'instruction WHERE émet UPDATEing toutes les lignes

Évidemment, cela était dû à la condition WHERE dans l'instruction UPDATE n'ayant aucune valeur. C'était via une requête d'enregistrement active dans CodeIgniter. Pour éviter ce problème il y avait une sauvegarde en place:

if(!is_numeric($userdata['client_id'])) die('could not retrieve user ID from session'); 

Un typeof($userdata['client_id']) me dit ceci est une « chaîne » si mon chèque is_numeric aurait bien fonctionné. le tableau $ userdata provient de la session.

Il n'y a aucun utilisateur avec l'ID client 0, ils ont tous une valeur numérique.

Je pensais que cela aurait pu se produire lorsque l'utilisateur accédait à la page "changer le mot de passe", attendant que la session se déconnecte après X minutes et ensuite soumettre le formulaire. Je l'ai essayé moi-même et il me redirige juste à la page de connexion, comme il se doit.

Mon instruction WHERE essaie de faire correspondre $userdata['client_id'] à une valeur client_id_fk. Un ou deux clients de test ont un client_id_fk de NULL - un tel client de test ayant réinitialisé leur mot de passe peut-il avoir causé cela?

Sinon, je suis perplexe. N'importe qui?

Répondre

0

Ma première supposition serait que $userdata['client_id'] était null et is_numeric() est (trompeusement) vrai?

+0

Je ne sais pas si et comment client_id aurait pu être NULL mais je suppose que c'est possible grâce à un autre bug. J'ai ajouté un contrôle is_null pour être sûr. Merci. – stef

0
 
I thought this could have occurred through the user accessing the "change password" page, waiting till the session logged him out after X minutes and then submitting the form. I tried this myself and it just redirects me back to the login page, as it should. 

De-dessus semble être vous soumettre les détails du formulaire après avoir terminé les détails de la session Userdata, donc UserData ne sera pas disponible pour la requête de mise à jour du mot de passe.

Tous les enregistrements sont également mis à jour signifie is_numeric($userdata['client_id']) ne fonctionne pas comme prévu.

Pourriez-vous d'abord soumettre les détails du formulaire, puis déconnecter la session?

+0

Lorsque le formulaire est soumis, une vérification est d'abord effectuée pour s'assurer que la personne est toujours connectée, sinon elle redirige vers la page de connexion. – stef

0

is_numeric() renvoie true pour toute une série de chaînes. En supposant que votre champ client_id est toujours un nombre entier (il devrait être), alors en utilisant is_int() pourrait être une meilleure idée. Si le client_id n'est pas récupéré comme un entier (ou vous lisez de $_GET), alors vous pourriez aussi envisager la coulée à l'aide (int), par exemple:

$userdata['client_id'] = (int) $_GET['client_id']; 

Cela devrait assurer la valeur que vous êtes travailler avec est un entier, et non quelque chose comme +1e10 (qui retournerait TRUE dans le chèque is_numeric().

http://uk.php.net/manual/en/function.is-numeric.php

en outre, vous devriez essayer de var_dump() votre valeur au lieu de l'exécuter dans votre requête pour le déboguer.

Questions connexes