Php :construction de requête selon variable

Résolu
razily Messages postés 250 Date d'inscription   Statut Membre Dernière intervention   -  
razily Messages postés 250 Date d'inscription   Statut Membre Dernière intervention   - 7 juin 2010 à 21:22
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ée") ;






// requête

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



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

//affichage des données:
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
A voir également:

8 réponses

Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
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
caccia Messages postés 95 Date d'inscription   Statut Membre Dernière intervention   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
caccia Messages postés 95 Date d'inscription   Statut Membre Dernière intervention   16
 
C'est vrai que c'est plus clair comme ça :)
1
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
razily Messages postés 250 Date d'inscription   Statut Membre Dernière intervention   2
 
Salut à tous ;

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

A+
0
razily Messages postés 250 Date d'inscription   Statut Membre Dernière intervention   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
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
$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
razily Messages postés 250 Date d'inscription   Statut Membre Dernière intervention   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