Aide Urgente pour réalisation d'un Moteur de recherche en php pour une base de d [Résolu]

Messages postés
21
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
1 septembre 2005
- - Dernière réponse : arnal69130
Messages postés
445
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
22 mars 2007
- 18 août 2005 à 17:28
Bonjour je suis un stagiaire dans une entreprise qui utilise une base
de données oracle et je debute en php. Il faut que je fasse un moteur
de recherche en php d'une base oracle.En quelques sortes, on devrait
avoir une barre de saisie de texte du style Google et faire la
recherche des mots cles dans des champs (j'ai déjà défini les champs
pour la recherche) dans des table de la base de données. J'arrive à me
connecter sur la base grace aux fonctions "oci" de php mais pour faire
un code pour une recherche, c'est un autre niveau pour moi...

Vous me sauverez la vie si vous pouvez me filer un coup de main.


PS : il y a dans certaines tables 54000 enregistrements. on m'a dit
qu'Oracle est une base de données avec un temps de réponse tres rapide.
En sera-t-il toujours le cas pour le moteur de recherche ?


Chocholman
Afficher la suite 

18 réponses

Meilleure réponse
Messages postés
445
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
22 mars 2007
1
3
Merci
Cette fonction retourne un booléen, pour parcourir le réultat, il faut lire le tableau passer en 2nd paramètre, comme dans le code que je t'avais proposé au départ.

Sinon, pour vérifier que ta requête est correcte, tu peux l'afficher avant de l'exécuter :

$req=...
echo $req;
$stmt = oci_parse($conn, $req);
oci_execute($stmt);
$nrows = oci_fetch_all($stmt, $results);
if ($nrows > 0) {

Recopie ici le résultat affiché.

Arn;o)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de arnal69130
Messages postés
445
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
22 mars 2007
1
0
Merci
Tout sera dans tes requètes SQL...
Si tu cherches un enregistrement dont le nom est TINTIN, alors la requète sera SELECT nom FROM table WHERE nom='TINTIN';
Ensuite, tu peux aussi utiliser des caractères joker par exemple %TIN

Arn;o)
Commenter la réponse de arnal69130
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
0
Merci
Tu dois utiliser les extensions oracles


http://ca3.php.net/oracle





Tu te bases de la même manière pour faire un moteur de recherche pour n'importe quelle base de données...





Si tu veux une recherche plus rapide, tu dois indexer les valeurs. Comme dans toutes bases de données.

, EssayezTestez avant de Poser une question !
http://www.lookstrike.com
Commenter la réponse de cs_GRenard
Messages postés
21
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
1 septembre 2005
0
Merci
GRenard: j'ai dejà regardé ces fonctions mais on m'a conseillé d'utiliser a la place de "ORA_" les fonctions "oci"



Arno: je sais déjà qu'il faut utilise des requetes comme celle là: pas
de pb jusque là mais je parlais sur le code PHP proprement dit. Le
probleme c qu'il faut faire une saisie à la google et donc à la place
de TINTIN il faudrait une variable $tintin (selon les mots cles que
l'on aura ecrit dans interface web genere en php) . et pour moi faire
une code PHP avec des GET ou des POST comme ca c'est du chinois :
je ne suis pas informaticien et je dois juste realiser moteur de
recherche.

C'est pour ca que je vous demande votre aide pour savoir si il y
a du code tout pret que je pourrais "copier coller" ( nota: j'ai deja
deux fichier pour se connecter a la base oracle nommé connexion.php et
deconnexion.php qui marchent).



Je prie pour que vous ayez quelque chose. en tout merci déjà pour tout
Arno et merci d'avance pour ceux qui peuvent encore m'aider

Chocholman
Commenter la réponse de chocholman
Messages postés
445
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
22 mars 2007
1
0
Merci
En fait, ce qu'il te manque c'est le plus simple
Tu dois probablement pouvoir trouver qqch de tout fait, mais sinon essaie comme ça :

<form method= "post">


</form>
<?php
if (!empty($POST['champ'])) { //si une valeur a été postée -> requète
$conn = oci_connect("scott", "tiger");
$req="SELECT ... FROM ... WHERE ...='".$POST['champ']."'";
$stmt = oci_parse($conn, $req);
oci_execute($stmt);
$nrows = oci_fetch_all($stmt, $results);
if ($nrows > 0) {
echo "\n\";
echo \"----
\n\";
foreach ($results as $key => $val) {
echo \" $key |\n\";
}
echo \"\n\";
for ($i = 0; $i < $nrows; $i++) {
echo \"----
\n\";
foreach ($results as $data) {
echo \"$data[$i], \n\";
}
echo \"\n\";
}
echo "
\n";
} else {
echo "Pas de ligne
\n";
}
echo "$nrows Lignes lues
\n";
oci_free_statement($stmt);
oci_close($conn);
}
?>
http://fr.php.net/manual/fr/function.oci-fetch-all.php

A toi de jouer...

Arn;o)
Commenter la réponse de arnal69130
Messages postés
21
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
1 septembre 2005
0
Merci
ok



