probléme de synthaxe

Mammouth du PHP | 19672 Messages

25 sept. 2006, 22:59

regarde du coté de urldecode()
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

25 sept. 2006, 23:02

Ok... pas fait attention que $categorie était un tableau.

Modifie comme suite :
$categorie = isset($_POST['categorie']) ? $_POST['categorie'] : "";
$clauses_cat =  (isset($_GET['categorie']) ? urldecode($_GET['categorie']) : null;  // récupération de la variable clauses_cat qui est une chaine de caractères passé dans l'url  

$pays = addslashes($pays); 
$page = isset($_GET['page']) ? $_GET['page'] : '';  

if(!isset($clauses_cat)) // si $clauses_cat est définie à ce niveau cela signifie que tu es passé par un lien donc inutile d'effectuer cette opération
{
    /* On compte le nombre de catégories cochées */
    $nb_cat = count($categorie);
    /* On crée un tableau pour stocker les clauses */
    $tableau_clauses = array();
    for($i = 0; $i < $nb_cat; $i++)
    {
        /* On ajoute la clause dans le tableau */
        $tableau_clauses[] = "categorie = '". $categorie[$i] ."'";
    }
    /* On va créer une chaine avec toutes les clauses stockées séparées entre elles par l'opérateur OR */
    $clauses_cat = implode(" OR ", $tableau_clauses);
    /* On ajoute la chaîne créée à la requête */
} 
affiche toujours les requêtes générées pour vérifier.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 87 Messages

26 sept. 2006, 00:49

merci à vous
je vais tester ça :D

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 sept. 2006, 11:25

Pas d'accord Truc, on ne peut concidérer le même paramètre à la fois comme un tableau et une chaîne.
Ceci est source d'erreur dans les 2 lignes contradictoires :
$categorie = isset($_POST['categorie']) ? $_POST['categorie'] : ""; //????
$clauses_cat =  (isset($_GET['categorie']) ? urldecode($_GET['categorie']) : null;  // récupération de la variable clauses_cat qui est une chaine de caractères passé dans l'url   
D'après la lecture du code qui suit ces 2 lignes, on peut comprendre que "categorie" est une source de type tableau dans l'esprit de l'auteur car il dit que ça représente des cases cochées dans un form (peut être de recherche)

A mon avis, l'auteur doit utiliser le nom "clauses_cat" dans le HREF de navigation page/page au lieu du nom du paramètre "categorie" car si il ya navigation page/page les critères de recherche ne doivent pas changer.
Donc : le tableau "categorie" et la chaine "clauses_cat" sont deux éléments exclusifs mais la chaine "clauses_cat" dépond du tableau "categorie".

Le scénario logique est le suivant:
1° cas:
  • Critères de recherches saisis
    • ---> en autres : tableau categorie reçu
      • ---> chaine "clauses_cat" déterminée pour la requête
        • ---> exécution et affichage de la requête (avec index de navigation page/page)

2° cas:
  • Navigation
    • ---> en autres : chaine clauses_cat reçue
      • ---> exécution et affichage de la requête (avec index de navigation page/page)
L'algorithme qui détermine cette dépondance fonctionnelle est le suivant :
  • 1. Si pas de chaine "clauses_cat"
    • 1.1. Alors: Si tableau "categorie"
      • 1.1.1. Alors: créer la chaine "clauses_cat" à partir du tableau "categorie"
        1.1.2. Sinon: la chaine "clauses_cat" <- vide;
      1.2. Sinon: la chaine "clauses_cat" existe déjà => la garder telquel (rien à faire)
    2. Continuer le traitement ...
Ce qui peut être écrit en php comme ça:
//Paramètres reçus
$categorie = isset($_POST['categorie']) ? $_POST['categorie'] : ""; //les catégories cochées
$clauses_cat =  (isset($_GET['clauses_cat']) ? urldecode($_GET['clauses_cat']) : null; //la chaine clause_cat

//Déterminer les catégories choisies: source (clausecat ou tableau categorie)
$clauses_cat = !$clauses_cat?($categorie?"categorie = '" . implode("' OR categorie = '", $categorie) . "'": "categorie Like '%'" ):$clauses_cat;
Ce code peut remplacer dans ton ton programme le bloc suivant:
$categorie = isset($_POST['categorie']) ? $_POST['categorie'] : ""; 
$clauses_cat =  (isset($_GET['categorie']) ? urldecode($_GET['categorie']) : null;  // récupération de la variable clauses_cat qui est une chaine de caractères passé dans l'url   

if(!isset($clauses_cat)) // si $clauses_cat est définie à ce niveau cela signifie que tu es passé par un lien donc inutile d'effectuer cette opération 
{ 
    /* On compte le nombre de catégories cochées */ 
    $nb_cat = count($categorie); 
    /* On crée un tableau pour stocker les clauses */ 
    $tableau_clauses = array(); 
    for($i = 0; $i < $nb_cat; $i++) 
    { 
        /* On ajoute la clause dans le tableau */ 
        $tableau_clauses[] = "categorie = '". $categorie[$i] ."'"; 
    } 
    /* On va créer une chaine avec toutes les clauses stockées séparées entre elles par l'opérateur OR */ 
    $clauses_cat = implode(" OR ", $tableau_clauses); 
    /* On ajoute la chaîne créée à la requête */ 
} 
Et exige la modification des lignes qui affichent le HREF de navigation selon ce qui suit:
echo "<a href=\"".$PHP_SELF."?page=".$i."&pays=".$pays."&clauses_cat=".$clauses_cat......
Modifié en dernier par sadeq le 26 sept. 2006, 14:54, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 87 Messages

26 sept. 2006, 12:35

bonjour
j'ai appliqué les deux codes dans les deux cas il y eu un parse error ;
lié au ( de
$clauses_cat =  (isset($_GET['clauses_cat']) ? urldecode($_GET['clauses_cat']) : null; //la chaine clause_cat 

celui de (isset(etc le 1er
lorsque je l'enléve dans les deux cas

Code : Tout sélectionner

SELECT * FROM fille WHERE pays = 'russie' AND ();
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in d:\www\une-bellehistoire.com\htdocs\script13.php on line 39
PRECEDENT
SELECT * FROM fille WHERE pays = 'russie' AND ();


Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in d:\www\une-bellehistoire.com\htdocs\script13.php on line 80
avec le code de TRUC méme probléme de ( lorsque je l'enléve
ça fait SELECT * FROM fille WHERE pays = 'russie' AND (categorie = \'18 25 ans\');


Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in d:\www\une-bellehistoire.com\htdocs\script12.php on line 54
PRECEDENT
SELECT * FROM fille WHERE pays = 'russie' AND (categorie = \'18 25 ans\');


Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in d:\www\une-bellehistoire.com\htdocs\script12.php on line 95
l'avantage mais si l'on peut dire est que la requete affiché est entiere
je comprend le principe de tout ça je suis allé voir la rubrique indiqué par Cyrano mais là je vois pas ce qui cloche

Mammouth du PHP | 19672 Messages

26 sept. 2006, 12:46

Tu ne peux pas avoir «AND ()» avec des parenthèses vides. Il faut donc vérifier s'il y a des clauses aditionnelles et dans ce cas seulement ajouter le AND(etc...) , autrement, tu n'ajoutes rien de plus à la clause WHERE existante.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 sept. 2006, 14:58

dans le cas où aucune catégorie n'est choisie pourquoi ne pas étendre la recherche à toutes les catégories et dans ce cas :
$clauses_cat = !$clauses_cat?($categorie?"categorie = '" . implode("' OR categorie = '", $categorie) . "'": "categorie Like '%'" ):$clauses_cat;
Pour éviter le cas SQL ".... AND ()"
Avec ce code, si pas de $categorie alors SQL est "..... AND (categorie Like '%')" ce qui sélectionne toutes les catégories (critère neutre)

Ou alors faire comme a dit Cyrano : le AND et companie ne doivent être intégrés à la requête que si $clauses_cat n'est pas vide :
..."SELECT * FROM fille WHERE pays = '". $pays."' " .($clauses_cat?" AND (". $clauses_cat .")":"").....
Personnellement je concidère cette dernière écriture correctement obligatoire car on ne peut laisser passer une valeur vide qui risque de fausser la syntaxe ou la logique de la requête.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 87 Messages

26 sept. 2006, 17:09

bonjour
le probléme dans ce script c'est que catégorie ne peut jamais étre vide
dans la base de donnée c'est une donnée not null qui a systématiquement une valeur vu que tout le monde a un age tout le monde rentre dans une catégorie. Cette clause catégorie est justement là pour qu'il y est toujours un résultat.
bref j'ai finalement réussie a adapter un script faisant la méme chose
sauf qu'au lieu de catégorie(de tableau grrr) il y a ageMin ageMax ce qui fait un champs de moins à ma base et donc un champs de moins a remplir
mais comme il y a forcément toujours un probléme
les valeurs affichées dans le tableau sur la page sont systématiquement entouré d'un guillemet style "blabla"
est ce parce que c'est affiché dans un tableau?
je viens de errer dans google sans résultats
voici le bout de code:
echo'<table>';
$i= 1;  
while ($row =mysql_fetch_array ($result) ) 

{ if($i == 1){ echo'<tr>';}
echo'<td><img src="'.$row['image'].'"width="150px" height="200px"></img><BR><BR>"'.$row['filleID'].'"</td>';
echo'<td>"'.$row['prénom'].'"</td>';
$i++;
if($i> $nb) { echo'</tr>';$i= 1;}
}
echo'</table>'; 
quand j'affiche le prénom en dehors du tableau ce qui au passage boussille le tableau il n'y a plus de guillement
comment faire pour supprimer ces guillemets?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 sept. 2006, 17:27

Ecoutes si tu n'ouvres pas les yeux et ne lis pas bien nos posts je vois pas pourquoi on te répondrait d'avantage !

Sinon ta dernière "erreur" c'est toi qui l'a glissé dans le code : des guillemets inutiles dans les <td> entourant les variables $row['filleID'] et
$row['prénom'].

Correction:
echo'<td><img src="'.$row['image'].'" width="150px" height="200px"></img><BR><BR>'.$row['filleID'].'</td><td>'.$row['prénom'].'</td>';
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 87 Messages

26 sept. 2006, 18:48

bon ok
c'etait bien la que résidait l'erreur
et bien je vais suivre ton conseil
je vais prendre du recul
j'y verrais plus clair demain

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

26 sept. 2006, 19:50

Pas d'accord Truc, on ne peut concidérer le même paramètre à la fois comme un tableau et une chaîne.
erf... tout à fait d'accord... tit erreur (oubli :) ) :oops:
En fait j'avais la même chose en tête :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 87 Messages

29 sept. 2006, 10:05

merci de votre aide ça fonctionne
une semaine sur un script c'est pas mal
c'est clair qu'au lieu d'adapter des scripts il vaut mieux y passer du temps et tout faire sois méme ça evite des erreurs dés le départ :lol:

Mammouth du PHP | 19672 Messages

29 sept. 2006, 10:11

Je nuancerais en disant que ça n'évite pas les erreurs, en revanche on sait ce qu'on a fait ainsi que le raisonnement suivi lors du développement et on va beaucoup plus rapidement trouver une panne.

D'où l'importance qu'il y a à commenter son code. N'oublie pas en effet que là, ton système est frais dans ta tête, tu trouves vite des erreurs, mais qu'en sera-t-il dans six mois, un an, deux ans...:?:

<mode taquin>N'est-ce pas Ripat ? :langue:</mode taquin>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: