Php :construction de requête selon variable

Résolu
Bonjour à tous ;

mon stage évolue et là on me demande de créer des formulaires contenant des cases à cocher et des listes déroulantes et et de créer des recherches en fonction des choix de l'utilisateur .
ma première question c'est au niveau des requêtes , vu que j'exploite access je ne sais pas comment faire pour construire ne requête en fonction des variables qu'on entre ; je sais que sous mysql (voir tuto mateo ) ou sur oracle çà existe :
voici extrait exemple tuto mateo (site du zero ) pour bien comprendre ce que je vous demande :
<code >
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}

$req = $bdd->prepare('SELECT nom, prix FROM jeux_video WHERE possesseur = ? AND prix <= ? ORDER BY prix');
$req->execute(array($_GET['possesseur'], $_GET['prix_max']));

echo '<ul>';
while ($donnees = $req->fetch())
{
echo '<li>' . $donnees['nom'] . ' (' . $donnees['prix'] . ' EUR)</li>';
}
echo '</ul>';

$req->closeCursor();

?>

</code>
notez bien l'utlisation de :
<code >
$req->execute(array($_GET['possesseur'], $_GET['prix_max']));

</code>

en géneral une requête php via access se fait comme sui :
<code >
<?php
//connection au serveur:
$cnx = odbc_connect( "DSN_personnes", "root", "" ) or die("Impossible de se connecter à la bas de donn&eacutee") ;

// requête

$sql = "SELECT * FROM personnes where Datenaissance = #Format('05-15-2010', "mm/dd/yyyy")# " ;

//ex&eacutecution de la requête:
$requete = odbc_do($cnx, $sql) ;

//affichage des donn&eacutees:
while( $result = odbc_fetch_object( $requete ) )
{
echo("<div align=\"center\">".$result->nom." ".$result->prenom.datefr($result->Datenaissance)." <a href=\"modification3.php?idPersonne=".$result->id_personne."\">modifier</a><br>\n") ;
}

odbc_close( $cnx); // ferme la connexion
?>

</code>

mais je n'ai aucune idée de ce qu'il fallait faire pour que la requête soit comme suit et que çà marche :
<code >
// construction de requête en fonction des variables

$sql = "SELECT * FROM personnes where Datenaissance = ? " ;

</code>

Autre question , car c'est la première fois que je mène un projet de ce genre en php ; comment fait -on pour les cases à cocher : car si j'ai par exemple des cases (Automobile , habitation , sante )
il faut que j'adapte la requête en fonction des choix de l'utilisateur :

par exemple si Automobile et habitation sont cochés
il faut que je fais une requête come suit :

<code >

$sql = "SELECT * FROM contrat where type like 'Automobile' or 'habitation' " ;

je ne sais pas trop si çà peut se faire ??

</code>

si quelqu'un sait un tuto ou pourra m'apporter leur avis ; çà me fairait vraiment plaisir car il me reste quelques jours pour faire çà :-°

merci d'avance

<config>Windows Vista / Firefox 3.6.3</config