j'ai essaye mais j'ai dû procédé a des rectification: les commandes que
tu as mis ont dû être adaptées et voila ce que ça donne :



<form method= "post">


</form>
<?php
if (!empty($POST['champ'])) { //si une valeur a été postée -> requète
$conn = ocilogon("log","pass","base");

$req="SELECT action.description, doc_commentaire.commentaire,
doc_distribution.remarques, document.titre FROM
action,doc_commentaire,doc_distribution,document WHERE
action.description OR doc_commentaire.commentaire OR
doc_distribution.remarques OR document.titre='".$POST['champ']."'"; //peux-tu me dire si ma requete est ok (voir *)?


$stmt = ociparse($conn, $req);
ociexecute($stmt);
$nrows = ociRowCount($stmt, $results);
if ($nrows > 0) {
echo "\n\";
echo \"----
\n\";
foreach ($results as $key => $val) {
echo \" $key |\n\";
}
echo \"\n\";
for ($i = 0; $i < $nrows; $i++) {
echo \"----
\n\";
foreach ($results as $data) {
echo \"$data[$i], \n\";
}
echo \"\n\";
}
echo "
\n";
} else {
echo "Pas de ligne
\n";
}
echo "$nrows Lignes lues
\n";
ociFreeStatement($stmt);
ociLogOff($conn);
}
?>


* : la recherche du mot cle se fait les champs "description" de la
table "action", "commentaire" de la table "doc_commentaire",
"remarques" de la table "doc_distribution" et "titre" de la table
"document". Les champs sont tous des alphanumériques



Le résultat : ça m'affiche la barre de saisie avec le bouton de
"rechercher" et lorsque je met un mot cle... rien. ca rame même pas un
peu et ca m'affiche toujours la barre de saisie avec le bouton
recherche.



Sais-tu ce qu'il se passe ?


Chocholman
Commenter la réponse de chocholman
Messages postés
445
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
22 mars 2007
1
0
Merci
Pour la requête :
il faut mettre des conditions complètes entre chaque "OR", tu ne peux pas "factoriser" le "= post[champ]" -> $req="SELECT action.description, doc_commentaire.commentaire, doc_distribution.remarques, document.titre FROM action,doc_commentaire,doc_distribution,document WHERE action.description='".$POST['champ']."' OR doc_commentaire.commentaire='".$POST['champ']."' OR doc_distribution.remarques='".$POST['champ']."' OR document.titre='".$POST['champ']."'";

Sinon, c'est bizarre qu'il n'y ait pas d'erreur à l'ecran, essaie peut-être de changer error_reporting à E_ALL : http://www.php.net/manual/fr/function.error-reporting.php

Pour débugger, tu peux aussi utiliser les valeurs renvoyées par les fonctions oci :

