Savoir si une donnée existe dans une table

omsi
Invité n'ayant pas de compte PHPfrance

17 avr. 2006, 23:40

Alors je vous expose tout d'abord les faits.

V'la mon code :
<?php
//Ne pas oublier de mettre le session_start()
session_start();

include('header.php');
require('config.inc.php');

function accents_replace($string)
{
    $Caracs = array("(" => " ", ")" => " ", "$" => " ", "<" => " ", 
                    ">" => " ", "<" => " ", "&" => " ", "*" => " ", 
                    "!" => " ", "#" => " ", "'" => " ", "\"" => " ");

    $string  = strtr("$string", $Caracs);

    return $string;
}

//Ensuite on vérifie que la variable $_SESSION['logged'] existe et vaut bien true.
if (isset($_SESSION['logged']) && $_SESSION['logged'] == true)
{

    mysql_connect($host,$username,$password);
    mysql_select_db($bdd_name);

    $sql = "SELECT * FROM  WHERE pseudo='".$_SESSION['pseudo']."'";
    $req = mysql_query($sql) or die(mysql_error());
    $data = mysql_fetch_assoc($req);

    $team = $data['team'];

    if ($team == "Fils de Midgard" )
    {
        $pseudo=$_SESSION['pseudo'];
        $pseudo=strtolower($pseudo);
        $general=$_POST['general'];
        $attaque=$_POST['attaque'];
        $defense=$_POST['defense'];

        $general2=accents_replace($general);
        $attaque2=accents_replace($attaque);
        $defense2=accents_replace($defense);

        if($general2 == $general AND $attaque2 == $attaque AND $defense2 == $defense)
        {
            if(!$general OR !$attaque OR !$defense)
            {
                echo '<center><br><br><br>Vous n\'avez pas rempli toutes les parties.<br><br><a href=\"javascript:history.back()\">Retour</a></center>';
            }
            elseif( mysql_num_rows(mysql_fetch_assoc(mysql_query("SELECT * FROM classement WHERE pseudo='".$pseudo."'") or die(mysql_error()))) > 0)
            {
                mysql_query("UPDATE classement SET general='$general' WHERE pseudo='$pseudo'");
                mysql_query("UPDATE classement SET attaque='$attaque' WHERE pseudo='$pseudo'");
                mysql_query("UPDATE classement SET defense='$defense' WHERE pseudo='$pseudo'");

                echo '<center><br><br><br>C\'est ok!<br><br><a href=\"classement.php?b=1\" target=\"centre\">Retour</a></center>';
            }
            else
            {
                mysql_query("INSERT INTO classement ( pseudo, general, defense, attaque )VALUES ('$pseudo','$general','$defense','$attaque')");
                echo"<center><br><br><br>C'est ok!<br><br><a href=\"classement.php?b=1\" target=\"centre\">Retour</a></center>";
            }
        }
        else
        {
            echo"<center><br><br><br>Il y a des caractères interdits.<br><br><a href=\"javascript:history.back()\">Retour</a></center>";
        }
    }
    else
    {
        echo ' Vous n\'êtes pas autorisés a aller ici!';
    }
}
else
{
    echo 'Erreur : vous devez être connecté pour accéder à cette page !';
}
include('footer.htm');
?>
Vla la ligne qui pose probleme :
<?php
//...
                        elseif( mysql_num_rows(mysql_fetch_assoc(mysql_query("SELECT * FROM classement WHERE pseudo='".$pseudo."'") or die(mysql_error()))) > 0)
                        {
                                mysql_query("UPDATE classement SET general='$general' WHERE pseudo='$pseudo'");
                                mysql_query("UPDATE classement SET attaque='$attaque' WHERE pseudo='$pseudo'");
                                mysql_query("UPDATE classement SET defense='$defense' WHERE pseudo='$pseudo'");
                               
                                echo '<center><br><br><br>C\'est ok!<br><br><a href=\"classement.php?b=1\" target=\"centre\">Retour</a></center>';
                        }
//...
?>

Il faudrait que le else veuille dire : "Si ce pseudo est deja dans la BDD, alors on modifie le truc" (et ensutie le else si il y est pas)

Seulement la methode que j'ai essayée ne marche pas, je fais comment?

Merci de votre réponse

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 avr. 2006, 10:15

Si on s'en réfère la documentation, la méthode mysql_num_rows() prend pour argument la ressource de résultat qui vient d'être évaluée. Ce résultat vient de l'appel à la fonction mysql_query().

Toi tu lui passes le résultat de la méthode mysql_fetch_assoc() qui est un tableau (ce qui non seulement ne fonctionne pas, mais en l'occurence ne sert à rien ;))
elseif( mysql_num_rows(mysql_query("SELECT * FROM classement WHERE pseudo='$pseudo'") or die(mysql_error())) > 0)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

18 avr. 2006, 10:33

modération : omsi, je te demanderais de faire attention lorsque tu ouvre un sujet : ton titre était presque illisible. Je l'ai modifié pour toi mais pense-y la prochaine fois.

@Ryle : je ne suis pas sûr que ce code soit très stable en cas d'échec de la requete ;)
elseif( mysql_num_rows(mysql_query("SELECT * FROM classement WHERE pseudo='$pseudo'") or die(mysql_error())) > 0)
Je suis plutôt partisant de la séquenciation des actions :
function pseudo_exist($pseudo) {
  //Tant qu'on est pas sûr que le pseudo n'existe pas dans la base, on part du fait qu'il peut exister 
  $pseudo_exist = TRUE;
  //Construction de la requete
  $str_requete = "SELECT * FROM classement WHERE pseudo='".$pseudo."'";
  //Execution de la requete
  $o_result = mysql_query($str_requete) or die(mysql_error());
  //Si la requete a fonctionnée ET si il le pseudo n'existe pas
  if (mysql_num_rows($o_result) == 0 ) {
    $pseudo_exist = TRUE;
  } else { //La requete a échouée OU si le pseudo existe déjà
    $pseudo_exist = FALSE;
  }

  return $pseudo_exist;
}

if (...) {
  ...
} elseif(pseudo_exist($pseudo)) {
  ..
}
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 avr. 2006, 11:19

Je me suis contenté de reprendre son code et de signaler ce qui n'allait pas, j'ai pas dit que la façon de faire était bien ;) En cas d'erreur le die va nous renvoyer une valeur probablement considérée comme supérieure à 0 (pis quand bien même, sinon elle irait dans le else)

Je suis également partant pour la décomposition des choses de manière claire :) Par contre quitte à la décomposer, je remplacerais le SELECT * par un SELECT count(*) qui retournera 1 ou 0 selon que l'enregistrement soit trouvé ou non, et évitera de ramener inutilement les données de l'enregistrement :)

Pis j'en profite pour pinailler un peu, si le pseudo existe, ta fonction "pseudo_exist" renvoit "FALSE" et "TRUE" quand il n'existe pas :P

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

18 avr. 2006, 11:42

Je me suis contenté de reprendre son code et de signaler ce qui n'allait pas, j'ai pas dit que la façon de faire était bien ;) En cas d'erreur le die va nous renvoyer une valeur probablement considérée comme supérieure à 0 (pis quand bien même, sinon elle irait dans le else)
Mais je ne critiquais pas, j'essayais juste d'apporter ma pierre :oops:
Je suis également partant pour la décomposition des choses de manière claire :) Par contre quitte à la décomposer, je remplacerais le SELECT * par un SELECT count(*) qui retournera 1 ou 0 selon que l'enregistrement soit trouvé ou non, et évitera de ramener inutilement les données de l'enregistrement :)
Vu l'utilisation, je suis plus partisant du COUNT que du mysql_num_rows() pour la simple raison que mysql stocke cette données dans la table est cette requete est donc quasi instantannée
Pis j'en profite pour pinailler un peu, si le pseudo existe, ta fonction "pseudo_exist" renvoit "FALSE" et "TRUE" quand il n'existe pas :P
euh ... non mais oh, c'est pas zuste :oops:
Je nettoyais mon clavier, le coup est parti tout seul ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 avr. 2006, 12:23

lol !! j'aime beaucoup l'image du coup de clavier qui part tout seul ! :)

Pis ne t'en fais pas, je le prenais pas comme une critique, je disais que j'adhérais à ta façon de l'écrire même si je n'avais pas pris la peine de le faire dans mon premier message :)

Bon.. à part ça... il vient ce tag résolu ?! ;)

oms i
Invité n'ayant pas de compte PHPfrance

18 avr. 2006, 13:57

Désolé pour le titre modo :oops:

Bon bin sinon ca marche toujours pas :D

J'en susi a me demander si l'erreur va bien de cette requete

regardez plutot
Erreur de syntaxe près de 'WHERE pseudo='Admin'' à la ligne 1
Et bien evidemment le code que j'ai
<?php
//Ne pas oublier de mettre le session_start()
session_start();

include('header.php');
require('config.inc.php');

function accents_replace($string)
			{
			$Caracs = array("(" => " ", ")" => " ", "$" => " ", "<" =>
           " ", ">" => " ", "<" => " ", "&" => " ", "*" => " ", "!" =>
           " ", "#" => " ", "'" => " ", """ => " ");
               
           $string  = strtr("$string", $Caracs);
           
           return $string;
           }

//Ensuite on vérifie que la variable $_SESSION['logged'] existe et vaut bien true.
if (isset($_SESSION['logged']) && $_SESSION['logged'] == true)
{

	mysql_connect($host,$username,$password);
	mysql_select_db($bdd_name);
			
	$sql = "SELECT * FROM  WHERE pseudo='".$_SESSION['pseudo']."'";
	$req = mysql_query($sql) or die(mysql_error());
	$data = mysql_fetch_assoc($req);
	
	$team = $data['team'];

	if ($team == "Fils de Midgard" )
	{
		$pseudo=$_SESSION['pseudo'];
		$pseudo=strtolower($pseudo);
		$general=$_POST['general'];
		$attaque=$_POST['attaque'];
		$defense=$_POST['defense'];

		$general2=accents_replace($general);
		$attaque2=accents_replace($attaque);
		$defense2=accents_replace($defense);

		if($general2 == $general AND $attaque2 == $attaque AND $defense2 == $defense)
		{
			$structure = mysql_query("SELECT * FROM classement WHERE pseudo='".$pseudo."'");
			$row = mysql_num_rows($structure);
			function pseudo_exist($pseudo) 
			{
				//Tant qu'on est pas sûr que le pseudo n'existe pas dans la base, on part du fait qu'il peut exister
				$pseudo_exist = TRUE;
				//Construction de la requete
				$str_requete = "SELECT * FROM classement WHERE pseudo='".$pseudo."'";
				//Execution de la requete
				$o_result = mysql_query($str_requete) or die(mysql_error());
				//Si la requete a fonctionnée ET si il le pseudo n'existe pas
				if (mysql_num_rows($o_result) == 0 ) 
				{
					$pseudo_exist = TRUE;
				} 
				else 
				{ //La requete a échouée OU si le pseudo existe déjà
					$pseudo_exist = FALSE;
				}
				return $pseudo_exist;
			}

			if(!$general OR !$attaque OR !$defense)
			{
				echo '<center><br><br><br>Vous n\'avez pas rempli toutes les parties.<br><br><a href="javascript:history.back()">Retour</a></center>';
			}
			elseif (pseudo_exist($pseudo) != TRUE)
			{
				mysql_query("UPDATE classement SET general='".$general."', attaque='".$attaque."', defense='".$defense."' WHERE pseudo='".$pseudo."'");		
				echo '<center><br><br><br>C\'est ok!<br><br><a href="classement.php?b=1" target="centre">Retour</a></center>';
			}
			else
			{
				mysql_query("INSERT INTO classement ( pseudo, general, defense, attaque )VALUES ('$pseudo','$general','$defense','$attaque')");
				echo"<center><br><br><br>C'est ok!<br><br><a href="classement.php?b=1" target="centre">Retour</a></center>";
			}
		}
		else
		{
			echo"<center><br><br><br>Il y a des caractères interdits.<br><br><a href="javascript:history.back()">Retour</a></center>";
		}
	}
	else
	{
		echo ' Vous n\'êtes pas autorisés a aller ici!';
	}
}
else
{
   echo 'Erreur : vous devez être connecté pour accéder à cette page !';
}
include('footer.htm');
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 avr. 2006, 14:20

Utilise [ php ] au lieu de [ code ] pour mettre en couleur ton code php, c'est plus facile à relire :)

Bon pas grave, j'viens de trouver la requête qui n'allait pas ;)
$sql = "SELECT * FROM  WHERE pseudo='".$_SESSION['pseudo']."'";
Non mais franchement, les noms des tables dans les requêtes sql, c'est fait pour les nintendogs ?! ;)

Pour la peine, tu me feras deux "notre php" et un "je vous salut mysql" et tu me mettras la liste des champs que tu récupères à la place de l'étoile ! (ce qui de toute façon est un bon réflexe à prendre :))

Eléphanteau du PHP | 32 Messages

18 avr. 2006, 14:36

Merci beaucoup, chui laid ^^

Ma pénitence :
Notre PHP,
Qui est au site web
Que ton language soit codé,
Que ton reigne reste
Que tes fonctions marchent sur IE comme sur Firefox,
Pardonne nous nos "parse error",
Ou nous coderons en ASP,
Juste pour payer.
Alors ne nous soumet pas a cette dérision.
Delivre nous du HTMaL
Car c'est a toi qu'appartiennent
Internet, le Web et Google,
Pour des siècles et des siècles.
Amen();
Notre PHP,
Qui est au site web
Que ton language soit codé,
Que ton reigne reste
Que tes fonctions marchent sur IE comme sur Firefox,
Pardonne nous nos "parse error",
Ou nous coderons en ASP,
Juste pour payer.
Alors ne nous soumet pas a cette dérision.
Delivre nous du HTMaL
Car c'est a toi qu'appartiennent
Internet, le Web et Google,
Pour des siècles et des siècles.
Amen();
Je vous salue mysql,
Pleine de table,
Phpmyadmin est avec toi,
Vous êtres bénie entre toutes les BDD,
Et $sql le fruit de nos efforts est beni.
Sainte mysql mère de nos entrée,
Aidez nous pauvres codeurs,
Et $sql le fruit de nos efforts est beni.
Trop du mal a me rappeler de l'original ouf :P
Noob-codeur

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 avr. 2006, 14:48

lol !!

Excellent ! :)