SELECT tout quand champ est vide

Eléphanteau du PHP | 27 Messages

29 mai 2005, 12:00

Cyrano, je t'ai mis un chti message privé...

Merci...

Mammouth du PHP | 19672 Messages

29 mai 2005, 12:01

BOn, le problème, c'est que tu exécute ta requête AVANT d'y ajouter des clauses éventuelles.

J'ai repris l'ensemble du code présenté pour lui apporter quelques corrections que voici:
<?
/* On construit la requête de base */
$Requete = "SELECT * FROM biens WHERE true = 'true'";
/* On ajoute des clauses si des paramètres ont été envoyés */
if($prix != "")
{
    $Requete .= " AND prix = '".$prix."'";
}
if($ville != "")
{
    $Requete .= " AND ville = '".$ville."'";
}
if($typ != "")
{
    $Requete .= " AND typ = '".$typ."'";
}
if($surf != "")
{
    $Requete .= " AND surf = '".$surf."'";
}
if($et != "")
{
    $Requete .= " AND et = '".$et."'";
}
?>
<table class="texte" width="96%" border="1" bordercolor="#FFE26F" cellspacing="0" align="center">
  <tr>
    <td WIDTH=3% align="center" bgcolor="#FFCB1A">S.</td>
    <td WIDTH=3% align="center" bgcolor="#FFCB1A">N°</td>
    <td WIDTH=6% align="center" bgcolor="#FFCB1A">Ville</td>
    <td WIDTH=4% align="center" bgcolor="#FFCB1A">Type</td>
    <td WIDTH=5% align="center" bgcolor="#FFCB1A">Prix</td>
    <td WIDTH=3% align="center" bgcolor="#FFCB1A">Surf</td>
    <td WIDTH=3% align="center" bgcolor="#FFCB1A">Photo 1</td>
    <td WIDTH=3% align="center" bgcolor="#FFCB1A">Photo 2</td>
    <td WIDTH=3% align="center" bgcolor="#FFCB1A">Photo 3</td>
    <td WIDTH=3% align="center" bgcolor="#FFCB1A">Photo 4</td>
    <td WIDTH=3% align="center" bgcolor="#FFCB1A">Editer</td>
  </tr>
<?php
/* On exécute la requête */
$recherche = mysql_query($Requete);

/* On récupère le résultat de la requête */
while($Result = mysql_fetch_array($recherche))
{
?>
  <tr>
    <td WIDTH=3% align="center" bgcolor="#FFECAA"><input type="button" value="S" style="FONT-FAMILY: Verdana; FONT-SIZE: 8pt" OnClick="window.location='../../photos/photos/purge_a.php?num=<?php echo($Result['num']); ?> && tof1=<?php echo($Result['tof1']); ?> && tof2=<?php echo($Result['tof2']); ?> && tof3=<?php echo($Result['tof3']); ?> && tof4=<?php echo($Result['tof4']); ?>'"></td>
    <td WIDTH=3% align="center"><?php echo(stripslashes($Result['num'])); ?>&nbsp;</td>
    <td WIDTH=6% align="center"><?php echo(stripslashes($Result['ville'])); ?>&nbsp;</td>
    <td WIDTH=4% align="center"><?php echo(stripslashes($Result['typ'])); ?>&nbsp;</td>
    <td WIDTH=5% align="center"><?php echo(stripslashes($Result['prixe'])); ?>&nbsp;</td>
    <td WIDTH=3% align="center"><?php echo(stripslashes($Result['surf'])); ?>&nbsp;</td>
    <td WIDTH=3% align="center"bgcolor="#FFFFE8" ><img height="60" src="../../photos/photos/".stripslashes($Result['tof1'])."">&nbsp;</td>
    <td WIDTH=3% align="center"bgcolor="#FFFFE8" ><img height="60" src="../../photos/photos/".stripslashes($Result['tof2'])."">&nbsp;</td>
    <td WIDTH=3% align="center"bgcolor="#FFFFE8" ><img height="60" src="../../photos/photos/".stripslashes($Result['tof3'])."">&nbsp;</td>
    <td WIDTH=3% align="center"bgcolor="#FFFFE8" ><img height="60" src="../../photos/photos/".stripslashes($Result['tof4'])."">&nbsp;</td>
    <td WIDTH=3% align="center" bgcolor="#FFF9E1"><input type="button" value="E." style="FONT-FAMILY: Verdana; FONT-SIZE: 8pt" OnClick="window.location='detail_a.php?num=<?php echo($Result['num']); ?>'"></td>
  </tr>
<?php
}
?>
</table>

Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