(n'oublies pas les entêtes html)
<form method="post">


</form>


<?php
if (!empty($POST['champ'])) { //si une valeur a été postée -> requète
$conn = ocilogon("log","pass","base") or die (ocierror());
$req="SELECT action.description, doc_commentaire.commentaire, doc_distribution.remarques, document.titre FROM action,doc_commentaire,doc_distribution,document WHERE action.description OR doc_commentaire.commentaire OR doc_distribution.remarques OR document.titre='".$POST['champ']."'"; //peux-tu me dire si ma requete est ok (voir *)?

$stmt = ociparse($conn, $req) or die (ocierror());
ociexecute($stmt) or die (ocierror());
$nrows = ociRowCount($stmt, $results);
if ($nrows > 0) {
echo "\n\";
echo \"----
\n\";
foreach ($results as $key => $val) {
echo \" $key |\n\";
}
echo \"\n\";
for ($i = 0; $i < $nrows; $i++) {
echo \"----
\n\";
foreach ($results as $data) {
echo \"$data[$i], \n\";
}
echo \"\n\";
}
echo "
\n";
} else {
echo "Pas de ligne
\n";
}
echo "$nrows Lignes lues
\n";
ociFreeStatement($stmt);
ociLogOff($conn);
}
?>

Arn;o)
Commenter la réponse de arnal69130
Messages postés
21
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
1 septembre 2005
0
Merci
Toujours rien...
J'ai mis les entête html (je n'ai pas ajoute de corps pour l'instant car je veux voir si ca marche d'abord)
et les reporting d'erreur ne m'indique rien.

Voici ce que j'ai écrit:

//entête html














Commenter la réponse de chocholman
Messages postés
21
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
1 septembre 2005
0
Merci
Rectification j'ai mis ça en fait et c'est pareil qu'avant: rien aucune
recherche. (etla base existe je l'ai consulté par SQL Plus)



<html> //entête html


<form method= "post">


</form>
<?php
error_reporting(E_ALL); //j'ai rajouté ceci mais rien...





if (!empty($POST['champ'])) { //si une valeur a été postée -> requète
$conn = ocilogon(log,pass,base)or die (ocierror());

$req="SELECT action.description, doc_commentaire.commentaire,
doc_distribution.remarques, document.titre FROM
action,doc_commentaire,doc_distribution,document WHERE
action.description='".$POST['champ']."' OR
doc_commentaire.commentaire='".$POST['champ']."' OR
doc_distribution.remarques='".$POST['champ']."' OR
document.titre='".$POST['champ']."'"; //peux-tu me dire si ma requete est ok
$stmt = ociparse($conn, $req) or die (ocierror());
ociexecute($stmt)or die (ocierror());
$nrows = ociRowCount($stmt, $results);
if ($nrows > 0) {
echo "\n\";
echo \"----
\n\";
foreach ($results as $key => $val) {
echo \" $key |\n\";
}
echo \"\n\";
for ($i = 0; $i < $nrows; $i++) {
echo \"----
\n\";
foreach ($results as $data) {
echo \"$data[$i], \n\";
}
echo \"\n\";
}
echo "
\n";
} else {
echo "Pas de ligne
\n";
}
echo "$nrows Lignes lues
\n";
ociFreeStatement($stmt);
ociLogOff($conn);
}
?>
</html>


Merci tjs pour ton aide Arno


Chocholman
Commenter la réponse de chocholman
Messages postés
445
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
22 mars 2007
1
0
Merci
Désolé, je m'étais trompé, c'est $_POST et non pas $POST...

ça donne ça :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//FR" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns= "http://www.w3.org/1999/xhtml">
<head>
<title>RECHERCHE</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>

<?php
$value='';
if (!empty($_POST['champ']))
$value=' value="'.$_POST['champ'].'"';
echo '<form method="post" action="index.php">


</form>';
error_reporting(E_ALL); //j'ai rajouté ceci mais rien...


if (!empty($_POST['champ'])) { //si une valeur a été postée -> requète
$conn = ocilogon(log,pass,base) or die ('erreur'.ocierror());
$req="SELECT action.description, doc_commentaire.commentaire, doc_distribution.remarques, document.titre FROM action,doc_commentaire,doc_distribution,document WHERE action.description='".$POST['champ']."' OR doc_commentaire.commentaire='".$POST['champ']."' OR doc_distribution.remarques='".$POST['champ']."' OR document.titre='".$POST['champ']."'"; //peux-tu me dire si ma requete est ok
$stmt = ociparse($conn, $req) or die (ocierror());
ociexecute($stmt)or die (ocierror());
$nrows = ociRowCount($stmt, $results);
if ($nrows > 0) {
echo "\n\";
echo \"----
\n\";
foreach ($results as $key => $val) {
echo \" $key |\n\";
}
echo \"\n\";
for ($i = 0; $i < $nrows; $i++) {
echo \"----
\n\";
foreach ($results as $data) {
echo \"$data[$i], \n\";
}
echo \"\n\";
}
echo "
\n";
} else {
echo "Pas de ligne
\n";
}
echo "$nrows Lignes lues
\n";
ociFreeStatement($stmt);
ociLogOff($conn);
}
?>
</html>

Arn;o)
Commenter la réponse de arnal69130
Messages postés
21
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
1 septembre 2005
0
Merci
J'ai rectifié quelques truc mais (j'ai enlevé le "action "index.php""
et modifié $_POST à la place de $POST dans la requête) et voila ce que
cela donne :



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//FR" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns= "http://www.w3.org/1999/xhtml">

<head>

<title>RECHERCHE</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

</head>



<?php

$value='';

$log="********";

$pass="****";

$base="*****.****";



if (!empty($_POST['champ']))

$value=' value="'.$_POST['champ'].'"';

echo '<form method="post" >





</form>';

error_reporting(E_ALL); //j'ai rajouté ceci mais rien...



if (!empty($_POST['champ'])) { //si une valeur a été postée -> requète

$conn = ociLogon($log,$pass,$base) or die ('erreur'.ocierror());

$req="SELECT action.description,
doc_commentaire.commentaire, doc_distribution.remarques, document.titre
FROM action,doc_commentaire,doc_distribution,document WHERE
action.description='".$_POST['champ']."' OR
doc_commentaire.commentaire='".$_POST['champ']."' OR
doc_distribution.remarques='".$_POST['champ']."' OR
document.titre='".$_POST['champ']."'"; //peux-tu me dire si ma requete
est ok

$stmt = ociparse($conn, $req) or die (ocierror());

ociexecute($stmt)or die (ocierror());

$nrows = ociRowCount($stmt, $results); // le problème actuel commence ici( voir explication)

if ($nrows > 0) {

echo "\n\";

echo \"----
\n\";

foreach ($results as $key => $val) {

echo \" $key |\n\";

}

echo \"\n\";

for ($i = 0; $i < $nrows; $i++) {

echo \"----
\n\";

foreach ($results as $data) {

echo \"$data[$i], \n\";

}

echo \"\n\";

}

echo "
\n";

} else {

echo "Pas de ligne
\n";

}

echo "$nrows Lignes lues
\n";

ociFreeStatement($stmt);

ociLogOff($conn);

}

?>

</html>


le problème actuel est que la fonction : ociRowCount. Lorsque j'execute le programme, le message suivant :

"Notice: Undefined variable: results in /data/projetfai/www/mot.php on line 27


Pas de ligne


0 Lignes lues"



La ligne 27 est celle que j'ai indexé en vert

J'ai consulté la fonction ociRowCount et voila ce qui était indiqué :

"$nb_enregistrements = ociRowCount ($id_resultat);


retourne le nombre d'enregistrements dans un résultat"

