JeuWeb - Crée ton jeu par navigateur
[Résolu] mysql_fetch_assoc ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu] mysql_fetch_assoc ? (/showthread.php?tid=2725)

Pages : 1 2


[Résolu] mysql_fetch_assoc ? - Rouge - 09-07-2008

Bonjour,

je voulais savoir si cette commande php était devenue obsolète?
(le script tout pret vient du site du zéro et ne fonctionne plus depuis 24 heures)
Code PHP :
<?php
include 'connexion.php';
// ETAPE 1 : on vérifie si l'IP se trouve déjà dans la table
// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ "ip" est l'adresse ip du visiteur
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$donnees = mysql_fetch_assoc($retour);

if (
$donnees['nbre_entrees'] == 0) // L'ip ne se trouve pas dans la table, on va l'ajouter
{
mysql_query('INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
}
else
// L'ip se trouve déjà dans la table, on met juste à jour le timestamp
{
mysql_query('UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
}

// -------
// ETAPE 2 : on supprime toutes les entrées dont le timestamp est plus vieux que 5 minutes

// On stocke dans une variable le timestamp qu'il était il y a 5 minutes :
$timestamp_10min = time() - (60 * 10); // 60 * 5 = nombre de secondes écoulées en 5 minutes
mysql_query('DELETE FROM connectes WHERE timestamp < ' . $timestamp_10min);

// -------
// ETAPE 3 : on compte le nombre d'ip stockées dans la table. C'est le nombre de visiteurs connectés
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes');
$donnees = mysql_fetch_assoc($retour);
echo
'<center><font face="Book Antiqua" color="#000000"><font size="2"><strong> ' . $donnees['nbre_entrees'] . ' </font></strong></font></font></center></br>';
?>

le message d'erreur affiché ressemble à celà:

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /mnt/web4/40/58/51658858/htdocs/connectes.php on line 6

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /mnt/web4/40/58/51658858/htdocs/connectes.php on line 27
:heuuu:


RE: mysql_fetch_assoc? - Kassak - 09-07-2008

Tu as un problème sur tes requêtes, n'hésite pas à abuser des "or die (mysql_error());" qui te permettront de déboguer facilement Wink


RE: mysql_fetch_assoc? - Sephi-Chan - 10-07-2008

Je dirais que la table connectes n'existe pas. Enfin bref, ce sont des erreurs dans tes requêtes.

Remplace ta première requête par :
Code PHP :
<?php 
$retour
= mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'') or exit(mysql_error());


Sephi-Chan


RE: mysql_fetch_assoc? - z3d - 10-07-2008

Tout comme Sephi-Chan le suggère implicitement par rapport à Kassak je teconseil d'utiliser exit() plutot que die() qui est un alias et comme chacun le sait les alias, il faut les éviter car à court ou à long terme celui-ci peut être appelé à disparaître.
De plus die() contrairement à exit() ne stop pas l'éxécution du script et laisser un script continuer alors que celui-ci obtient des erreurs dès le départ n'est pas rigoureux du tout.

Personnellement je pousse les vérifications à son maximum, je conditionne tout ce qu'il est possible.

Exemple :
Code PHP :
<?php 
/**
* Ton code
*/
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$donnees = mysql_fetch_assoc($retour);

/**
* Ton code conditionné
* Note toutefois le false ===
* C'est obligatoire car le COUNT(*) peut retourner 0 et
* celui-ci sera évaluer comme un booléen ce qui donnerait un résultat inattendu
*/
$sSQL = "SELECT COUNT(*) AS nbre_entrees ".
"FROM connectes ".
"WHERE ip = '".$_SERVER['REMOTE_ADDR']."'";
if(
false === ($retour = mysql_query($sSQL))) {
// Si la requête ne pause pas de souci, on peut utiliser les valeurs retournées
/**
* Rappel de Sephi-Chan, merci :) Comme quoi il fait pas bon d'écrire si tard...
* On test si la requête retourne plus de 0 ligne
*/
if(mysq_num_rows($retour) === 1) {
$donnees = mysql_fetch_assoc($retour);
// La suite de ton code...
} else {
echo
"<p>Erreur : Moins d'une ou plusieurs lignes retournées !?</p>";
}
} else {
// Sinon on a une erreur SQL
exit("<p><strong>Requête SQL :</strong> ".$sSQL."<br />".
"<strong>Numéro d'erreur :</strong> ".mysql_errno()."<br />"
"<strong>Message d'erreur :</strong> "
.mysql_error()."</p>");
}

Il va de soit que la condition else ne doit en aucun cas apparaître sur le site en production, d'ailleurs aucun message d'erreur qu'elle qu'il soit ne doit apparaître en production hormis ceux personnalisé, n'oublions pas toutefois le logging des erreurs rencontrées.

Exemple :
Citation :Une erreur inattendue est survenue !
Veuillez nous excuser pour ce désagrément.
Si le problème persiste veuillez avertir un modérateur.



RE: mysql_fetch_assoc? - Sephi-Chan - 10-07-2008

z3d a écrit :De plus die() contrairement à exit() ne stop pas l'éxécution du script et laisser un script continuer alors que celui-ci obtient des erreurs dès le départ n'est pas rigoureux du tout.
Comme tu le dis, c'est un alias, il a donc le même comportement.

De plus, ton contrôle ne contrôle pas vraiment tout. Si tu veux tout contrôler, il faut vérifier s'il y a eu une erreur SQL, auquel cas, selon que tu sois en configuration de production ou de développement, tu affiches/log ou non. Ensuite il faut tester si tu as le bon nombre de résultat. Ici, il ne doit rien avoir d'autre qu'un résultat, il faut donc tester si le num_rows vaut 1.


Sephi-Chan


RE: mysql_fetch_assoc? - z3d - 10-07-2008

Sephi-Chan a écrit :Comme tu le dis, c'est un alias, il a donc le même comportement.
Au temps pour moi, il y a des années que je n'utilise plus die();

Sephi-Chan a écrit :De plus, ton contrôle ne contrôle pas vraiment tout. Si tu veux tout contrôler, il faut vérifier s'il y a eu une erreur SQL, auquel cas, selon que tu sois en configuration de production ou de développement, tu affiches/log ou non.

Le test de l'erreur SQL est bien présent.

Sephi-Chan a écrit :Ensuite il faut tester si tu as le bon nombre de résultat. Ici, il ne doit rien avoir d'autre qu'un résultat, il faut donc tester si le num_rows vaut 1.
Je donne une indication sur la manière de tout conditionné maintenant si il faut en plus de cela détaillé pas à pas ce qu'il faut faire ou pas alors c'est que je me suis peut être trompé de forum :heuuu:

M'enfin tout cela pour en arriver à une conclusion importante : fuyez les alias !


RE: mysql_fetch_assoc? - Sephi-Chan - 10-07-2008

z3d a écrit :Je donne une indication sur la manière de tout conditionné maintenant si il faut en plus de cela détaillé pas à pas ce qu'il faut faire ou pas alors c'est que je me suis peut être trompé de forum :heuuu:
Mais non, mais non, c'était juste un complément d'information. Je ne remettais pas en cause ton post. Wink


Sephi-Chan


RE: mysql_fetch_assoc? - z3d - 10-07-2008

Y'a pas de sushi Smile

Ton indication est toujours bonne à prendre, je ne l'ai pas dit mais ca va de soit Wink


RE: mysql_fetch_assoc? - Cartman34 - 10-07-2008

Désolé z3d, mais die() est comme tu l'as dis un alias de exit alors de la définition d'un alias on peut se douter que die() et exit() font exactement la même chose et c'est le cas.
die() stoppe le script et affiche le message immédiatement.
Il vient d'ailleurs en recours à une redirection header qui n'empêche pas la continuité d'exécution du script.
De plus, les raisons historiques étant fréquemment évoqués lors de l'ancienneté des fonctions et die étant la plus courante, ell ne sera jamais supprimé du catalogue PHP.

Rouge: mysql_fetch_assoc() est une "amélioration" de mysql_fetch_array() et est une fonction rendant un résultat plus léger donc elle est plutôt loin d'être obsolète. C'est juste que le sdz n'est pas un bon prof ^^ (et je le vois malheureusement encore...on doit tout leur apprendre à ces jeunes)


[RESOLU] mysql_fetch_assoc? - Rouge - 10-07-2008

Merci à tous pour vos propositions, en fait Sephi-Chan avait raison, j'avais viré la table "connectés" en bidouillant ma base de données. :mauvais: