Php :construction de requête selon variable

Résolu
razily Messages postés 285 Statut Membre -  
razily Messages postés 285 Statut Membre -
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. Alain_42 Messages postés 5413 Statut Membre 904
     
    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." ;
    2
  2. caccia Messages postés 96 Statut Membre 16
     
    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
  3. caccia Messages postés 96 Statut Membre 16
     
    C'est vrai que c'est plus clair comme ça :)
    1
  4. Alain_42 Messages postés 5413 Statut Membre 904
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. razily Messages postés 285 Statut Membre 2
     
    Salut à tous ;

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

    A+
    0
  7. razily Messages postés 285 Statut Membre 2
     
    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 !!
    0
  8. Alain_42 Messages postés 5413 Statut Membre 904
     
    $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;
    
    0
  9. razily Messages postés 285 Statut Membre 2
     
    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 .
    0