Page 1 sur 1

Le premier enregistrement de ma table n'est pas traité par l

Posté : 14 juin 2008, 08:43
par speccy666
Salut à tous,

Mon problème est simple... je n'arrive jamais à supprimer avec ce code le premier enregistrement de ma table..???? s'il y en a plusieurs alors ils sont traités mais jamais le premier....

On dirait que mon fetch array débute avec un index à 1 au lieu de 0.... pourtant en posant la requête directement sous Mysql (SELECT PSEUDO FROM membresconnectes), l'enregistrement s'affiche.

Mystère? une petite idée?
					//requete de depassement de temps de session( 3 minutes) avec suppression de ceux dont la session à expirée
					$dureede30min=time() - (60);
					echo $dureede30min;
					$rq="SELECT PSEUDO FROM membresconnectes WHERE TIMESTAMP<'$dureede30min'";
					$resultat=mysql_query($rq) or die(mysql_error());
					$donnees = mysql_fetch_array($resultat);
					//SUPPRESSION de la SESSION avec deconnection de ce membres
					while ($donnees = mysql_fetch_array($resultat))
					{
						echo "suppression du membres pour session expirée";
						$nom=$donnees['PSEUDO'];
						mysql_query("DELETE FROM membresconnectes WHERE PSEUDO='$nom'");
						
						}
					}

La TABLE sous MySQL à tout hasard

Code : Tout sélectionner

-- Structure de la table `membresconnectes` -- CREATE TABLE `membresconnectes` ( `ID` mediumint(9) NOT NULL auto_increment, `IP` text NOT NULL, `PSEUDO` text NOT NULL, `TIMESTAMP` int(6) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ; -- -- Contenu de la table `membresconnectes` -- INSERT INTO `membresconnectes` (`ID`, `IP`, `PSEUDO`, `TIMESTAMP`) VALUES (12, '123', 'SpEcCy', 1213425017);

Posté : 14 juin 2008, 09:36
par sadeq
C'est normal cher speccy, tu as une ligne de trop qui fait un mysql_fetch_array($resultat) avant la boucle while.

Il faut virer cette ligne car elle lit le premier enregistrement pour des prunes. Ton while est suffisant car il fait la lecture mysql_fetch_array()

Correction:
//requete de depassement de temps de session( 3 minutes) avec suppression de ceux dont la session à expirée
                    $dureede30min=time() - (60);
                    echo $dureede30min;
                    $rq="SELECT PSEUDO FROM membresconnectes WHERE TIMESTAMP<'$dureede30min'";
                    $resultat=mysql_query($rq) or die(mysql_error());
                    //
                    //SUPPRESSION de la SESSION avec deconnection de ce membres
                    while ($donnees = mysql_fetch_array($resultat))
                    {
                        echo "suppression du membres pour session expirée";
                        $nom=$donnees['PSEUDO'];
                        mysql_query("DELETE FROM membresconnectes WHERE PSEUDO='$nom'");
                        
                        }
                    }

Posté : 14 juin 2008, 10:21
par ouckileou
Maintenant que ça c'est réglé tu pourrais peut-être trouver le moyen de ne faire qu'une requête DELETE pour supprimer d'un coup tous les pseudos concernés, parceque requête SQL dans une boucle, généralement c'est pas top.

Genre essayer d'arriver à ça :

Code : Tout sélectionner

DELETE FROM membresconnectes WHERE pseudo IN ('pseudo1', 'pseudo2', 'pseudo3');

Posté : 14 juin 2008, 10:33
par speccy666
Ahhhh! bahhh oui!!! pffff! merci...

A force de faire du copier /coller d'amateur... j'avais pas vu cette énormité... mais j'en apprend tous les jours grâce à vous....

Sinon bonne idée que celle de la simplification de la requête ; Il n'y a pas une requête qui me permet de supprimer directement?? j'ai déjà vu des trucs du style :
$rq="DELETE * FROM membresconnectes (SELECT PSEUDO FROM membresconnectes WHERE TIMESTAMP<'$dureede30min')";

Vous connaissez la bonne syntaxe?

Posté : 14 juin 2008, 10:48
par sadeq
Si Si:
$rq="DELETE FROM membresconnectes WHERE PSEUDO IN (SELECT PSEUDO FROM membresconnectes WHERE TIMESTAMP<'$dureede30min')"; 
Mais remarque que cela peut être simplifié par :
$rq="DELETE FROM membresconnectes WHERE TIMESTAMP<'$dureede30min'"; 
Du coup, on comprend pas pourquoi tu fais un select pour enchainer par un rafale de delete. Puisque tu ne traite rien dans la boucle while. Remplacer tout le bazar par un simple Delete.

Posté : 14 juin 2008, 10:50
par ouckileou
Ou encore :

Code : Tout sélectionner

"DELETE FROM membresconnectes WHERE TIMESTAMP<'$dureede30min';
Pourquoi faire un SELECT pour supprimer juste derrière sans rien faire d'autre entre temps ?

Posté : 14 juin 2008, 10:54
par sadeq
Bonjour Ouckileou. Désolé pour le doublon.

Posté : 14 juin 2008, 10:57
par ouckileou
Oh ben pas de problème, c'est moi qui suis derrière en plus. Et comme ça, ça martèle le message ! :P

Posté : 14 juin 2008, 12:07
par speccy666
Ah ben merci! mais ne vous inquiétez pas ! dans ma boucle WHILE je fais des tas de choses dont la suppression de l'enregistrement mais pour simplifier j'ai enlevé.... :?

Ben c'est tout bête la requête.... arf! faut que je m'y fasse à chercher des choses simples.... mais au bout de 2000 ou 3000 lignes de codes, je commence à fatiguer....

Pffff! ça devient un long projet mon bidule et un programmeur HTML/SQL/PHP/FLASH débutant comme moi y laisse quelques cheveux parfois... mais c'est plutot en cours de finalisation....

Vous pourrez bientôt jouer à un Quizz original et éthique .....je l'espère! :wink:

Merci à vous.