(selon le site =http://www.laltruiste.com/coursphp/fonction_oracle.html http://www.laltruiste.com/document.php?url=http://www.laltruiste.com/coursphp/fonction_oracle.html ).



Or j'ai 2 variables (la variables $results n'est pas utilisée mais doit l'être par la suite (4 et 10 lignes plus loin)).

Auparavant, Arno, tu m'avais mis, au 5ème message de ce topic, pour me guider une fonction qui devait ressembler à ça : $nrows = oci_fetch_all($stmt, $results);

Pouvez-vous m'aider SVP



Merci tous d'avance



Chocholman
Commenter la réponse de chocholman
Messages postés
21
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
1 septembre 2005
0
Merci
Aidez moi !!

Chocholman
Commenter la réponse de chocholman
Messages postés
445
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
22 mars 2007
1
0
Merci
Ben oui, je t'avais mis
oci_fetch_all($stmt,$results);
je comprends pas pourquoi tu a remplacer par
ociRowCount($stmt,$results);
???
Ce n'est pas la même fonction !

Sutout qu'en plus la fonction ociRowCount() n'attend qu'un seul paramètre, il ne faut pas lui en passer 2 !
Comme tu as pu le lire, cette fonction retourne le nombre d'enregistrements d'un résultat, mais elle ne permet pas de parcourir le résultat...

Enfin, avant d'utiliser une variable, il faut l'initialiser. Ceci est notamment vrai pour la variable $results.
Remplace donc
$stmt = ociparse($conn, $req) or die (ocierror());
ociexecute($stmt)or die (ocierror());
$nrows = ociRowCount($stmt, $results); // le problème actuel commence ici( voir explication)
if ($nrows > 0) {

par
$stmt = ociparse($conn, $req) or die (ocierror());
ociexecute($stmt)or die (ocierror());
$resultats=array();
$nrows = oci_fetch_all($stmt, $results); // le problème actuel commence ici( voir explication)
if ($nrows > 0) {

Arn;o)
Commenter la réponse de arnal69130
Messages postés
21
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
1 septembre 2005
0
Merci
Ben je viens de faire comme tu as dit et le message d'erreur suivant s'est produit :

Fatal error: Call to undefined function: oci_fetch_all() in /data/projetfai/www/mot.php on line 30





J'ai un site avec les fonctions oci et je n'ai pas trouvé "oci_fetch_all(":

http://www.laltruiste.com/document.php?url=http://www.laltruiste.com/coursphp/fonction_oracle.html



Que me conseilles-tu pour remplacer cette fonction ?



Merci de ton attention en tout cas



Chocholman
Commenter la réponse de chocholman
Messages postés
445
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
22 mars 2007
1
0
Merci
Tu n'as pas bien cherché !!!
Dans le 2e message que j'ai posté il y avait déjà un lien vers le manuel de cette fonction : http://www.php.net/manual/fr/function.oci-fetch-all.php
- Pour info, LE manuel de référence, c'est http://www.php.net/manual/fr/ -

Si tu avais cherché un tout petit peu, tu aurais vu que, comme tu n'utilises pas une des dernières version de php, il faut que tu utilises
ocifetchstatement()
à la place de
oci_fetch_all()
cf http://www.php.net/manual/fr/function.ocifetchstatement.php

!!!
Commenter la réponse de arnal69130
Messages postés
21
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
1 septembre 2005
0
Merci
Désolé je suis un peu lent

C'est que je venais de faire. J'ai mis Ocifetchstatement() mais cette
fonction retourne un booleen. En tout cas il n'y a plus de message
d'erreur mais ca rame longtemps car la base est en faite trop
importante. J'ai donc ciblé la recherche vers un seul champ :
doc_distribution.remarques. Lorsque je recherche un mot existant dans
ce champ la valeur de $nrows est égal à 0 et il m'indique :

"Pas de ligne


0 Lignes lues"



en fait la requete est bel et bien executée mais aucun résultat n'est traité et affiché.




Chocholman
Commenter la réponse de chocholman
Messages postés
21
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
1 septembre 2005
0
Merci
Ca marche!

en fait le pb que j'avais etait surtout dû effectivement à ma requête : à la place de ='".$_POST['champ']."' je devais mettre like '%".$_POST['champ']."%'



Merci pour toute ton aide. il se peut que j'ai d'autres pb pour
la suite mais en tout cas tu m'as retiré une grosse épine du pied.

Je t'en suis totalement reconnaissant!


Chocholman
Commenter la réponse de chocholman
Messages postés
445
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
22 mars 2007
1
0
Merci
Content que tu t'en sois sorti !

Arn;o)
Commenter la réponse de arnal69130