29 mai 2005, 12:17

Le même, un petit peu allégé... ;)
<?php
// On construit la requête de base
$Requete = "SELECT * FROM biens WHERE 1 = 1";
// On ajoute des clauses si des paramètres ont été envoyés
if ($prix != "")  $Requete .= " AND prix = '".$prix."'";
if ($ville != "") $Requete .= " AND ville = '".$ville."'";
if ($typ != "")   $Requete .= " AND typ = '".$typ."'";
if ($surf != "")  $Requete .= " AND surf = '".$surf."'";
if ($et != "")    $Requete .= " AND et = '".$et."'";
?>
<table class="texte" width="96%"" border="1" bordercolor="#FFE26F" cellspacing="0" align="center">
  <tr bgcolor="#FFCB1A">
    <td width="3%" align="center">S.</td>
    <td width="3%" align="center">n°</td>
    <td width="6%" align="center">Ville</td>
    <td width="4%" align="center">Type</td>
    <td width="5%" align="center">Prix</td>
    <td width="3%" align="center">Surf</td>
    <td width="3%" align="center">Photo 1</td>
    <td width="3%" align="center">Photo 2</td>
    <td width="3%" align="center">Photo 3</td>
    <td width="3%" align="center">Photo 4</td>
    <td width="3%" align="center">Editer</td>
  </tr>
<?php
// On exécute la requête
$recherche = mysql_query($Requete);

// On récupère le résultat de la requête
while ($Result = mysql_fetch_array($recherche))
      {
?>
  <tr>
    <td width="3%" align="center" bgcolor="#FFECAA"><input type="button" value="S" style="FONT-FAMILY: Verdana; FONT-SIZE: 8pt" OnClick="window.location='../../photos/photos/purge_a.php?num=<?php echo($Result['num']); ?> && tof1=<?php echo($Result['tof1']); ?> && tof2=<?php echo($Result['tof2']); ?> && tof3=<?php echo($Result['tof3']); ?> && tof4=<?php echo($Result['tof4']); ?>'"></td>
    <td width="3%" align="center"><?php echo(stripslashes($Result['num'])); ?>&nbsp;</td>
    <td width="6%" align="center"><?php echo(stripslashes($Result['ville'])); ?>&nbsp;</td>
    <td width="4%" align="center"><?php echo(stripslashes($Result['typ'])); ?>&nbsp;</td>
    <td width="5%" align="center"><?php echo(stripslashes($Result['prixe'])); ?>&nbsp;</td>
    <td width="3%" align="center"><?php echo(stripslashes($Result['surf'])); ?>&nbsp;</td>
    <td width="3%" align="center"bgcolor="#FFFFE8" ><img height="60" src="../../photos/photos/".stripslashes($Result['tof1'])."">&nbsp;</td>
    <td width="3%" align="center"bgcolor="#FFFFE8" ><img height="60" src="../../photos/photos/".stripslashes($Result['tof2'])."">&nbsp;</td>
    <td width="3%" align="center"bgcolor="#FFFFE8" ><img height="60" src="../../photos/photos/".stripslashes($Result['tof3'])."">&nbsp;</td>
    <td width="3%" align="center"bgcolor="#FFFFE8" ><img height="60" src="../../photos/photos/".stripslashes($Result['tof4'])."">&nbsp;</td>
    <td width="3%" align="center" bgcolor="#FFF9E1"><input type="button" value="E." style="FONT-FAMILY: Verdana; FONT-SIZE: 8pt" OnClick="window.location='detail_a.php?num=<?php echo($Result['num']); ?>'"></td>
  </tr>
<?php
       }
?>
</table>
NB : Je me suis permis de remplacer la clause WHERE true = 'true' par WHERE 1 = 1
car même si elle fonctionne, cette écriture ne me paraît pas très académique... ;)

Suggestions :
- Tu peux virer tous tes width="...%", ne serait-ce que parce que la largeur totale de tes cellules est de 39%.
- En utilisant les CSS, tu simplifierais beaucoup le code d'affichage de ton tableau

Eléphanteau du PHP | 27 Messages

29 mai 2005, 12:29

Merci merci, je teste...

J'ai encore un chti message d'erreur ici :

while ($Result = mysql_fetch_array($recherche))

et comme message

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in W:\www\intra\recherche\rech_a.php on line 84

Quand à mes photos, elles ne s'affiche plus... On dirait qu'il ne les trouve pas....

Je vais essayer de corriger... on s'approche...

Attention parfois la requete s'execute correctement et parfois non...
(a part les photos qui elle ne s'affiche jamais) C'est curieux..

Merci pour votre aide

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

29 mai 2005, 12:36

avant de lancer l'exécution de ta requête par
$recherche = mysql_query($Requete); 
vérifie si la syntaxe de ta requête est bien correcte (normalement, oui) avec un
echo $Requete;

Eléphanteau du PHP | 27 Messages

29 mai 2005, 12:38

Oup's, pardon, c'est moi qui ai couillu...

Ca marche nickel...

Merci a tous et j'espère que cela en aidera d'autre car j'ai vraiment
galéré dans ma recherche et sans vous cela aurait été impossible...

Merci encore

Mammouth du PHP | 19672 Messages

29 mai 2005, 12:38

L'erreur indiquée est bizarre...?
en modifiant légèrement, on peut améliorer en faisant :
while($Result = mysql_fetch_array($recherche, MYSQL_ASSOC))
Mais ça ne changera pas grand chose: Est-ce que la connexion à MySQL et la sélection de la base sont bien là avant la construction de la requête ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 27 Messages

29 mai 2005, 12:45

Excusez, c moi qui avait merdé... nom de champs

Par contre mes photos ne s'affiche plus, je vais chercher...

Merci

Mammouth du PHP | 19672 Messages

29 mai 2005, 13:19

Fais afficher les variable pour vérifier que la chaine reçus correspond bien au chemin vers le fichier...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

29 mai 2005, 14:55

en modifiant légèrement, on peut améliorer en faisant :
while($Result = mysql_fetch_array($recherche, MYSQL_ASSOC))
ou utiliser directement mysql_fetch_assoc($recherche)...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

30 mai 2005, 16:25

NB : Je me suis permis de remplacer la clause WHERE true = 'true' par WHERE 1 = 1
car même si elle fonctionne, cette écriture ne me paraît pas très académique... ;)
la syntaxe que j'avais posté était :
WHERE 'true' = 'true'

est-ce plus académique ? :P

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

30 mai 2005, 16:27

Ca revient au même que Albat puisque tu teste si une chaine est égale à elle même !!!!

Mais je serais d'avis à dire que tu risque moins l'erreur de syntaxe avec l'écriture 1=1
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

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

30 mai 2005, 16:34

Ca revient au même que Albat puisque tu teste si une chaine est égale à elle même !!!!
oui, justement...
Mais je serais d'avis à dire que tu risque moins l'erreur de syntaxe avec l'écriture 1=1
bof, y'a quand même peu de risque sur ce coup-là non ? ;)

à mon avis c'est plutôt chacun son truc

à moins qu'il soit plus rapide de tester l'égalité de 2 entiers que de 2 chaines, là je serais d'accord ;)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

30 mai 2005, 16:37

En bas niveau, il est plus rapide de tester un entier que des chaines

Mais en commence a voir la différence sur plusieurs dizaines, voir milliers de test, pas sur 1 seul. A moins que tu ne chasse les pertes ...

Sinon, c'est vrai que sur ce coup là, l'erreur est assez visible, mais sur

Code : Tout sélectionner

'cettecolonnedoitetrebonne'='cettecolonedoitetrebonne'
Je ne pense pas que l'erreur te saute immédiatement aux yeux...
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

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

30 mai 2005, 16:43

Mais en commence a voir la différence sur plusieurs dizaines, voir milliers de test, pas sur 1 seul. A moins que tu ne chasse les pertes ...
oui, je me doute bien, mais c'était pour dire que cet argument aurait été plus valable à mes yeux
je me doute bien que sur 10 enregistrements on ne voit pas la différence :roll:
Sinon, c'est vrai que sur ce coup là, l'erreur est assez visible, mais sur

Code : Tout sélectionner

'cettecolonnedoitetrebonne'='cettecolonedoitetrebonne'
Je ne pense pas que l'erreur te saute immédiatement aux yeux...
d'accord avec toi, mais bon restons dans le cas présent, faudrait être bête pour mettre des valeurs aussi longues pour juste avoir une condition toujours vraie :lol:

enfin bref... c'est pas important de toute façon