Aller au contenu

création d'une requête dont les variables


ouarzazat

Sujets conseillés

Bonjour, bonsoir,

je ne sais plus très bien où j'en suis...:)

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 ;)

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 :)

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 !

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

pheeew, je suis arrivé au bout de ton message ;)

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 :)

Lien vers le commentaire
Partager sur d’autres sites

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

  <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" /> | <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 :

<?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 :

<?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 ;)

Lien vers le commentaire
Partager sur d’autres sites

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 :)

$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 :) !!!

Merci beaucoup encore une fois,

à bientôt

Modifié par ouarzazat
Lien vers le commentaire
Partager sur d’autres sites

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 :

echo 'votre nom est '.$nom;

et celui de :

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.

Lien vers le commentaire
Partager sur d’autres sites

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 :)

Portekoi

Lien vers le commentaire
Partager sur d’autres sites

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 :) (requêtes sur une source de données externe dans des boucles, répétition de code, ...)

Lien vers le commentaire
Partager sur d’autres sites

Oula je me fait squatter mon post!! :)

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

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...