8 réponses

  1. pour les cases a cocher si dans ton formulaire tu mets les input ainsi
    les names avec des []

    <input type="checkbox" name="contrat[]" value="habitation" /> habitation
    <input type="checkbox" name="contrat[]" value="maison" /> maison
    <input type="checkbox" name="contrat[]" value="sante" /> sante


    tu va recuperer ce qui est coché dans un array
    $array_contrat=$_POST['contrat'];

    donc ensuite ta requette devient
    $req="SELECT * FROM contrat where type IN ".$array_contrat." ;
    1. Salut!

      Alors, je ne suis pas certain d'avoir bien compris la première partie de la question. Néanmoins, pour la seconde partie (les cases à cocher) la solution est relativement simple à mon avis:

      tu as un formulaire avec cases à cocher. Chaque case a son propre "name" ("automobile", 'habitation"...). Ce "name" va être passé à la page de destination lors de l'envoie du formulaire.
      Sur la page de destination du formulaire tu vas avoir une série de $_POST qui te permet de récupérer les variables envoyées par le formulaire. L'une des variables aura le nom du formulaire à choix multiples (autrement dit la partie à cocher à un nom, celui-ci est dans "id"). C'est cette variable qu'il faudra récupérer et qui aura pris la valeur de la case cochée (à savoir ce que tu auras mis dans le "name" correspondant à la case). Alors dans ta requête SQl, tu auras le nom de ta variable qui aura pris la bonne valeur.

      Je ne sais pas si je suis très clair sur ce coup-là...
      1. juste une précision en complément la condition WHERE IN doit être de la forme:

        WHERE IN (valeur1,valeur2,valeur3, etc..)

        donc ça ne marche pas directement avec l'array il faut faire un petit implode pour transformer l'array en une chaine dont les valeurs sont entre ' et séparées par des ,

        ta requette devient
        $req="SELECT * FROM contrat WHERE type IN  (" . implode("','", $array_contrat) . ")" ;
        1. Salut à tous ;

          merci pour vos réponses , çà me fait vraiment plaisir

          A+
          1. voilà j'ai suivi ce que vous m'avez dit en mettant

            
            $compagnie =$_GET['compagnie'];
            $sql ="select CLI.IDCabinet,CLI.Denomination,CLI.Adresse,POL.Codeclient,POL.Codeetatpolice,POL.NumPolice,POL.CodeCompagnie from Client as CLI , Police as POL
            where POL.CodeCompagnie IN (" . implode("','", $compagnie) . ")"  and  and CLI.Num =POL.Codeclient ";
            


            et j'ai des syntax error
            apprès j'ai voulu changer le code comme suit :

               // compagnie
             $compagnie = join(',', $_GET['compagnie']);
            


            resultat quand je fais echo sur $compagnie

            la compagnie : 1,1013,1087
            


            mais c'est au niveau de la requête qui pose problème

            select CLI.IDCabinet,CLI.Denomination,CLI.Adresse,POL.Codeclient,POL.Codeetatpolice,POL.NumPolice,POL.CodeCompagnie from Client as CLI , Police as POL where POL.CodeCompagnie IN (1,1013,1087) and and CLI.Num =POL.Codeclient
            
            Warning: odbc_do() [function.odbc-do]: SQL error: [Microsoft][Pilote ODBC Microsoft Access] Erreur de syntaxe (opérateur absent) dans l'expression « POL.CodeCompagnie IN (1,1013,1087) and and CLI.Num =POL.Codeclient »., SQL state 37000 in SQLExecDirect in C:\wamp\www\TestPhp\AvanceeCherch.php on line 63
            37000
            
            


            merci !!
            1. $compagnie =$_GET['compagnie']; //si le name des checkbox est bien name="compagnie[]"
              
              $sql ="SELECT CLI.IDCabinet,CLI.Denomination,CLI.Adresse,POL.Codeclient,POL.Codeetatpolice,POL.NumPolice,POL.CodeCompagnie FROM Client as CLI , Police as POL
               WHERE POL.CodeCompagnie IN (".implode("','", $compagnie).") AND CLI.Num = POL.Codeclient";
               //pourquoi deux fois AND ?
               
               //un petit echo de la requette pour voir
              echo 'Requette: '.$sql;
              
              1. Salut ;

                j'ai adapté le code comme suit et çà tout en s'inspirant de ce tu m'avais dit :
                
                // type de contrat
                $contratype = join(',', $_GET['police']);
                
                  // compagnie
                 $compagnie =  join(',', $_GET['compagnie']);
                 
                  // etat du contrat
                $etat =$_GET['etat'];
                
                $cnx = odbc_connect("DSN_Base","root","")or die ("impossible de se connecter a la base");
                
                $sql ="select CLI.IDCabinet,CLI.Denomination,CLI.Adresse,POL.Codeclient,POL.Codeetatpolice,POL.NumPolice,POL.CodeCompagnie from Client as CLI , Police as POL
                where POL.Typedepolice IN($contratype) and POL.CodeCompagnie IN ($compagnie)   and CLI.Num =POL.Codeclient and POL.Codeetatpolice= $etat
                group by POL.CodeCompagnie,CLI.IDCabinet,CLI.Denomination,CLI.Adresse,POL.Codeclient,POL.Codeetatpolice,POL.NumPolice ";
                
                
                // pour afficher la requete 
                echo $sql. "<br />";
                
                 echo '------------------------------------'."<br />";
                
                  $requete = odbc_do($cnx,$sql)or die (odbc_error());
                
                
                         while ($result=odbc_fetch_object($requete))
                             {
                
                             echo 'ID Cabinet:'.$result->IDCabinet."<br/>";
                              echo 'Denomination:'.$result->Denomination."<br/>";
                              echo 'Adresse:'.$result->Adresse."<br/>";
                               // echo 'Codeclient:'.$result->Codeclient."<br/>";
                             }
                			 
                   odbc_close( $cnx); // ferme la connexion
                
                
                
                
                
                
                
                


                afficage

                
                Array
                (
                    [police] => Array
                        (
                            [0] => 1
                            [1] => 3
                        )
                
                    [compagnie] => Array
                        (
                            [0] => 122
                            [1] => 1074
                        )
                
                    [etat] => 1
                    [ok] => Valider
                )
                <br/>type de contrat :1,3<br />la compagnie : 122,1074<br/>etat du constrat 1<br/>select CLI.IDCabinet,CLI.Denomination,CLI.Adresse,POL.Codeclient,POL.Codeetatpolice,POL.NumPolice,POL.CodeCompagnie from Client as CLI , Police as POL
                where POL.Typedepolice IN(1,3) and POL.CodeCompagnie IN (122,1074)   and CLI.Num =POL.Codeclient and POL.Codeetatpolice= 1
                group by POL.CodeCompagnie,CLI.IDCabinet,CLI.Denomination,CLI.Adresse,POL.Codeclient,POL.Codeetatpolice,POL.NumPolice <br />------------------------------------<br />ID Cabinet:388<br/>Denomination: Jean Marc<br/>Adresse:9 A Rue de <br/>Code etat police:En cours<br/>Numero police:605735<br/>compagnieAGF PARTICULIERS<br />------------------------------------<br />ID Cabinet:410<br/>Denomination:DOS SANTOS  <br/>Adresse:12 Rue de france<br/>Code etat police:En cours<br/>Numero police:607288<br/>compagnieAGF RISQUES PARTICULIERS<br />------------------------------------<br />
                
                
                
                


                en tout cas je tiens à vous remercier tous .