pb condition

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : pb condition

par Cyrano » 28 oct. 2006, 22:36

Cette ligne est effectivement incohérente : analyse là tranquilement. Elle correspond à la question :
- Si la variable $data est différente de './objet/piece_meca.gif' ou bien si la variable $data est différente de './objet/clef.gif';

Suppose maintenant qu'elle vaille l'une de ces deux valeurs : la condition retournera quand même TRUE puisque tu utilises OR au lien de AND et en utilisant OR, il faut qu'une des deux conditions soit vraie pour que l'alternatif IF() retourne TRUE. Or, $data ne peut mathématiquement pas valoir les deux valeurs à la fois. Donc ton alternative retournera TOUJOURS TRUE.

CQFD : remplace OR par AND et au passage, en PHP, tu peux écrire "OR" en mettant "||" et "AND" en mettant "&&". On utilise "OR" et "AND" en SQL.

par YVES » 28 oct. 2006, 22:17

J'ai passé quelques heures là dessus et ai changé mon fusil d'épaule car y'a rien à faire, des que je pose plus de deux conditions, ca coince d'une façon ou d'une autre et je ne trouve toujours pas la soluce.
J'ai donc limité simplement à si piece_meca, ok update et maj sessions, sinon, rien.
Avec tous mes différents tests, je confirme que c'est cette ligne qui pose problème:
if (($data!= './objet/piece_meca.gif') OR ($data!= './objet/clef.gif')){ 

par YVES » 28 oct. 2006, 17:06

suite au echo '$data = ' . $data . '<br />';
qui correspond à if (($data!= './objet/piece_meca.gif') OR ($data!= './objet/clef.gif')){

cela affiche le résultat de:

echo '<center><font color="red">Ce n\'est pas avec celà que vous aller réparer votre véhicule!</font></center>
<center><font color="black"><a href="reparervehicule.php">retour réparation véhicule</a></font></center>
alors que c'est bien "clef.gif" qui est visible à l'écran....
Je suppose donc que mon if ci-dessus ne colle pas vraiment?

Ryle, va falloir que je relise encore ton post, je n'ai pas bien compris en fait.

par Ryle » 28 oct. 2006, 00:02

Ce que je te propose rejoint ce que fait Ajoloca, mais l'idée est de te donner les principes obligatoires d'un débugage et tu verras qu'il y a un problème de logique :

Ton problème : ni la base, ni la session ne sont mises à jour. Commençons par la base.

Première chose à faire : afficher la requête qui est exécutée afin de voir si le sql généré correspond bien à ce que tu attends et éventuellement l'essayer directement dans mysql.
En l'occurence, si la syntaxe n'était pas bonne tu aurais une erreur dans le mysql_error(), mais tu devrais surtout constater que la requête n'a pas été affichée (sachant que si elle est affichée, le header() ne fonctionnera pas et te mettra un warning pour te dire qu'il n'arrive pas à rediriger car des entêtes html ont déjà été envoyés au navigateurs)

Donc pas de requête affichée, ca signifie que la partie du code n'est pas exécuté. On remonte donc voir ce qui empêche de lire cette partie là. On tombe sur un if(). Première chose à faire, vérifier que la condition est respectée :
if (($data == './objet/clef.gif')){ 
Il faut donc afficher la variable $data pour connaitre sa valeur et la comparer. Si elles sont différentes, c'est réglé et c'est normal :)

Si elles sont identiques, alors on remonte encore un peu et on constate que l'on est dans un else {} on va donc voir le if associé :
if (($data!= './objet/piece_meca.gif') OR ($data!= './objet/clef.gif')){ 
Et hop, qu'est ce qu'on voit : si $data est différent de './objet/piece_meca.gif' OU s'il est différent de './objet/clef.gif' alors on rentre dans le if() (et donc pas dans le else). En gros quelque soit la valeur de $data tu vas rentrer dans le if : il ne peut être égal aux deux et sera donc nécessairement différent de l'un ou de l'autre.

Donc test à corriger et tu continues ainsi de suite à mettre des echo de partout pour vérifier tes valeurs, les endroits du code par lesquels tu passes ;)

par Ajoloca » 27 oct. 2006, 23:10

Bonsoir,
Essaie ce code, ça aidera à voir ce qui se passe
<?php
    session_start();
    $id = $_SESSION['id'];
    $db= mysql_connect(localhost, xx, xx) or die("Impossible de se connecter à la base de données");        
    mysql_select_db('xxx',$db)  or die('Erreur de selection base'.mysql_error());
    $sql = "SELECT gestion FROM membres  WHERE id = ". $id; 
    $res = mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
    $data = mysql_result($res,0,'gestion');
    if ($data == './images/jetonrouge.gif'){
        echo '<center><font color="red">Désolé, mais VOTRE JETON EST ROUGE !</font></center>
                <center><font color="black"><a href="page_membre.php">retour page membre</a></font></center>';
    }
    else{
        $sql= "SELECT stock2 FROM membres WHERE id = " . $id; 
        $res=mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
        $data = mysql_result($res,0,'stock2');
        if (($data!= './objet/piece_meca.gif') OR ($data!= './objet/clef.gif')){
            echo '<center><font color="red">Ce n\'est pas avec celà que vous aller réparer votre véhicule!</font></center>
                    <center><font color="black"><a href="reparervehicule.php">retour réparation véhicule</a></font></center>';
        }
        else{
        		 echo '$data = ' . $data . '<br />';
             if (($data == './objet/clef.gif')){
                $sql = "UPDATE membres SET uvehicule= uvehicule-0.2, gestion = './images/jetonrouge.gif',
                        mp = ' Vous venez de réparer votre vehicule et son usure a diminué de 0.2 pts.',
                        uvehicule= uvehicule-0.2, ustock2= ustock2+0.1  WHERE id = ". $id; 
                mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
                echo '$res = ' . $res . '<br />';
                if($res){
                    $_SESSION['uvehicule']= $_SESSION['uvehicule']-0.2;
                    $_SESSION['gestion']='./images/jetonrouge.gif';
                    $_SESSION['ustock2']= $_SESSION['ustock2']+0.1;
                    $_SESSION['mp']=' Vous venez de réparer votre vehicule et son usure a diminué de 0.2 pts.';
               }
             }
         }
         exit();
        header("Location: page_membre.php");
    }
    mysql_close();
?>
Ce code ne laisse pas aller le PGM jusqu'au bout, c'est pour voir le contenu de certaines variables (qui posent PB)

par YVES » 27 oct. 2006, 23:09

meme en virant cette condition là (if $res) la maj ne se fait toujours pas.

par YVES » 27 oct. 2006, 22:54

$res vient de plus haut dans le script....
(j'ai d'autres requetes plus simples construites à l'identique et qui fonctionnent) :?
bref, je ne pige toujours pas, désolé :oops:

par Ajoloca » 26 oct. 2006, 21:59

Dans cette partie de code la valeur de $res, elle viens d'où
 if($res){
                    $_SESSION['uvehicule']= $_SESSION['uvehicule']-0.2;
                    $_SESSION['gestion']='./images/jetonrouge.gif';
                    $_SESSION['ustock2']= $_SESSION['ustock2']+0.1;
                    $_SESSION['mp']=' Vous venez de réparer votre vehicule et son usure a diminué de 0.2 pts.'; 
Regarde bien la ligne qui est juste devant le if($res) et les autres appels à mysql_query().

par YVES » 26 oct. 2006, 21:48

OUI, mes conditions sont placées correctement.
Et meme avec ton code, c'est toujours pareil, pas de mise à jour dans la base ni au niveau des sessions, pas de message d'erreurs, c'est un retour direct sur la page membre :cry:
J'arrive à coder pas mal de requètes tant qu'il n'y a qu'une variable à traiter, cela fonctionne toujours, mais dès qu'il y en a plusieurs (et donc des boucles et des if) ca ne va plus :?

par Ajoloca » 26 oct. 2006, 02:04

Bonsoir,
Indente correctement ton code... il ne sera pas que plus lisible pour nous mais également pour toi.
(le nombre d'accolades ouvrantes et fermantes me semble pourtant correct...)
En effet le nombre d'accolades est correct, mais sont-elles placées comme tu le voudrais ?

Je pense que là tu veras plus clair
<?php
	session_start();
	$id = $_SESSION['id'];
	$db= mysql_connect(localhost, xx, xx) or die("Impossible de se connecter à la base de données");        
	mysql_select_db('xxx',$db)  or die('Erreur de selection base'.mysql_error());
	$sql = "SELECT gestion FROM membres  WHERE id = ". $id; 
	$res = mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
	$data = mysql_result($res,0,'gestion');
	if ($data == './images/jetonrouge.gif'){
		echo '<center><font color="red">Désolé, mais VOTRE JETON EST ROUGE !</font></center>
				<center><font color="black"><a href="page_membre.php">retour page membre</a></font></center>';
	}
	else{
		$sql= "SELECT stock2 FROM membres WHERE id = " . $id; 
		$res=mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
		$data = mysql_result($res,0,'stock2');
		if (($data!= './objet/piece_meca.gif') OR ($data!= './objet/clef.gif')){
			echo '<center><font color="red">Ce n\'est pas avec celà que vous aller réparer votre véhicule!</font></center>
					<center><font color="black"><a href="reparervehicule.php">retour réparation véhicule</a></font></center>';
		}
		else{
 			if (($data == './objet/clef.gif')){
				$sql = "UPDATE membres SET uvehicule= uvehicule-0.2, gestion = './images/jetonrouge.gif',
						mp = ' Vous venez de réparer votre vehicule et son usure a diminué de 0.2 pts.',
						uvehicule= uvehicule-0.2, ustock2= ustock2+0.1  WHERE id = ". $id; 
				mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
				if($res){
					$_SESSION['uvehicule']= $_SESSION['uvehicule']-0.2;
					$_SESSION['gestion']='./images/jetonrouge.gif';
					$_SESSION['ustock2']= $_SESSION['ustock2']+0.1;
					$_SESSION['mp']=' Vous venez de réparer votre vehicule et son usure a diminué de 0.2 pts.';
   			}
 			}
 		}
		header("Location: page_membre.php");
	}
	mysql_close();
?>
Tes conditions sont elles placées correctement ???

par Vikchill » 26 oct. 2006, 00:29

j'ai viré le "select stock2" redondant...
et ai mis un echo'$sql'; comme indiqué mais c'est toujours pareil.
Ca d'accord, mais l'important c'est de le contrôler, et si tu ne trouves rien dis-nous ce qu'il contient ;)

par YVES » 25 oct. 2006, 21:57

<?php
  session_start();
 $id = $_SESSION['id'];
$db= mysql_connect(localhost, xx, xx) or die("Impossible de se connecter à la base de données"); 	   
 mysql_select_db('xxx',$db)  or die('Erreur de selection base'.mysql_error());
$sql = "SELECT gestion ".
       "FROM membres  ".
       "WHERE id = ". $id .";"; 
$res = mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
($data = mysql_result($res,0,'gestion'));
if ($data == './images/jetonrouge.gif')
{
    echo '<center><font color="red">Désolé, mais VOTRE JETON EST ROUGE !</font></center>
<center><font color="black"><a href="page_membre.php">retour page membre</a></font></center>';
}
else
{
$sql= "SELECT stock2 FROM membres WHERE id = ". $id .";"; 
$res=mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
($data = mysql_result($res,0,'stock2'));
if (($data!= './objet/piece_meca.gif') OR ($data!= './objet/clef.gif'))
{
echo '<center><font color="red">Ce n\'est pas avec celà que vous aller réparer
votre véhicule!</font></center>
<center><font color="black"><a href="reparervehicule.php">retour réparation véhicule</a></font></center>';
}
else
{
 if (($data == './objet/clef.gif'))
    {
$sql = "UPDATE membres SET uvehicule= uvehicule-0.2,
gestion = './images/jetonrouge.gif',
mp = ' Vous venez de réparer votre vehicule et son usure a diminué de 0.2 pts.',
uvehicule= uvehicule-0.2, ustock2= ustock2+0.1  WHERE id = ". $id .";"; 
mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
if($res)
   {
$_SESSION['uvehicule']= $_SESSION['uvehicule']-0.2;
$_SESSION['gestion']='./images/jetonrouge.gif';
$_SESSION['ustock2']= $_SESSION['ustock2']+0.1;
$_SESSION['mp']=' Vous venez de réparer votre vehicule et son usure a diminué de 0.2 pts.';
   }
 }
 }
header("Location: page_membre.php");
}
mysql_close();
?>

par YVES » 25 oct. 2006, 21:52

j'ai viré le "select stock2" redondant...
et ai mis un echo'$sql'; comme indiqué mais c'est toujours pareil.

par Vikchill » 24 oct. 2006, 19:38

J'ai une petite question: pourquoi tu fais ceci?
$sql= "SELECT stock2 FROM membres WHERE id = ". $id .";"; 
$res=mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
($data = mysql_result($res,0,'stock2'));
if (($data!= './objet/piece_meca.gif') OR ($data!= './objet/clef.gif'))
{
echo '<center><font color="red">Ce n\'est pas avec celà que vous aller réparer
votre véhicule!</font></center>
<center><font color="black"><a href="reparervehicule.php">retour réparation véhicule</a></font></center>';
}
else
{
$sql= "SELECT stock2 FROM membres WHERE id = ". $id .";"; 
$res=mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error()); 
Tu as deux fois la même requête, tu peux enlever les deux dernières lignes de ce code je crois.

En dehors de ça, fait un echo de $sql après ces lignes:
$sql = "UPDATE membres SET uvehicule= uvehicule-0.2,
gestion = './images/jetonrouge.gif',
mp = ' Vous venez de réparer votre vehicule et son usure a diminué de 0.2 pts.',
uvehicule= uvehicule-0.2, ustock2= ustock2+0.1  WHERE id = ". $id .";";
Il faut absolument contrôler la requête que tu construis, la lancer dans PHPMyAdmin pour être sûr qu'elle soit correcte.

par YVES » 24 oct. 2006, 19:19

<?php
  session_start();
 $id = $_SESSION['id'];
$db= mysql_connect(localhost, xxx, xxx) or die("Impossible de se connecter à la base de données"); 	   
 mysql_select_db('xxx',$db)  or die('Erreur de selection base'.mysql_error());
$sql = "SELECT gestion ".
       "FROM membres  ".
       "WHERE id = ". $id .";"; 
$res = mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
($data = mysql_result($res,0,'gestion'));
if ($data == './images/jetonrouge.gif')
{
    echo '<center><font color="red">Désolé, mais VOTRE JETON EST ROUGE !</font></center>
<center><font color="black"><a href="page_membre.php">retour page membre</a></font></center>';
}
else
{
$sql= "SELECT stock2 FROM membres WHERE id = ". $id .";"; 
$res=mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
($data = mysql_result($res,0,'stock2'));
if (($data!= './objet/piece_meca.gif') OR ($data!= './objet/clef.gif'))
{
echo '<center><font color="red">Ce n\'est pas avec celà que vous aller réparer
votre véhicule!</font></center>
<center><font color="black"><a href="reparervehicule.php">retour réparation véhicule</a></font></center>';
}
else
{
$sql= "SELECT stock2 FROM membres WHERE id = ". $id .";"; 
$res=mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
($data = mysql_result($res,0,'stock2'));
 if (($data == './objet/clef.gif'))
    {
$sql = "UPDATE membres SET uvehicule= uvehicule-0.2,
gestion = './images/jetonrouge.gif',
mp = ' Vous venez de réparer votre vehicule et son usure a diminué de 0.2 pts.',
uvehicule= uvehicule-0.2, ustock2= ustock2+0.1  WHERE id = ". $id .";"; 
mysql_query($sql) or die('Erreur SQL '.$sql.'<br>'.mysql_error());
if($res)
   {
$_SESSION['uvehicule']= $_SESSION['uvehicule']-0.2;
$_SESSION['gestion']='./images/jetonrouge.gif';
$_SESSION['ustock2']= $_SESSION['ustock2']+0.1;
$_SESSION['mp']=' Vous venez de réparer votre vehicule et son usure a diminué de 0.2 pts.';
   }
 }
 }
header("Location: page_membre.php");
}
mysql_close();
?>
Les quotes ont été ajoutées mais le résultat est identique...
retour sur page membre sans maj dans la db.