PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 17-05-2009 17:56:00

pierre-luc
Membre
Inscription : 17-05-2009
Messages : 17

formulaire de recherche

bonjour,

sur mon site je veux faire un formulaire pour que les visiteurs puisse chercher dans ma base de donné, mais comment faire pour gérer plusieurs mots clé? et gérer également les +""and etc...

j'ai besoin d'aide
merci

Hors ligne

#2 17-05-2009 18:11:58

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : formulaire de recherche

Saluton,
Il y a deux manières de gérer les recherches sur une base de données MySQL (si c'est bien le SGBDR que tu utilises), celle qui s'appuie sur l'opérateur LIKE et ses caractères JOKERS % et _
L'autre est de passer par l'indexation FULL TEXT, qui n'est possible qu'avec des tables MyISAM (ce qui, du coup, exclut InnoDB , les clefs étrangères, les triggers et les transactions) et qui utilise les opérateurs MATCH AGAINST.
Sans plus d'informations afférentes à ton projet, difficile de t'orienter vers une solution plutôt que l'autre.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 17-05-2009 18:44:15

pierre-luc
Membre
Inscription : 17-05-2009
Messages : 17

Re : formulaire de recherche

j'utilise mysql.

si j'ai une colonne "nom" et que dans le formulaire de recherche je met "royal" il me sort correctement ce que je cherche "Royal decameron costa..." par contre si je met "royal +costa"  il me sort rien alors comment faire pour que le formulaire puisse lire l'operateur + comme dans un moteur de recherche. Et si le mot est mal ortaugraphier, par exemple : "reyal" est-ce possible de quand même afficher "royal....".

Hors ligne

#4 17-05-2009 19:18:25

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : formulaire de recherche

Tu t'attaques à un gros morceau, et comme tu ne fournis pas le moindre bout de requête, il m'est difficile de t'orienter précisément.
Si tu veux faire de la recherche FULL TEXT, tout est là :http://dev.mysql.com/doc/refman/5.0/fr/ … earch.html.
Si tu veux juste combiner des LIKE avec des AND c'est plus simple.
Pour ce qui concerne les approximations orthographiques il faudra plutôt rechercher vers les SOUNDEX : http://forums.mysql.com/read.php?69,203569,203733.
Bonnes lectures.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#5 18-05-2009 08:59:47

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : formulaire de recherche

Hello,

Sinon tu peux utiliser un moteur tout fait et franchement efficace (complètement in-maintenable mais efficace)
Ca s'appel PhpDig : Télécharger PhpDig

Et il gère les consonances et index pas mal les pages.


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#6 20-05-2009 02:10:14

pierre-luc
Membre
Inscription : 17-05-2009
Messages : 17

Re : formulaire de recherche

comment faire pour ajouter

MATCH nom AGAINST('".mysql_real_escape_string($_POST['search'])."')

la colonne nom est dans ma table hotel

a cette requete

$sql = 'SELECT hotel.nom, hotel.etoile, hotel.ville, hotel.web, photo.filepath, photo.filename, photo.numero  FROM hotel, photo  WHERE photo.nom = hotel.nom AND photo.numero="1" ';

Hors ligne

#7 20-05-2009 07:11:57

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : formulaire de recherche

pierre-luc a écrit :

comment faire pour ajouter

MATCH nom AGAINST('".mysql_real_escape_string($_POST['search'])."')

la colonne nom est dans ma table hotel

a cette requete

La première des choses est de créer un index FULL TEXT sur la colonne hotel.nom et, donc, que la table hotel releve du MyISAM.
Ensuite d'utiliser la syntaxe normalisée pour les jointures.

$sql = 'SELECT hotel.nom, hotel.etoile, hotel.ville, hotel.web,
       photo.filepath, photo.filename, photo.numero  
FROM hotel
INNER JOIN  photo  ON  photo.nom = hotel.nom
WHERE MATCH hotel.nom AGAINST('
".mysql_real_escape_string($_POST['search'])."')
AND photo.numero="1" '
;

J'ajoute que le recours malin à PDO, t'affranchirait, entre autres, des préoccupations de type mysql_real_escape_string.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#8 20-05-2009 21:16:04

pierre-luc
Membre
Inscription : 17-05-2009
Messages : 17

Re : formulaire de recherche

Maljuna Kris a écrit :

J'ajoute que le recours malin à PDO, t'affranchirait, entre autres, des préoccupations de type mysql_real_escape_string.

est-ce que tu pourrais m'expliquer un peu plus le PDO? car je suis pas certain d'avoir compris les explications que j'ai trouver sur google.

Hors ligne

#9 21-05-2009 05:52:44

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : formulaire de recherche

Tout d'abord PDO (PHP Data Objects) implique PHP5.

Il s'agit d'une extension PECL de PHP qui fournit une classe d'abstraction d'accès aux bases de données.
En gros, quel que soit le SGBD (MySQL, SQLIte, PostgreSQL, Oracle,....) tu n'auras plus qu'une chose à changer, la chaîne de connexion, et ton code sera portable sur n'importe quel SGBD.

PECL, PHP Extension Community Library, est un ensemble d'extensions de PHP écrites en langage C. Ces extensions offrent des fonctionnalités impossibles à réaliser en PHP, certaines pour des raisons de performances, le langage C étant bien plus rapide que PHP.

Mais ce n'est pas tout, PDO se charge de l'encapsulation correcte des données dans les requêtes et surtout, autorise les requêtes préparées (prepared statements) ce qui peut copieusement booster les performances des requêtes itératives.
Il permet aussi, par le biais des exceptions, de gérer correctement les erreurs dans la communication avec le SGBD.

Je suis en train de traduire «Learning PHP Data Objects» et il est prévu que je rédige un tuto sur cette extension pour la V2 :


En attendant, tu n'es pas sans biscuit :


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#10 23-05-2009 04:56:58

pierre-luc
Membre
Inscription : 17-05-2009
Messages : 17

Re : formulaire de recherche

j'ai lu sur le sujet de PDO et j'ai commencer a l'utiliser sauf que la je suis bloquer.

rien ne s'affiche et j'ai aucun message d'erreur.

$statement = $db->prepare('SELECT hotel.nom, hotel.etoile, hotel.ville, hotel.web, photo.filepath, photo.filename, photo.numero  FROM hotel, photo  WHERE photo.nom = :nom AND photo.numero = :un ORDER BY RAND() limit 0,5');
$statement->execute(array(':nom' => $nom, ':un' => $un));
$data = $statement->fetch();

echo $data['nom'];

Hors ligne

#11 23-05-2009 06:47:07

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : formulaire de recherche

J'imagine que tu as prélablement instancié PDO dans $db.

As-tu essayé comme cela :

$statement->execute(array('nom' => $nom, 'un' => $un));

La syntaxe avec les deux points doit requérir un jeu d'attributs en array en second paramètre de $db->prepare().


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#12 23-05-2009 20:30:43

pierre-luc
Membre
Inscription : 17-05-2009
Messages : 17

Re : formulaire de recherche

ca fonctionne, mais est-ce que seulement en utilisant PDO c'est assez ou je dois sécuriser mes variables qui sont passer par url

$nom = $_GET['nom'];

$statement = $db->prepare("SELECT filepath,filename,numero,nom FROM photo WHERE nom = :nom AND numero = '1'");
$statement->bindParam(":nom", $nom);
$statement->execute();
$data = $statement->fetch();

Hors ligne

#13 24-05-2009 08:41:44

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : formulaire de recherche

Tu n'as donc pas encore lu toute la doc (moi non plus, je te rassure). wink

Jette un œil sur PDO::quote() qui protège une chaîne pour l'utiliser, justement, dans une requête SQL PDO::prepare().

Attention toutefois

pierre-luc a écrit :

numero ='1'

si numero est numérique il vaudrait mieux enlever les quotes autour du 1.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#14 25-05-2009 00:32:21

pierre-luc
Membre
Inscription : 17-05-2009
Messages : 17

Re : formulaire de recherche

merci pour l'info, mais peut importe ou je met le quote() ca fonctionne pas.


alors pourrais tu m'éclairer pour me dire ou placer le quote. si je le met 

$nom = quote($_GET['nom']);

ca ne fonctionne pas

et la non plus

$statement = $db->prepare("SELECT filepath,filename,numero,nom FROM photo WHERE nom = quote(:nom) AND numero = '1'");

et la non plus

$statement->bindParam(":nom", quote($nom));

pourtant la doc n'est pas difficile a comprendre smile

Hors ligne

#15 25-05-2009 05:45:15

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : formulaire de recherche

quote() n'est pas une fonction PHP, c'est une méthode $db->quote($nom)


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#16 25-05-2009 12:26:59

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : formulaire de recherche

En fait, il y a mieux :

<?php
$statement = $db->prepare("SELECT filepath,filename,numero,nom FROM photo WHERE nom = ? AND numero = ?");
$statement->execute(array($_GET['nom'],1));

Et PDO va prendre soin, tout seul, de mettre des quotes où il faut sur les données en entrée.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

Pied de page des forums