Aller au contenu

Mon interface pour la recherche de videos à besoin


Sujets conseillés

Posté (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é par Sotomayor01
Posté

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.

Posté

Ola, il était bien tard quand j'ai ecrit, donc c'est hyper mal expliqué !!! :blush::blush:

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

Posté (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 protection
if(!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 recherche
for( $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é par Boo2M0rs0
Posté

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...

Posté

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 !!!

;)

Posté

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....

Posté (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 :pissed::wacko:

Modifié par Sotomayor01
Posté
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 ?? )

Posté

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

Posté

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' :D

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

Posté

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 !

Posté (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' :D

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

Remplace le echo $result; par:

while($row = mysql_fetch_assoc($result))

{

print_r($row);

echo "\n<br>";

}

Modifié par Boo2M0rs0
Posté

La ressource qui est ensuite donnée est "ressource #3".

Hmm ça va pas beaucoup nous avancer :boude:

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.

Posté

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)

Posté

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

Posté

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

Posté

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

Qu'as tu changé à partir du code que je t'ai donné ? tu peux poster le code ?

Posté (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 protection
if(!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 recherche
for( $i = 1; $i<=6; $i++) //il y a 6 cases
if( 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, chemin
if( 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é par Sotomayor01
Posté

Et ?

Ca marche, ca marche pas ?

Une question, ou tu présentes juste le code au cas où ca intéresserait quelqu'un ?

:D

Posté

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 !!)...

Veuillez vous connecter pour commenter

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



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