Php :construction de requête selon variable

Résolu/Fermé
razily Messages postés 250 Date d'inscription lundi 9 mars 2009 Statut Membre Dernière intervention 4 décembre 2013 - 1 juin 2010 à 16:20
razily Messages postés 250 Date d'inscription lundi 9 mars 2009 Statut Membre Dernière intervention 4 décembre 2013 - 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 dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
1 juin 2010 à 20:58
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 mardi 21 juillet 2009 Statut Membre Dernière intervention 16 juin 2010 16
1 juin 2010 à 17:43
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 mardi 21 juillet 2009 Statut Membre Dernière intervention 16 juin 2010 16
2 juin 2010 à 08:22
C'est vrai que c'est plus clair comme ça :)
1
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
2 juin 2010 à 09:06
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 lundi 9 mars 2009 Statut Membre Dernière intervention 4 décembre 2013 2
7 juin 2010 à 11:32
Salut à tous ;

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

A+
0
razily Messages postés 250 Date d'inscription lundi 9 mars 2009 Statut Membre Dernière intervention 4 décembre 2013 2
7 juin 2010 à 15:10
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 dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
7 juin 2010 à 17:02
$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 lundi 9 mars 2009 Statut Membre Dernière intervention 4 décembre 2013 2
7 juin 2010 à 21:22
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