2010-02-15 7 views
3

Mon script:lignes affectées PHP = 1 ne fonctionnera pas correctement

<?php 
ob_start(); 
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
header('Content-type: text/html; charset=utf-8'); 
include "tilslut.php"; 
$userid = $_GET["userid"]; 
$s = mysql_query("SELECT points, lastpoint FROM member_profile WHERE user_id = '".$userid."'"); 
$n = mysql_fetch_array($s); 
$tid = time(); 
mysql_query("UPDATE member_profile set points = points+1, lastpoint=$tid WHERE lastpoint<=$tid-60 AND user_id = '".$userid."'"); 
$e = mysql_query("SELECT points FROM member_profile WHERE user_id = '".$userid."'"); 
$f = mysql_fetch_array($e); 
if (mysql_affected_rows() == 1) { 
$s = mysql_query("SELECT points FROM member_profile WHERE user_id = '".$userid."'"); 
$n = mysql_fetch_array($s); 
?> 
Inserted! 
<? 
}else{ 
echo "Already got"; 
} 
ob_flush(); 
?> 

J'ai cela pour donner des points. La requête de mise à jour fonctionne, et donne seulement point si lastpoint < = time() - 60, mais il dit toujours "Inséré" même si elle ne pas insérer. J'ai essayé d'utiliser mysql-affected-rows pour vérifier si elle a été affectée ou pas, mais cela ne semble pas fonctionner.

+6

qui incluent le fichier est malheureusement nommé. –

+0

le fichier include est une connexion db – Karem

+0

@Anon - au moins, il ne commence pas par un 'l' – JAL

Répondre

3

Vous devez appeler mysql_affected_rows immédiatement après la mise à jour, avant de faire une autre sélection. mysql_affected_rows ne fonctionnera que sur la dernière requête effectuée sur la connexion.

1

Youru requête

$e = mysql_query("SELECT points FROM member_profile WHERE user_id = '".$userid."'"); 

est à l'origine de la ligne affectée à une égale. Je vous suggère de vérifier les lignes affectées immédiatement après la mise à jour

+0

Merci pour votre réponse, mais j'ai déjà accepté la première réponse, qui étaient la même solution que vous. – Karem

3

Vous êtes:

  • faire la update requête
  • puis, faire une select requête
  • et, alors seulement, appelant mysql_affected_rows

Cela pourrait fonctionner mieux si vous appeliez mysql_affected_rows immédiatement après la requête update, sans avoir une autre requête entre ceux-ci: mysql_affected_rows est censé fonctionner avec les données de la dernière requête - même si la documentation ne dit pas sur les requêtes select, je suppose que cela pourrait causer un problème.


Comme un côté note: vous avez un risque d'injection SQL, ici: vous devez échapper à vos données avant l'injection dans une requête SQL (je pense à $_GET["userid"]), ou, au moins, assurez-vous que c'est un nombre entier.


Et vous devez utiliser des noms de variables plus descriptifs: $e, $f, $n, $s, ... cela rend votre code plus difficile à lire/comprendre/maintenir :-(

+0

Merci pour votre réponse, mais j'ai déjà accepté la première réponse, qui étaient la même solution que vous et merci pour votre note, et je sais cela déjà, mais je suis juste en train de tester le script pour le moment. – Karem

+0

Pas de problème, et merci pour votre commentaire :-) Je pense juste que quelques mots sur l'échappement ne peuvent jamais nuire :-) –

+0

"la documentation ne dit pas sur les requêtes select" - les requêtes SELECT n'affectent pas les lignes en question , car SELECT est en lecture seule. Par conséquent, le nombre de lignes affectées par les requêtes SELECT est 0, comme prévu. – Piskvor

Questions connexes