Aller au contenu

Boucle dans un répertoire


theprogrammeur

Sujets conseillés

Bonjour

Je me fais un p'tit script qui va indexer toutes les pages de mon site et enregistrer certaines info dans la BDD. Voici mon script:

<html><head><title>Script d'indexation</title>
<meta name="robots" content="noindex" />
</head><body>
<?php
//Connection à la BDD
$link = mysql_connect('localhost', 'root', '');
if (!$link) {
die('Connexion impossiblex : ' . mysql_error());
}
mysql_select_db('my_data_base');

$query_one = 'DELETE FROM recherche';
mysql_query($query_one) or die(mysql_error());

mysql_close($link);

function indexer($repertoire){

$connect = mysql_connect('localhost', 'root', '');
if (!$connect) {
die('Connexion impossible : ' . mysql_error());
}
mysql_select_db('my_data_base');


$dossier = opendir($repertoire);

while($fichier = readdir($dossier)){

if(is_dir($fichier) && $fichier !="." && $fichier != ".."){


indexer("$fichier");
}
else{
if(eregi('.php', $fichier)){
$balises_meta = get_meta_tags($repertoire.'/'.$fichier);
if($balises_meta['robots'] != "noindex"){
$meta_description = $balises_meta['description'];
$meta_keywords = $balises_meta['keywords'];
$page ='';
$theprogrammeur=fopen($repertoire.'/'.$fichier,"r");
while(!feof($theprogrammeur)){
$page .= fgets($theprogrammeur,500);
}
fclose($theprogrammeur);

$eregi = eregi("<title>(.*)</title>", $page, $titre_temp);
$titre = $titre_temp[1];
$chemin = $repertoire.'/'.$fichier;
if($titre == ''){
echo'Le fichier '.$fichier.' ne possède pas de titre<br />';
}
if($meta_description == ''){
echo'Le fichier '.$fichier.' ne possède pas de balise META description<br />';
}
if($meta_keywords == ''){
echo'Le fichier '.$fichier.' ne possède pas de balise META keywords<br />';
}
mysql_query("INSERT INTO recherche VALUES('', '$titre', '$chemin', '$meta_description', '$meta_keywords')");
}//robots
}//.php
}//else
}//while
closedir($dossier);
mysql_close($connect);
}//function


indexer(".");
?></body></html>

1er bug

J'ai été obliger de me connecter deux fois à la BDD et ça m'ennuie. Y a-t-il moyen de se connecter avant la fonction et de ne pas se reconnnecter dans la fonction???

Avec la base, j'ai une erreur qui s'affiche:

Warning: mysql_close(): 3 is not a valid MySQL-Link resource in C:\wamp\www\Recherche\indexer.php on line 67

La ligne 67 est la ligne de mysql_close($connect); (dans la fonction)

2eme bug

La fonction est sencée, lorsqu'elle trouve un répertoire l'ouvrir et parcourir tous les dossiers qu'il y a dedans. Je me suis fait un petit répertoire de test avec 5 fichier dont 2 dans un dossier. Le bug est que seul 1 fichier du dossier est indexé dans la BDD et que je ne vois pas où ça foire.

Merci de votre aide.

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

Pour ta première question, il suffit de placer ton mysql_close à la fin de ton fichier. Au lieu de le placer juste après avoir ouvert la connexion... ensuite plus besoin d'ouvrir de connexion à chaque fois que tu veux faire une requête. Simple question de logique, une connexion fermée ne pourra être utilisée que ce soit dans une fonction ou même juste après, donc ferme la une fois que tu sais que tu ne vas plus l'utiliser.

Ensuite, comme je te l'ai déjà dit, indenter ton code te permettra une lecture plus facile, enfin pour toi tu fais comme tu veux, mais si tu souhaites le présenter à d'autres pense à leur santé mentale ;)

Puis, si tu lis la page du manuel PHP au sujet de readdir tu t'apercevras que la manière que tu utilises pour parcourir un dossier est est décrite comme "mauvaise". Utilise l'autre et cela fonctionnera dans tous les cas de figure. De plus lorsque tu vérifies si $fichier est un répertoire tu ne joint pas le reste du chemin, donc au delà d'un répertoire le chemin relatif n'est plus vérifié... si tu changes cette vérification ainsi cela fonctionnera :

  [...]
$cheminfichier = $repertoire.'/'.$fichier;
if(is_dir($cheminfichier) && $fichier !="." && $fichier != ".."){
indexer($cheminfichier);
[...]

Enfin, un conseil supplémentaire, pour supprimer plus rapidement toutes les entrées d'une table utilise plutôt :

TRUNCATE TABLE recherche

Au lieu de DELETE, car les performances de TRUNCATE sont meilleures... à moins que tu aies besoin de conserver les transactions (par exemple avec le type de table InnoDB), dans ce cas DELETE est la seule option.

Bonne continuation.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

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



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