probléme de synthaxe

Eléphant du PHP | 87 Messages

24 sept. 2006, 18:02

Bonjour,
mon script est un script qui recupere les valeurs saisies par un utilisateur dans un formulaire qui contient un bouton à choix multiple c'est donc un script qui affiche le ou les résultats d'un moteur de recherche donc.
J'ai modifié le script pour limiter l'affichage à 1 résultat/page
un truc trés classique
or mon probléme est une erreur de syntaxe
Erreur : Erreur de syntaxe près de '= 'russie' AND (categorie = '18 25 ans' OR categorie = '25 35 an' à la ligne 1
il s'agit donc d'une erreur de synthaxe ds une des deux requetes ou les deux
mon code
<?php
require ("fonctions.php");
require ("Connect.php");

$pays = isset($_POST['pays']) ? $_POST['pays'] : '';
$categorie = isset($_POST['categorie']) ? $_POST['categorie'] : '' ;
$pays = htmlEntities(strip_tags($_POST['pays']));

{
    /* 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 */
}
// connection à la DB
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());

$nombre = 1;  // on va afficher 1 résultat par page.
if (!isset($limite)) $limite = 0; // si on arrive sur la page pour la première fois 
               // on met limite à 0.
    
$path_parts = pathinfo($_SERVER['PHP_SELF']); 
$page = $path_parts['basename'];


$select = "SELECT COUNT( * ) FROM fille".      
          "WHERE  pays = '". $pays ."' ".
          "AND (". $clauses_cat .");";
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$row = mysql_fetch_row($result);
$total = $row[0];



// requête SQL qui compte le nombre total d'enregistrements dans la table et qui
//récupère tous les enregistrements
// requête SQL qui ne prend que le nombre d'enregistrements nécessaire à l'affichage.



$select = "SELECT * FROM fille".
 "WHERE pays ='". $pays ."' ".
 "AND (". $clauses_cat .") LIMIT ".$limite.",".$nombre.";";

        
$result = mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );



// si on a récupéré un résultat on l'affiche.
if($result) {
    // début du tableau
    echo '<table bgcolor="#FFFFFF">'."\n";
        // première ligne on affiche les titres prénom et surnom dans 2 colonnes
        echo '<tr>';
        echo '<td bgcolor="#669999"><b><u>Prénom</u></b></td>';
        echo '<td bgcolor="#669999"><b><u>age</u></b></td>';
        echo '</tr>'."\n";
    // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    
    while($row = mysql_fetch_array($result)) {
        echo '<tr>';
		echo '<td bgcolor="#CCCCCC">'.$row['prénom'].'</td>';
        echo '<td bgcolor="#CCCCCC">'.$row['age'].'</td>';
        echo '</tr>'."\n";
    }
    echo '</table>'."\n";
    // fin du tableau.
}
else echo 'Pas d\'enregistrements dans cette table...';

// on libère le résultat
mysql_free_result($result);
if($total > $nombre) {
    // affichage des liens vers les pages

   echo'Pages de résultats<br>';
 affichePages($nombre,$page,$total);

    
}

?>
voila j'ai beau cherché je ne voit pas l'erreur

Mammouth du PHP | 19672 Messages

24 sept. 2006, 18:08

Chercher dans du PHP une erreur SQL, ce n'est pas la méthode la plus apropriée pour gagner du temps. Fais afficher la requête générée afin de la tester directement dans php»MyAdmin et éventuellement la corriger : à partir d'une requête SQL complète, tu pourras corriger ta construction dynamique.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

24 sept. 2006, 18:25

cette requete est à la base testé dans phpmyadmin
je vais afficher la requete
merci

Eléphant du PHP | 87 Messages

24 sept. 2006, 19:33

je ne parviens pas à afficher la 2ieme requete
ce qui me fait penser qu'evidement le probléme est là.....

Eléphant du PHP | 87 Messages

24 sept. 2006, 19:40

ma requete en sql

Code : Tout sélectionner

SELECT * FROM fille WHERE pays = 'russie' AND categorie = '18 25 ans ' LIMIT 0 ,1
je l'ai mis en php
<?php
//...
$sql = 'SELECT * '
        . ' FROM fille'
        . ' WHERE pays = \'russie\''
        . ' AND categorie = \'18 25 ans \''
        . ' LIMIT 0 ,1';
//...
?>

