Sotomayor01 Posté 3 Juin 2005 Partager Posté 3 Juin 2005 (modifié) Bonjour, ou plutot bonsoir, J'ai créé un formulaire sur mon site (ICI), et j'ai créé ma base de donné en y renseignant les champs necessaires. Maintenant, il faut que cette recherche par le formulaire renvoie à une page montrant les vidéos correspondantes aux désirs du visiteur, et c'est là que je bloque... J'implore donc votre aide, pour récuperer les variablesd du formulaire, et ainsi en extraires les videos... Merci d'avance PS : d'autres choix viendront s'ajouter à ceux présents, mais je cherche ici une méthode, plutot qu'un code tout fait !! PS2 : J'ai oublié de dire que je suis un newbie de première classe, en ce qui concerne php/mysql... Modifié 4 Juin 2005 par Sotomayor01 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Light_at_the_end Posté 3 Juin 2005 Partager Posté 3 Juin 2005 Chez moi ton lien marche pas :x Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 4 Juin 2005 Auteur Partager Posté 4 Juin 2005 C'est réparé !!! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 4 Juin 2005 Partager Posté 4 Juin 2005 En fait, il nous faudrait le plan de ta base de données, pour pouvoir te dire ce qu'il faudrait mettre précisément. En gros, ca donnerait ceci : Données récupérées à partir du formulaire, dans la page 'add.php' : - nom, - prenom, - sexe, - perf, - lieu, - pays, -etc... On récupère ces données comme ceci : $nom = $_POST['nom']; $prenom = $_POST['prenom']; $sexe = $_POST['sexe']; etc.. ps : A ceci, il faut penser à sécuriser les données. - Le sexe, par exemple, n'a pas besoin d'un champ 'texte', mais d'un champ 'radio'. - Le 'pays' n'a pas besoin d'un champ texte non plus, mais d'un 'select option', en fonction des pays que tu as déjà dans la base. A la personne de choisir dans ce que tu as déjà enregistré. - idem pour le reste. Essaies de restreindre au maximum les possibilités. La différence, c'est que tu vas récupérer des 'entiers' (des nombres) au lieu de récupérer des 'chaines de caractère'. C'est important, parce qu'au lieu de chercher 'Amérique', ou 'Etats Unis', ou 'USA', ou 'Etats unis d'Amérique'..., tu auras d'un coté enregistré le numéro de ce pays (par exemple USA= 1), et tu proposes à l'internaute le choix entre 'France(=0)', USA(=1), Russie(=2), etc.. Et lors de ta recherche, tu chercheras le pays qui correspond au numéro sélectionné par l'internaute. le formulaire donnerait donc : <select name=pays> <option value=0>France</option> <option value=1>USA</option> <option value=2>Russie</option> </select> Ensuite, au niveau de la sécurité, tu as juste à faire un test pour savoir si la personne a bien entré : 1/ un nombre, 2/ compris entre '0' et 'maximum de pays', soit '2' Soit : $pays= $_POST['pays']*1; if ($pays>'0'&&$pays<'3'){} else $pays = '0'; Ensuite, à supposer que tu aies une base de données avec une table 'athlete', ca donnerait ceci : $q = "SELECT nom,prenom,sexe FROM athlete WHERE nom LIKE '".$nom."' AND prenom LIKE '".$prenom."' AND sexe LIKE '".$sexe."' ";$r = mysql_query($q);echo"<br> Athlètes trouvés :$nb=0;while ($row = mysql_fetch_array($r)){ $nb++; echo"<p> Nom : ".$row['nom']; echo"<br> Nom : ".$row['prenom']; echo"<br> Nom : ".$row['sexe']; }if ($nb==0) echo"<br> Aucun athlète trouvé";else echo"<p>Soit un total de ".$nb." athlètes trouvés correspondant";echo"Fini;)"; Mais comme tu peux voir, ca dépend essentiellement des tables où sont enregistrés les données. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 4 Juin 2005 Auteur Partager Posté 4 Juin 2005 Ola, il était bien tard quand j'ai ecrit, donc c'est hyper mal expliqué !!! Je recommence mes explications : le formulaire (ICI) me permet d'enregistrer mes videos dans la bdd. Cette page ne sera accessible qu'à moi dans le futur. Mes visiteurs auront accès à cette page (ICI), et pourront donc choisir plusieues critères. Le problème, c'est que je sais pas comment récuperer ces variables, pour afficher par exemple les vidéos des "femmes ayant sauté entre 1m50 et 1m89 aux Jeux Olympiques" (ce qui est la conjugaison de plusieurs critères...). C'est donc pour la récupération des choix du visiteurs, et le traitement de ces variables afin d'afficher les liens vers les videos correspondantes que je bloque... Merci de votre aide ! PS : Voila comment s'organise ma base de donnée : La table "vidz" contient 11 champs (id, nom, prenom, sexe, perf, lieu, pays competition, date, nationalite, url). Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boo2M0rs0 Posté 5 Juin 2005 Partager Posté 5 Juin 2005 (modifié) Bonjour, tu va déjà avoir un problème avec ton formulaire car plusieurs champs portent le même attribut name , alors que name doit être un identifiant unique appèle par exemple: homme, femme , perf1 , perf2 etc Ensuite en php, pour tester si la case a été cochée, utilise isset($_POST['perf1']) pour savoir si la case portant le nom perf1 est cochée. En fonction de cela tu rajoutes des conditions à ta requête sql ( apres le mot where ). Désolé là je n'ai pas le temps de ton montrer un code complet, je suis assez pressé :x edit: voila j'ai codé un peu ça: <form name="form1" method="post" action=""> <p>Sexe (cocher au moins une case) : </p> <p><input type="checkbox" name="hommes"> Hommes</p> <p><input type="checkbox" name="femmes"> Femmes</p> <p> </p> <p> Nom du/de la sauteur(euse) : <input type="text" name="nom">(facultatif) </p> <p>Compétition (cocher au moins une case) : </p> <p><input type="checkbox" name="compete1" value="jo"> Jeux Olympiques</p> <p><input type="checkbox" name="compete2" value="mondiaux"> Mondiaux</p> <p><input type="checkbox" name="compete3" value="europe"> Championnat d' Europe</p> <p><input type="checkbox" name="compete4" value="nat"> Championnats nationaux</p> <p><input type="checkbox" name="compete5" value="meeting"> Meeting</p> <p> </p> <p><input type="submit" name="Submit" value="Rechercher parmis les vidéos du site"></p></form><?php//une petite protectionif(!get_magic_quotes_gpc() ) foreach( $_POST as $index => $v) $_POST[$index] = addslashes($v);$conditions = array(); //ce tableau contient toutes les conditions de la recherche, écrites en code sql/* Homme ou Femme ? */if( isset($_POST['hommes']) xor isset($_POST['femmes'])){ if( isset($_POST['hommes'])) $conditions[] = " sexe = 'h' "; //le champs sexe doit contenir H else $conditions[] = " sexe = 'f' "; //le champs sexe doit contenir F}/* Compétitions possibles */$comps = array(); //contient toutes les compétitions autorisées pour la recherchefor( $i = 1; $i<=5; $i++) //il y a 5 cases if( isset( $_POST["compete$i"] )) $comps[] = " competition = '" . $_POST["compete$i"] . "' ";if( count($comps) > 0) $conditions[] = '( ' . implode("OR",$comps) . ')'; //on rajoute toutes les compétitions possibles dans une nouvelle condition/* Est ce qu'un nom est donnné ? */if ( isset($_POST['nom']) && $_POST['nom'] != '') $conditions[] = " nom LIKE '{$_POST['nom']}'";//ON VA faire la requête sql//ceci est la requête sql: tout selectionner dans la table vidz , avec comme conditions, les conditions du tableau $conditions, séparées par des AND$sql = "SELECT id, nom, prenom, sexe, perf, lieu, pays , competition, date, nationalite, url FROM vidz ";if( count($conditions) != 0) $sql .= "WHERE " . implode(" AND ", $conditions);$data = mysql_query($sql) or die("erreur mysql: $sql");//On affiche:while( $row = mysql_fetch_row($data)){ echo "nom: $row[1] $row[2] , $row[3] , perf: $row[4] , <a href=\"$row[10]\">url</a><br />";} J'ai nommé chaque case à cocher pour la compétition, compete suivi d'un numéro, apres grâce à une boucle for() , je vérifie chacun de ses champs avec isset($_POST["compete$i"]) ( $i est le numero en cours). Si il existe je rajoute une condition de recherche ( competition doit être égal à la valeur de la case cochée). Pour le nom, si la case a été remplie, on rajoute la condition ( on utilise LIKE plutot que = car il est moins restrictif). On rassemble à la fin toutes ces conditions en les séparant par des AND , et on execute la requête sql, après, il ne reste plus qu'à l'afficher. Cette méthode est plus compliquée que celle proposée par Anonymus car si rien n'est cochée, on obtient quand même un résultat). Modifié 5 Juin 2005 par Boo2M0rs0 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 5 Juin 2005 Auteur Partager Posté 5 Juin 2005 Merci pour ta réponse Boo2MOrsO, j'ai mis ton code dans un atre fichier php, mais il survient une erreur à la ligne 36, c'est à dire : $data = mysql_query($sql) or die("erreur mysql: $sql"); et l'erreur est : Warning: mysql_query(): A link to the server could not be established in /var/www/free.fr/8/6/jump.and.feel/interface_vidz/recup.php on line 36 Il sagit donc d'une erreur de connection à la base, mais je ne sais pas comment regler ca... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 5 Juin 2005 Partager Posté 5 Juin 2005 Avant le code donné par Boo2MOrsO, tu dois ouvrir une connexion valide , avec ta base de données. Ca correspond aux lignes suivantes : mysql_connect($host,$root,$pass);mysql_select_db($db); Où tu fais coincider les variables avec celles fournies par ton hébergeur. ps : Merci de nous éviter les : HELP, je bloque !!! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 6 Juin 2005 Auteur Partager Posté 6 Juin 2005 D'acc' monsieur l'admin, et désolé pour mon petit up, j'espère n'avoir fait mal à aucun n'oeil !!! Bon, la connection à la bdd est ok, mais le problème vient maintenant de la ligne : $sql = "SELECT id, nom, prenom, sexe, perf, lieu, pays, competition, date, nationalite, url FROM vidz"; mais je ne vois pas bien où, vu que le nom de la table et des champs est correcte !!! Sinon, je serais incapable de refaire un code tel que celui-là, boo2morso, mais je comprend bien le résonnement suivi.... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boo2M0rs0 Posté 6 Juin 2005 Partager Posté 6 Juin 2005 vérifie l'orthographe des noms des champs Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 6 Juin 2005 Auteur Partager Posté 6 Juin 2005 (modifié) Ca y est, j'ai trouvé d'ou vient le hic : les résultats sont ok si on n'entre pas de nom dans le chant texte, sinon, l'erreur renvoyée est : erreur mysql: SELECT id, prenom, nom, sexe, perf, lieu, pays, competition, date, nationalite, chemin FROM vidzWHERE nom LIKE 'soto' Pourtant, deux enregistrement dans la bdd correspondent ( le sauteur s'appelle...heu je vous laisse deviner !!!) EDIT : en fait je peut cocher n'importe quelle(s) case(s), le résultat me montrera toutes les videos enregistrées dans la bdd ! Grrr, qu'est ce que c'est désagréable d'attendre l'aide tout le temps, mais j'ai beau consulter les sites pour débutant en php, je n'arrive pas à trouver les problèmes Modifié 6 Juin 2005 par Sotomayor01 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 6 Juin 2005 Partager Posté 6 Juin 2005 Ca y est, j'ai trouvé d'ou vient le hic : les résultats sont ok si on n'entre pas de nom dans le chant texte, sinon, l'erreur renvoyée est : erreur mysql: SELECT id, prenom, nom, sexe, perf, lieu, pays, competition, date, nationalite, chemin FROM vidzWHERE nom LIKE 'soto' Pourtant, deux enregistrement dans la bdd correspondent ( le sauteur s'appelle...heu je vous laisse deviner !!!) <{POST_SNAPBACK}> Tu l'auras compris, la clause WHERE touche le nom de la table, ce qui fait bugger. Mets un espace entre 'vidz' et 'WHERE', et ton bug disparaitra Soit : $sql .= " WHERE " . implode(" AND ", $conditions); (Un sauteur ? Soto ?? ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 6 Juin 2005 Auteur Partager Posté 6 Juin 2005 Je vients d'éditer mon message, pendant que tu me donnai une piste... J'ai donc modifié le code. Désormais, j'ai une page blanche en guise de résultat !!! Et une question subsidiaire : php est-il sensible à la différence entre "H" et "h" (c'est la casse, me semble-t-il) ?? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 6 Juin 2005 Partager Posté 6 Juin 2005 La différence entre H et h s'appelle la casse, oui. Ca dépend pour quoi. Par exemple, les variables $sqlH et $sqlh sont différentes. Les fonctions WHERE et where sont identiques (mais c'est du sql, pas du php) Si c'est pour le champ de la recherche, alors il cherchera différemment les champs "nom LIKE 'sotoH'" et "nom LIKE 'sotoh'". mais c'est aussi du sql. etc.. Donc, ca dépend.. mais en général, c'est différent, c'est 'sensible à la casse' Ce qu'il faut faire, si tu ne trouves pas la réponse, c'est avancer à petit pas : Juste après le 'mysql_query', tu fais : echo $sql; die(""); Ca va t'extraire la requète à l'écran. Tu essaies cette requète dans phpmyadmin, pour voir ce qui en résulte. SI ca donne le résultat escompté, tu fais : $result = mysql_query($sql); echo $result; die(""); Tu devrais avoir un lien de ressource, du style : ressource id#2 Sinon, c'est que le mysql_query a un problème. Etc. On appelle ca "mettre des espions, ou des pointeurs." Tu essaies comme ca toutes tes variables, pour voir si elles renvoient bien les données que tu attends. Postes ici les résultats que tu obtiens, si on peut t'aider Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 6 Juin 2005 Auteur Partager Posté 6 Juin 2005 J'ai fait ce que tu m'as conseillé, donc je vois que le mysql_query renvoi tous les enregistrements de la bdd, quelque soit les choix du formulaire : select sur tous les champs de la table ! La ressource qui est ensuite donnée est "ressource #3". Voila pour ce que je pouvais "faire" et merci pour les précisions à propos de la casse chez sql ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boo2M0rs0 Posté 7 Juin 2005 Partager Posté 7 Juin 2005 (modifié) Si c'est pour le champ de la recherche, alors il cherchera différemment les champs "nom LIKE 'sotoH'" et "nom LIKE 'sotoh'". mais c'est aussi du sql.etc.. Donc, ca dépend.. mais en général, c'est différent, c'est 'sensible à la casse' Like est insensible à la casse tandis que = l'est Dans php, le == est sensisble à la casse, il faut utiliser des fonctions qui mettent les deux chaines en minuscules str2lower() La ressource qui est ensuite donnée est "ressource #3".Hmm ça va pas beaucoup nous avancer Remplace le echo $result; par: while($row = mysql_fetch_assoc($result)) { print_r($row); echo "\n<br>"; } Modifié 7 Juin 2005 par Boo2M0rs0 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 7 Juin 2005 Partager Posté 7 Juin 2005 La ressource qui est ensuite donnée est "ressource #3". Hmm ça va pas beaucoup nous avancer Si, ca permet de voir que la requète ne renvoie pas d'erreurs, qu'elle marche. Si la fonction mysql_query donne une erreur, on n'a pas ce 'lien', et donc il faut regarder en amont. Sinon, il faut regarder en aval. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 8 Juin 2005 Auteur Partager Posté 8 Juin 2005 Bon pour ce qui est de la zone de texte, j'ai réussi à réparer le problème, en rajoutant un "%" après la valeur de cette zone, et ca marche !!! Pour le reste, je ne sais pas si vous avez des pistes, moi je cherche toujours... (le problème qui persiste est que le mysql_query est toujours le meme) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 13 Juin 2005 Auteur Partager Posté 13 Juin 2005 Pas de solution de mon coté, par contre j'ai réussi à concevoir l'affichage des résultats et la page type de description des vidéos (je sais ca n'avance pas le schmilblik, mais là je decouvre php, très efficasse !) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boo2M0rs0 Posté 13 Juin 2005 Partager Posté 13 Juin 2005 mets un echo $sql; juste avant la commande mysql_query(); Peut être aussi un print_r($conditions); Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 13 Juin 2005 Auteur Partager Posté 13 Juin 2005 Bonsoir Boo2MOrsO, echo du sql : SELECT * FROM vidz et print_r($conditions) donne : Array() Merci de ta réponse Juste une question, pourquoi fait on un $sql = "SELECT * FROM vidz"; PUIS $sql .= " WHERE " . implode(" AND ", $conditions); ?? Ces deux commandes ne se contredisent-elles pas ??? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boo2M0rs0 Posté 13 Juin 2005 Partager Posté 13 Juin 2005 Regarde bien la deuxième ce n'est pas un symbole = mais un .= ce qui signifie que l'on ajoute à la suite de la chaine. Je l'ai fait avec une ligne séparée de la première car ce n'est executé que si le tableau $conditions contient quelque chose ( d'où le if( count($conditions) != 0) ) Mais d'après le print_r c'est que le script n'a enregistré aucune conditions Qu'as tu changé à partir du code que je t'ai donné ? tu peux poster le code ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 13 Juin 2005 Auteur Partager Posté 13 Juin 2005 (modifié) Voila le code : <?php$db = mysql_connect('sql.free.fr', '*******', '*********') or die('Erreur de connexion '.mysql_error()); mysql_select_db('*****',$db) or die('Erreur de selection '.mysql_error());//une petite protectionif(!get_magic_quotes_gpc() ) foreach( $_POST as $index => $v)$_POST[$index] = addslashes($v);$conditions = array(); //ce tableau contient toutes les conditions de la recherche, écrites en code sql/* Homme ou Femme ? */if( isset($_POST['hommes']) xor isset($_POST['femmes'])){if( isset($_POST['hommes']))$conditions[] = " sexe = 'H' "; //le champs sexe doit contenir Helse$conditions[] = " sexe = 'F' "; //le champs sexe doit contenir F}/* Compétitions possibles */$comps = array(); //contient toutes les compétitions autorisées pour la recherchefor( $i = 1; $i<=6; $i++) //il y a 6 casesif( isset( $_POST["competition$i"] ))$comps[] = " competition = '" . $_POST["compete$i"] . "' ";if( count($comps) > 0)$conditions[] = '( ' . implode(" O R",$comps) . ')'; //on rajoute toutes les compétitions possibles dans une nouvelle condition/* Est ce qu'un nom est donnné ? */if ( isset($_POST['nom']) && $_POST['nom'] != '')$conditions[] = " nom LIKE '{$_POST['nom']}%'";//ON VA faire la requête sql :tout selectionner dans la table vidz , avec les conditions du tableau $conditions, séparées par des AND$sql = "SELECT * FROM vidz";//id, prenom, nom, sexe, perf, style, lieu, pays, competition, date, nationalite, cheminif( count($conditions) != 0)$sql .= " WHERE " . implode(" AND ", $conditions);$data = mysql_query($sql) or die("erreur mysql : $sql"); Bon alors j'ai changé la ligne concernant le nom en rajoutant le "%" après $conditions[] = " nom LIKE '{$_POST['nom']}, et le nombre de competex possible (6 contre les 5 que tu avais codé !) En gros, rien d'énorme, j'espère just ene pas avoir comis d'impair !!! EDIT : (J'ai aussi modifié l'affichage des résultats, qui n'affecte en rien le formulaire) REEDIT : le code du formulaire au cas où, mais je n'y est rien modifié me semble t il, dans les chekbox dejà présentes <form name="form1" method="post" action="recup.php"> <p><h2>Sexe (cocher au moins une case) :</h2> <p><input type="checkbox" name="hommes"> Hommes</p> <p><input type="checkbox" name="femmes"> Femmes</p> <p> </p> <p> </p> <h2>Nom du/de la sauteur(euse) :</h2> <p><input type="text" name="nom" size="20"> (facultatif) </p> <p> </p> <p> </p> <h2>Style (cocher au moins une case ) :</h2><input type="checkbox" name="ciseau" value="checkbox"> Ciseau<p><input type="checkbox" name="ventral" value="checkbox"> Ventral</p> <p><input type="checkbox" name="fosbury" value="checkbox"> Fosbury</p> <p> </p> <p> </p><h2>Performance (cocher au moins une case ) :</h2><p><input type="checkbox" name="perf" value="000149"> Entre 0 et 1 m 49</p><p><input type="checkbox" name="perf" value="150169"> Entre 1 m 50 et 1 m 69</p> <p><input type="checkbox" name="perf" value="170189"> Entre 1 m 70 et 1 m 89</p> <p><input type="checkbox" name="perf" value="190209"> Entre 1 m 90 et 2 m 09 </p> <p><input type="checkbox" name="perf" value="210229"> Entre 2 m 10 et 2 m 29</p> <p><input type="checkbox" name="perf" value="230234"> Entre 2 m 30 et 2 m 34</p> <p><input type="checkbox" name="perf" value="235239"> Entre 2 m 35 et 2 m 39</p> <p><input type="checkbox" name="perf" value="239"> Plus de 2 m 39</p> <p> </p> <p> </p> <h2>Type de compétition (cocher au moins une case) :</h2><p><input type="checkbox" name="compete1" value="jo"> Jeux Olympiques</p><p><input type="checkbox" name="compete2" value="mondiaux"> Mondiaux</p> <p><input type="checkbox" name="compete3" value="europe"> Championnat d' Europe</p> <p><input type="checkbox" name="compete4" value="nat"> Championnats nationaux</p> <p><input type="checkbox" name="compete5" value="Meeting"> Meeting</p> <p><input type="checkbox" name="compete6" value="autre"> Autres</p> <p> </p> <p><input type="submit" name="Submit" value="Rechercher parmis les vidéos du site"></p> (Les chekbox "style de saut" n'existaient pas) Modifié 13 Juin 2005 par Sotomayor01 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 14 Juin 2005 Partager Posté 14 Juin 2005 Et ? Ca marche, ca marche pas ? Une question, ou tu présentes juste le code au cas où ca intéresserait quelqu'un ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sotomayor01 Posté 14 Juin 2005 Auteur Partager Posté 14 Juin 2005 Ben je poste le code, comme me l'a demandé Boo2M0rs0, car il ne voit pas d'ou vient le problème, tout comme moi bien sur (à peine étonnant !!)... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant