chocholman
Messages postés21Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention 1 septembre 2005
-
9 août 2005 à 16:57
arnal69130
Messages postés445Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention22 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
A voir également:
Aide Urgente pour réalisation d'un Moteur de recherche en php pour une base de d
arnal69130
Messages postés445Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention22 mars 20072 18 août 2005 à 16:51
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 :
arnal69130
Messages postés445Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention22 mars 20072 9 août 2005 à 17:13
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
chocholman
Messages postés21Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention 1 septembre 2005 9 août 2005 à 17:46
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
chocholman
Messages postés21Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention 1 septembre 2005 9 août 2005 à 19:07
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 *)?
* : 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.
arnal69130
Messages postés445Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention22 mars 20072 10 août 2005 à 09:31
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']."'";
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);
}
?>
chocholman
Messages postés21Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention 1 septembre 2005 10 août 2005 à 10:54
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.
<?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>
chocholman
Messages postés21Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention 1 septembre 2005 17 août 2005 à 11:00
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 :
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());
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);
arnal69130
Messages postés445Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention22 mars 20072 18 août 2005 à 14:36
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) {
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
chocholman
Messages postés21Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention 1 septembre 2005 18 août 2005 à 16:41
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
Messages postés21Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention 1 septembre 2005 18 août 2005 à 17:22
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.