dans un script et ça fonctionne
le probléme est liés à la syntaxe des variables pays et categorie
enfin à mon avis....

Mammouth du PHP | 19672 Messages

24 sept. 2006, 20:40

On ne pourra pas deviner : il faut déterminer avec quelle requête ça plante et récupérer l'erreur retournée.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 87 Messages

25 sept. 2006, 00:31

Il s'agit bien sûr de la deuxieme requête (enfin à mon avis....)
celle là:
$requete = "SELECT * FROM fille
WHERE pays =". $pays ." 
AND ". $clauses_cat ." LIMIT ".$limite."".$nombre.";"; //ligne 3
Que j'ai modifié quelque peu.
ce qui nous donne le message suivant :

Erreur : Erreur de syntaxe près de 'AND categorie = '' LIMIT 01' à la ligne 3

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

25 sept. 2006, 00:54

ajoute un echo juste après ces 3 lignes :
echo "<p>requete générée :<br>".$requete."</p>";
$clauses_cat semble ne pas etre au complet
et il manque des apostrophes autour de la variable $pays.

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

25 sept. 2006, 09:01

Il manque au moins un espace entre les clauses.
dans une requête l'epace est obligatoire entre :
SELECT champs FROM table WHERE condition AND (conditon OR condition ....) ...

C'est la conacaténation qui trompe souvent le programmeur.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 87 Messages

25 sept. 2006, 10:38

merci beaucoup à vous
je teste cela dés que possible :)

Eléphant du PHP | 87 Messages

25 sept. 2006, 19:00

je suis arrivé à écrire des requêtes correct et à les afficher(ô joie...)
donc le moteur de recherche(formulaire selectionne)
mais ...... les liens devant afficher les liens des pages suivantes ne fonctionne pas et cela sur deux script differents (deux scripts qui font la méme chose ils affichent les résultats page par page )
donc voici le script que je préfére et aprés un bon bidouillage il affiche x résultats par ligne et x résultats par page et cela avec une requete classique select *from machin bref
voici le code
<?php 
require ("Connect.php");
$nb = 5;
$pays = isset($_POST['pays']) ? $_POST['pays'] : '';
$categorie = isset($_POST['categorie']) ? $_POST['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\">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\">$j</a> ";} 
else { echo "<b>$j</b>";} 
$i++;$j++; 
} 
} 

if($debut+$limit<$nb_total) { 
$suivant=$page+1; 
echo "<a href=\"$PHP_SELF?page=$suivant\">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>'; 



?> 

j'ai affiché les requétes les résultats
SELECT * FROM fille WHERE pays = 'russie' AND (categorie = '18 25 ans' OR categorie = '25 35 ans');

12 SUIVANT
SELECT * FROM fille WHERE pays = 'russie' AND (categorie = '18 25 ans' OR categorie = '25 35 ans');
donc les requetes sont coorects et d'ailleurs le script affiche bien les résultats désirés avec les liens (qui ne fonctionnent pas)
chose intérressante quand je clic sur un lien:
les requetes sont vides : SELECT * FROM fille WHERE pays = '' AND (categorie = '');

PRECEDENT
SELECT * FROM fille WHERE pays = '' AND (categorie = '');

d'ou le fait que la page suivante est vide
quel est le probléme les données ne sont pas récupérées sauf quand on submit le formulaire la 1er fois donc
merci de votre aide

Eléphant du PHP | 87 Messages

25 sept. 2006, 19:22

je precise qu'avec le 1er script affiché plus haut le probléme est identique les méme requetes vides
ne serait ce pas qu'en fait les valeur saisies sont récupérées dans un tableau????

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

25 sept. 2006, 19:28

a aucun moment tu passes les paramètres par les liens (url) tu perds donc les valeurs post du formulaire... logique, non ?

ajoute les données dans les liens
echo "<a href=\"".$PHP_SELF."?page=".$precedent."&pays=".$pays."\">PRECEDENT</a>";
et modifie la récupération comme suite :
$pays = isset($_POST['pays']) ? $_POST['pays'] : (isset($_GET['pays']) ? $_GET['pays'] : ''); 
La tu récupères les données POST (formulaire) si elles existent sinon les données GET (lien... après clic sur les liens :) )

Fait en de même pour les autres valeurs.

/!\ 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

25 sept. 2006, 20:04

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

Invité
Invité n'ayant pas de compte PHPfrance

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?......