Version complète: sur le forum Webmaster Hub : création d'une requête dont les variables
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
ouarzazat
Bonjour, bonsoir,

je ne sais plus très bien où j'en suis...smile.gif

Voilà une question de novice, et bien souvent les questions de novice ont une réponse plus compliquée qu'il n'y parait, malheureusement.

Alors j'espère que je ne vais pas demander (une fois de plus?) quelque chose qui n'existe pas, un mysql_pere_noel() ou je ne sais trop quoi wink.gif

Allez, essayons de faire simple. Disons que je veuille effectuer une recherche dans une seule table via un formulaire de recherche "case à cocheté"(avec des cases à cocher, j'avais dit 'essayons').

Chaque case à cocher permet à l'utilisateur d'ajouter un critère de recherche qui correspond à un champ de ma table. ex: la case à cocher 'trucmuche' me permet de rechercher les entrées dont le champ 'trucmuche' de ma table est rempli.

Nous avons donc plusieurs cases à cocher, je sais pas pourquoi je le répète mais ça me fait plaisir.

Bref, rentrons maintenant dans le vif du sujet, les plus vifs d'entre vous sauront certainement déjà où je veux en venir et trouveront le vif du sujet pas très vif, un peu mou quoi. Et là je dis tant mieux.

Donc comment générer une requête sql en fonction des critères sélectionnés par l'utilisateur?

En donnant un exemple, si l'utilisateur a coché 'trucmuche' et 'machinchouette' dans le formulaire, comment générer cette requête:
SELECT identifiant FROM matable WHERE trucmuche='euhuntruc' AND machinchouette='euuhunmachin'

et si en plus l'utilisateur à coché 'bidulechouette ' (oui c'est vrai il est gonflé cet utilisateur), comment ajouter dans ma requête AND bidulechouette='unbidule'?

et ainsi de suite...

Voyez vous la difficulté que ceci peut causer à un débutant, non vous n'imaginez même pas smile.gif

Alors si vous pouvez m'aider, par ordre de fainéantise décroissant, en me disant oulala t'es pas arrivé, ou ta's lu la doc sql?, ou en me donnant quelques pistes (là ça devient intéressant), ou m'expliquant la méthodologie (là c'est cool) ou me donnant un exemple (là c'est le top), bon je ne vous enverrez peut être pas un chèque mais à coup sûr un grand MERCI et ça, ça n'a pas de ... si...enfin ça vaut ce que ça vaut.

Mais soyez assurés de ma reconnaissance éternelle si vous pouvez m'aider.

Bien amicalement,
à bientôt !
TheRec
Bonjour,

pheeew, je suis arrivé au bout de ton message wink.gif

Avant de répondre, éventuellement, il faut que je sois sûr de t'avoir compris...tu souhaite pouvoir définir plusieurs critères qui auront chacun une case à cocher et chacun de ces critères auront un champ permettant de saisir la chaîne de caractères à rechercher pour ce critère ? (Dans "WHERE trucmuche='euhuntruc' AND machinchouette='euuhunmachin'" les données recherchées sont différentes : euhuntruc != euuhunmachin ...)

Je demande cela car ce n'est pas courant de laisser autant de latitude à l'utilisateur pour la recherche d'informations...généralement l'utilisateur dispose d'un seul champ pour entrer la chaîne à rechercher et éventuellement des critères pour restreindre la recherche...

Donc quelle solution désires-tu réaliser ?

Et s'il te plaît, ce n'est pas que je n'aime pas te lire, mais essaie d'être plus concis lorsque tu formule ta question, cela facilite et surtout accélère le processus de réponse. D'avance merci smile.gif
TheRec
Ce problème (un champ mots-clés par critère ou un seul champ pour tous les critères) mis à part...

Tu peux utiliser une technique que PHP propose, lorsqu'une variable d'un formulaire a un nom qui indique que c'est un tableau, l'interpréteur PHP crée effectivement un tableau contenant la valeur défini dans le formulaire...

Pour information si le nom de la variable est "test[]" cela a le même effet qu'en PHP, le tableau s'il existe n'est pas remplacé, mais on y ajoute la valeur de la variable dans une nouvelle cellule en fin de tableau...si je tableau n'existe pas il est créé.

Dans notre cas on nomme les clés du tableau, ce sera le nom du critère de recherche
Dans cette exemple je suppose que tu veux un champ de mots-clés
CODE
 <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" id="testform">
   <p>Champ 1: <input type="checkbox" name="criteria[field1]" value="1" /><input type="text" name="keywords[field1]" /></p>
   <p>Champ 2: <input type="checkbox" name="criteria[field2]" value="1" /><input type="text" name="keywords[field2]" /></p>
   <p>Champ 3: <input type="checkbox" name="criteria[field3]" value="1" /><input type="text" name="keywords[field3]" /></p>
   <p><input type="submit" name="submit" value="Envoyer" />&nbsp;|&nbsp;<input type="reset" name="reset" value="Reset" /></p>
 </form>

Ensuite tu peux parcourir le tableau "criteria" lors que le formulaire est envoyé avec une boucle pareille à celle-ci :
CODE
<?php
 $whereclause = "";
 foreach($_POST['criteria'] as $criterion => $value) {
   $whereclause .= mysql_real_escape_string($criterion)."='".mysql_real_escape_string($_POST['keywords'][$criterion])."' AND ";
 }
 $whereclause = rtrim($whereclause," AND ");
 echo $whereclause;
 } ?>

**EDIT** : Remplacé mysql_escape_string (dépréciée depuis PHP 4.3.0) par mysql_real_escape_string

Si ton formulaire est une répétition (pas de particularité, une checkbox, un input) tu peux imaginer créer une boucle pour générer cette partie du formulaire :
Par exemple :
CODE
<?php
$fields = array("field1" => "Champ 1","field2" => "Champ 2", "field3" => "Champ 3");
foreach($fields as $field => $description) { ?>
 <p><?php echo $description; ?> :<input type="checkbox" name="criteria[<?php echo $field; ?>]" value="1" /><input type="text" name="keywords[<?php echo $field; ?>]" /></p>
<?php
} ?>

Voilà... un réponse un peu long...mais j'espère complète wink.gif
ouarzazat
Bonjour,

et merci pour cette réponse matinale.
Tu vois, je crois que je vais enregistrer ces codes dans un fichier texte, c'est pour te dire combien tu as mis dans le mille.

J'ai saisi le concept et je pense que je ne pouvais pas espérer mieux.

Et au passage si tu veux bien j'aurai besoin d'une petite explication de texte de cette ligne smile.gif

CODE
$whereclause .= mysql_escape_string($criterion)."='".mysql_escape_string($_POST['keywords'][$criterion])."' AND ";


Je me demandais a quoi servent les .=
Et je me perd entre les ' et les "

Ah oui et je me demandais si mysql_escape échappait les undescore ?

C'est juste au cas ou tu aurais 5 minutes, sinon je trouverai bien c'est juste qu'aujourd'hui j'ai pas trop de temps pour cela malheureusement..

En tout cas, chose promis, chose due, je t'offre mon éternelle reconnaissance smile.gif !!!

Merci beaucoup encore une fois,
à bientôt
captain_torche
Pour faire rapide :
Les .= signifient une concaténation. C'est une manière plus rapide que d'écrire $string = $string.$new_string;
Pour les guillemets, effectivement, on peut s'y perdre. Avec un éditeur respectant la coloration syntaxique, ça passe mieux.
Sinon, pour info : entre guillemets simples ' ', PHP ne fait aucun traitement.
Entre guillemets doubles " ", PHP remplace les variables par leurs valeurs respectives.
A l'affichage, le résultat de :
CODE
echo 'votre nom est '.$nom;

et celui de :
CODE
echo "votre nom est $nom";

est identique, mais le temps de traitement n'est pas le même.

Et, pour finir, mysql_real_escape_string (ou son équivalent déprécié, mysql_escape_string), n'échappe pas les underscores.
Les codes échappés, sont les suivants : NULL, \x00, \n, \r, \, ', " et \x1a.
ouarzazat
Je suis un homme comblé smile.gif merci, merci et merci !
Portekoi
Bonjour,

Concernant les ' ou ", la différence de temps de traitement est minuscule. Ca, c'est un peu comme la légende du '<?' et <?php' .

Si tu as une page qui traite de cela, je suis preneur smile.gif


Portekoi
captain_torche
Ha, je n'ai pas dit que la différence était flagrante wink.gif
Ca va surtout dépendre du type de chaîne que tu auras à traiter.

Bon, je viens de retrouver mes sources :
http://www.phpdebutant.org/article147.php
TheRec
En cherchant un peu il y a :
http://www.php.lt/benchmark/phpbench.php : A prendre avec des pincettes, les test sont très peu significatif à mon avis car les conditions changent tout le temps vu que le script recalcule ces performances à chaque rafraîchissement.
http://www.estvideo.com/dew/pages/phpbench/ : Au moins les conditions sont fixes
http://phpdebutant.org/article147.php : Une description de la procédure d'évaluation (**EDIT** bont ben grillé pour celui-là)

Ce sont des optimisations de bout de chandelles à mon avis...la majorités des optimisations se font ailleurs smile.gif (requêtes sur une source de données externe dans des boucles, répétition de code, ...)
ouarzazat
Oula je me fait squatter mon post!! smile.gif

J'aimerai bien participer mais là je suis largué... dans une autre vie je pourrais peut être vous répondre.

Mais lachez vous ça fait plaisir !

A bientôt
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.