4. Le php


4.1. La connexion php-oracle


Pour la relation entre php et oracle, nous avons utilisé les fonctions OCI de php. Ces fonctions nous ont été utiles pour la connexion à la base et l’exécution des requêtes.
Pour plus de « propreté », nous avons réuni toutes les utilisation de ces méthodes dans une classes conx pour ainsi facilité le développement.

Ex : fonctions execRequete :

function execRequete($sql) {
$stmt = ociparse($this->conn,$sql);
ociexecute($stmt);
$nrows = ocifetchstatement($stmt, $results);
$res = new resultat();
$res->init($results,$nrows);
ocifreestatement($stmt);
return($res);
}


Cette fonction a pour but d’exécuter une requête SQL et de renvoyer un objet contenant les résultats de cette requête et le nombre de résultats.

4.2. Les expressions régulières


Les expressions régulières qui ont été prises en comptes sont les suivantes :
- et, and, &, &&, +
- ou, or, |, ||
- not, -, !
Pour repérer ces expressions dans la chaîne de caractères entrée par l’utilisateur, il a fallu parser cette chaîne, pour cela il a tout d’abord fallu découper cette chaîne en une liste de mots ou d’expressions. Cette étape a été réalisée à l’aide de la fonction explode :
$tab = explode(" ", $string);
Cette fonction sépare la chaîne de caractères $string à chaque fois qu’elle repère un espace puis le résultats est mis dans le tableau $tab. Une fois ce tableau obtenu, il suffit de le parcourir pour construire la requête.


4.3. La création des requêtes


Comme on l’a vu précédemment, la requêtes est construite en fonction des expressions régulières contenues dans la chaîne de caractères entrée par l’utilisateur :

if ($etat == 1 && $i != 0) { //etat = 1 -> présence de et

$requete = $requete."and u.id_uri in (select u0.id_uri from uri u0, motcle m0, urimot um0 where u0.type = '2' and (m0.lib_mot like '".$mot."%') and m0.id_mot = um0.id_mot and um0.id_uri = u0.id_uri)";

$req_count = $req_count."and u.id_uri in (select u0.id_uri from uri u0, motcle m0, urimot um0 where u0.type = '2' and (m0.lib_mot like '".$mot."%') and m0.id_mot = um0.id_mot and um0.id_uri = u0.id_uri)";$etat = 0;

} elseif ($etat == 2 && $i != 0) { //etat = 2 -> présence de ou

$requete = $requete." or m.lib_mot like '".$mot."%'";

$req_count = $req_count." or m.lib_mot like '".$mot."%'"; $etat = 0;

} elseif ($etat == 3 && $i != 0) { //etat = 3 -> présence de not

$requete = $requete." and m.lib_mot <> '".$mot."'";

$req_count = $req_count." and m.lib_mot <> '".$mot."'"; $etat = 0;

} else {
if ($etat == 0){ //etat = 0 -> pas d’expressions régulières
if($par == 0) { //premier mot

$requete = $requete." and (m.lib_mot like '".$mot."%'";

$req_count = $req_count." and (m.lib_mot like '".$mot."%'"; $par = 1;

} else {

requete = $requete." and m.lib_mot like '".$mot."%'";

$req_count = $req_count." and m.lib_mot like '".$mot."%'";

}
} else $etat = 0;
}


On voit donc clairement que la requête suis les expressions régulières mais aussi l’ordre dans lequel la chaîne de caractères a été tapée.

Une fois la requête crée, l’exécution et l’affichage de la requête est demandée.


4.4. L’affichage des résultats

Nous avions envie que les résultats s’affichent pour groupe de dix pour cela il a fallu utiliser un moyen détourné pour que la requête ne renvoie que les dix résultats voulus : ce moyen est d’englober la requête principal par une autre requête dans laquelle une restriction est posée quand aux résultats voulus.

select a.* from (select rowum num + requete principale) a where a.num between 1 and 10

Cette requête retournera les dix premiers résultats de la requête principale.

Donc avec cette possibilité, il suffisait ensuite d’appeler la fonction d’affichage avec en paramètre les pages voulues et nous avons ainsi pu réaliser l’interface comme nous le voulions c’est à dire avec la possibilité de faire Suivant/Précédent mais aussi de cliquer directement sur la page voulue.