probléme de synthaxe

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 : probléme de synthaxe

par Cyrano » 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>

resolu

par laurentg2003 » 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:

par Truc » 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:

par laurentg2003 » 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

par sadeq » 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>';

par laurentg2003 » 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?

par sadeq » 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.

par Cyrano » 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.

par laurentg2003 » 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

par sadeq » 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......

par laurentg2003 » 26 sept. 2006, 00:49

merci à vous
je vais tester ça :D

par Truc » 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.

par Cyrano » 25 sept. 2006, 22:59

regarde du coté de urldecode()

par Invité » 25 sept. 2006, 22:16

Bonsoir,
voici mon nouveau code avec les modifications
<?php 
require ("Connect.php");
$nb = 5;
$pays = isset($_POST['pays']) ? $_POST['pays'] : (isset($_GET['pays']) ? $_GET['pays'] : '');
$categorie = isset($_POST['categorie']) ? $_POST['categorie'] : (isset($_GET['categorie']) ? $_GET['categorie'] : '');    

$pays = addslashes($pays); 
$page = isset($_GET['page']) ? $_GET['page'] : '';  
//$categorie = addslashes (trim ($_POST['categorie']));

{
    /* 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 */
}




$connexion = mysql_pconnect (SERVEUR,NOM,PASSE);

if (! $connexion)
{
 echo"Désolé,connexion à " . SERVEUR ." impossible\n";
 exit;
}

if (! mysql_select_db (BASE,$connexion))
{
 echo "Désolé,accés à la base " . BASE . " impossible\n";
}
// Prepare le requete MySql 

$requete ="SELECT * FROM fille WHERE pays = '". $pays ."' AND (". $clauses_cat .");";  
      // WHERE pays LIKE '$pays' 
      // AND age BETWEEN $anMin and $anMax";     
 echo"<p>". $requete ."</p>\n";         
$ret = mysql_query($requete); 
// Variable nombre d'enreg par page 
$limit=10; 
if($debut==""){$debut=0;} 
$debut=$page*$limit; 
// Compte le nombre de champ 
$nb_total=mysql_num_rows($ret); 
// Requete 
$limite=mysql_query("$requete limit $debut,$limit"); 


// Affiche le page par page avec ses liens 
if ($page>0) { 
$precedent=$page-1; 
echo "<a href=\"".$PHP_SELF."?page=".$precedent."&pays=".$pays."&categorie=".$clauses_cat."\">PRECEDENT</a>"; 
} 

$i=0; 
$j=1; 

if($nb_total>$limit) { 
while($i<($nb_total/$limit)) { 
if($i!=$page){echo "<a href=\"".$PHP_SELF."?page=".$i."&pays=".$pays."&categorie=".$clauses_cat."\">$j</a> ";} 
else { echo "<b>$j</b>";} 
$i++;$j++; 
} 
} 

if($debut+$limit<$nb_total) { 
$suivant=$page+1; 
echo "<a href=\"".$PHP_SELF."?page=".$suivant."&pays=".$pays."&categorie=".$clauses_cat."\">SUIVANT</a>"; 
} 


//Affichage le contenu de votre table 
//avec une limite, dans l'exemple $limit est à 4 

$limit_str = "LIMIT ". $page * $limit .",$limit"; 

$result = mysql_query("SELECT * FROM fille WHERE pays = '". $pays ."' AND (". $clauses_cat .")   
                       ORDER BY 'filleID'        
                       ASC $limit_str");
					   echo"<p>". $requete ."</p>\n";
 // WHERE pays LIKE '$pays' 
  //         AND age BETWEEN $anMin and $anMax  
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></td>';
$i++;
if($i> $nb) { echo'</tr>';$i= 1;}
}
echo'</table>'; 



?> 

alors il y a malgré tout du nouveau :
les liens n'affichent toujours rien mais
SELECT * FROM fille WHERE pays = 'russie' AND (categorie = 'c');
donc pour pays c'est réglé
alors j'ai essayé categorie=$categorie ou clause_cat et méme $_GET['categorie'] à un moment ça m'a affiché categorie = array ce qui est logique
dans la barre de navigation cela marque ce qui est normal vu que c'est get
machinchosephp?page=1&pays=russie&categorie=categorie%20=%20'18%2025%20ans'%20OR%20categorie%20=%20'25%2035%20ans'
enfait catégorie pose probléme
que faire?......

par laurentg2003 » 25 sept. 2006, 20:04

merci je vais tester ça effectivement je perd les données en route