IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XQUERY/SGBD XML Discussion :

Problème requête avec récupération de variables via post


Sujet :

XQUERY/SGBD XML

  1. #1
    Membre actif Avatar de jbidou88
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    493
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 493
    Points : 242
    Points
    242
    Par défaut Problème requête avec récupération de variables via post
    Bonjour,

    Je souhaite faire une recherche sur des annonces, j'ai donc un formulaire avec quelques critères de recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    <div id="content">
    	           <form method="post" action="recherche.xql">
                		<p>
                		  <label>Marque :</label>
                		  <select name="make" id="make">
                		      <option value="">Tous...</option>
                		          {
                                        let $annonces := collection("annonces/Simple")
                                        for $make in distinct-values($annonces/ns:Ad/ns:Make)
                                        return <option value="{data($make)}">{data($make)}</option>
                                    } 
                            </select>
                        </p>
                        <p>
                        <label>Modèle :</label>
                        <input type="text" name="model" id="model" />
                        </p>
                        <p>
                        <label>Prix :</label>
                        <select name="prixMin" id="prixMin">
                            <option value="">Tous...</option>
                            <option value="0">0 CHF</option>
                            <option value="1000">1000 CHF</option>
                            <option value="2000">2000 CHF</option>
                            <option value="5000">5000 CHF</option>
                            <option value="10000">10000 CHF</option>
                            <option value="20000">20000 CHF</option>
                            <option value="30000">30000 CHF</option>
                            <option value="40000">40000 CHF</option>
                            <option value="50000">50000 CHF</option>
                            <option value="100000">100000 CHF</option>
                            <option value="200000">200000 CHF</option>
                            <option value="300000">300000 CHF</option>
                        </select>
                        à
                        <select name="prixMax" id="prixMax">
                            <option value="">Tous...</option>
                            <option value="0">0 CHF</option>
                            <option value="1000">1000 CHF</option>
                            <option value="2000">2000 CHF</option>
                            <option value="5000">5000 CHF</option>
                            <option value="10000">10000 CHF</option>
                            <option value="20000">20000 CHF</option>
                            <option value="30000">30000 CHF</option>
                            <option value="40000">40000 CHF</option>
                            <option value="50000">50000 CHF</option>
                            <option value="100000">100000 CHF</option>
                            <option value="200000">200000 CHF</option>
                            <option value="300000">300000 CHF</option>
                        </select>
                        </p>
                        <p>
                		  <label>Carburant :</label>
                		  <select name="carburant" id="carburant">
                		      <option value="">Tous...</option>
                		          {
                                        let $annonces := collection("/db/annonces/Simple")
    									for $carb in distinct-values($annonces/ns:Ad/ns:GeneralData/ns:Motorization)
    									order by $carb 
    									return <option value="{data($carb)}">{data($carb)}</option>
                                    } 
                            </select>
                        </p>
                         <p>
                		  <label>Statut :</label>
                		  <select name="statut" id="statut">
                		      <option value="">Tous...</option>
                		          {
                                        let $annonces := collection("/db/annonces/Simple")
    									for $status in distinct-values($annonces/ns:Ad/ns:GeneralData/ns:Status)
    									order by $status 
    									return <option value="{data($status)}">{data($status)}</option>
                                    } 
                            </select>
                        </p>
                        <p>
                        	<input type="submit" value="Rechercher" />
                        </p>
                    </form>
                </div>
    Ensuite je souhaite afficher les annonces qui correspondent à mes critères de recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    xquery version "1.0" encoding "utf-8";
     
    declare default element namespace "http://www.w3.org/1999/xhtml";
    declare namespace ns = "http://ns.clic.ch/cours/XML/AdVehicleSimple";
    declare option exist:serialize "method=xhtml media-type=text/html omit-xml-declaration=yes encoding=utf-8 indent=yes doctype-public=-//W3C//DTD XHTML 1.0 Strict//EN doctype-system=http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";
    declare variable $make := (request:get-parameter('make', ''));
    declare variable $model := (request:get-parameter('model', ''));
    declare variable $prixMin := (request:get-parameter('prixMin', ''));
    declare variable $prixMax := (request:get-parameter('prixMax', ''));
    declare variable $carburant := (request:get-parameter('carburant', ''));
    declare variable $statut := (request:get-parameter('statut', ''));
     
    <html>
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
    		<title>Index</title>
     
    		<link rel="stylesheet" type="text/css" href="css/stylesheet.css" media="screen" />
     
    		<script type="text/javascript" src="js/fonctions.js"></script>
    	</head>
    	<body>
    	   <div id="main">
    	       <div id="header">
    	           <h1>Annonce(s)</h1>
    	       </div>
    	       <div id="content">
    	       		<p>{request:get-parameter('make', '')}</p>
    	       		<p>{request:get-parameter('model', '')}</p>
    	       		<p>{request:get-parameter('prixMin', '')}</p>
    	       		<p>{request:get-parameter('prixMax', '')}</p>
    	       		<p>{request:get-parameter('carburant', '')}</p>
    	       		<p>{request:get-parameter('statut', '')}</p>
     
                </div>
                <div class="annonce">
    					let $annonces := collection("annonces/Simple")
    					let $where := concat("1=1",
    					if($make != "") then concat("and $ad/ns:Make =", $make) else (),
    					if($model != "") then concat("and $ad/ns:Model =", $model) else (),
    					if($prixMin != "") then concat("and $ad/ns:GeneralData/ns:Amount >", $prixMin) else (),
    					if($prixMax != "") then concat("and $ad/ns:GeneralData/ns:Amount <", $prixMax) else (),
    					if($carburant != "") then concat("and $ad/ns:GeneralData/ns:Motorization =", $carburant) else (),
    					if($statut != "") then concat("and $ad/ns:Status =", $statut) else ())
    					for $ad in $annonces/ns:Ad
    					where ($where)
    					return
    					(<img src="{data($ad/ns:Image)}" alt="{data($ad/ns:Make)}"/>,
    					<p>{data($ad/ns:Make)}</p>,
    					<p>{data($ad/ns:Model)}</p>,
    					<p>{data($ad/ns:GeneralData/ns:Status)}</p>,
    					<p>{data($ad/ns:GeneralData/ns:Cm3)} cm3</p>,
    					<p>{data($ad/ns:GeneralData/ns:Transmission)}</p>,
    					<p>{data($ad/ns:GeneralData/ns:Motorization)}</p>,
    					<p>{data($ad/ns:GeneralData/ns:Km)} KM</p>,
    					<p>{data($ad/ns:GeneralData/ns:Amount)} CHF</p>)
    			</div>
    Le problème est le suivant, j'ai une parse error mais impossible de trouver où :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Error found
     
    err:XPST0003: Parse error: element name containing whitespace: unexpected token: , $prixMax) else (),
    if($carburant != ") then concat( at line: 43 column: 107
     
    Java Stack Trace:
    Class Name	Method Name	File Name	Line
    org.exist.xquery.parser.XQueryParser	elementConstructor	XQueryParser.java	8607
    org.exist.xquery.parser.XQueryParser	elementContent	XQueryParser.java	10052
    org.exist.xquery.parser.XQueryParser	mixedElementContent	XQueryParser.java	9665
    org.exist.xquery.parser.XQueryParser	elementWithAttributes	XQueryParser.java	9520
    org.exist.xquery.parser.XQueryParser	elementConstructor	XQueryParser.java	8589
    org.exist.xquery.parser.XQueryParser	elementContent	XQueryParser.java	10052
    org.exist.xquery.parser.XQueryParser	mixedElementContent	XQueryParser.java	9665
    org.exist.xquery.parser.XQueryParser	elementWithAttributes	XQueryParser.java	9520
    org.exist.xquery.parser.XQueryParser	elementConstructor	XQueryParser.java	8589
    org.exist.xquery.parser.XQueryParser	elementContent	XQueryParser.java	10052
    org.exist.xquery.parser.XQueryParser	mixedElementContent	XQueryParser.java	9665
    org.exist.xquery.parser.XQueryParser	elementWithoutAttributes	XQueryParser.java	9612
    org.exist.xquery.parser.XQueryParser	elementConstructor	XQueryParser.java	8594
    org.exist.xquery.parser.XQueryParser	elementContent	XQueryParser.java	10052
    org.exist.xquery.parser.XQueryParser	mixedElementContent	XQueryParser.java	9665
    org.exist.xquery.parser.XQueryParser	elementWithoutAttributes	XQueryParser.java	9612
    org.exist.xquery.parser.XQueryParser	elementConstructor	XQueryParser.java	8594
    org.exist.xquery.parser.XQueryParser	directConstructor	XQueryParser.java	7302
    org.exist.xquery.parser.XQueryParser	primaryExpr	XQueryParser.java	7001
    org.exist.xquery.parser.XQueryParser	filterStep	XQueryParser.java	6147
    Avez-vous une idée de ce qui peut être faux ?

    Merci beaucoup pour votre aide

  2. #2
    Ziki_s
    Invité(e)
    Par défaut
    Je ne sais pas exactement où est ton erreur, mais tu devrais déjà mettre tes variables $make et $model entre des apostrophes, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if($make != "") then concat("and $ad/ns:Make = '", $make, "'") else (),
    if($model != "") then concat("and $ad/ns:Model = '", $model, "'") else (),

  3. #3
    Membre actif Avatar de jbidou88
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    493
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 493
    Points : 242
    Points
    242
    Par défaut
    Merci pour votre conseil, j'ai fait ça pour toutes les chaînes de texte. Mais toujours la même erreur.

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je vois la construction de div effectivement souffre d'erreur multiple.

    [1] La syntaxe de div ne respecte pas bien la syntaxe de constructeur d'élément au sens de xquery. Il manque de bretelles englobantes, n'est-ce pas?

    [2] Je vois un peu ce que vous voulez faire pour $where. Même si la façon de faire "where ($where)" est faisable - ce qui n'est exactement pas - il est erroné à maints endroits, comme par exemple manquant un espace devant 'and', comme par exemple qu'il n'est pas correct d'utiliser else() parce que ça peut conduire à une structure comme concat(x,,y,) - ce qui est une erreur.

    [3] La construction "where ($where)" n'est pas valable. La raison est simple: "where a=b" n'est pas la même que "where 'a=b'". Dans le cas-ci, même une certaine extension comme saxon:evaluate() ne peut pas le sauver pour des raisons de difficulté très technique. Bref, l'approche me semble tout à fait méconçue.

    Voici ce que je souhaite de réécrire de ce bloque pour garder au moins quelque chance de succès.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
        <div class="annonce">
        {
            let $annonces := collection("annonces/Simple")
            for $ad in $annonces/ns:Ad
            where (
                (if($make != "") then $ad/ns:Make = $make else fn:true())
                and
                (if($model != "") then $ad/ns:Model = $model else fn:true())
                and
                (if($prixMin != "") then $ad/ns:GeneralData/ns:Amount > $prixMin) else fn:true())
                and
                (if($prixMax != "") then $ad/ns:GeneralData/ns:Amount < $prixMax else fn:true())
                and
                (if($carburant != "") then $ad/ns:GeneralData/ns:Motorization = $carburant else fn:true())
                and
                (if($statut != "") then $ad/ns:Status = $statut else fn:true())
            )
            return (
                <img src="{data($ad/ns:Image)}" alt="{data($ad/ns:Make)}"/>,
                <p>{data($ad/ns:Make)}</p>,
                <p>{data($ad/ns:Model)}</p>,
                <p>{data($ad/ns:GeneralData/ns:Status)}</p>,
                <p>{data($ad/ns:GeneralData/ns:Cm3)} cm3</p>,
                <p>{data($ad/ns:GeneralData/ns:Transmission)}</p>,
                <p>{data($ad/ns:GeneralData/ns:Motorization)}</p>,
                <p>{data($ad/ns:GeneralData/ns:Km)} KM</p>,
                <p>{data($ad/ns:GeneralData/ns:Amount)} CHF</p>
            )
        }
        </div>
    Je ne peux évidemment pas la tester pour les cas concrets pour une raison évidente, et il se peut y avoir des typos aussi - mais, c'est le plan d'ensemble général que je serais écrit au premier temps avant tester.

  5. #5
    Membre actif Avatar de jbidou88
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    493
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2006
    Messages : 493
    Points : 242
    Points
    242
    Par défaut
    Merci beaucoup pour vos très bonnes explications, cela fonctionne !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème requête avec variables sous forms
    Par mikeOSX dans le forum Forms
    Réponses: 4
    Dernier message: 20/06/2008, 14h48
  2. Réponses: 23
    Dernier message: 21/12/2006, 22h47
  3. Problème requête avec 2 conditions
    Par omgirl dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 12/07/2006, 16h19
  4. Problème requête avec group by et distinct
    Par tomca dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/07/2005, 16h10
  5. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo