Recherche dans noms de fichiers

fury_fatal
Invité n'ayant pas de compte PHPfrance

30 janv. 2020, 13:34

Bonjour,
J'ai trouvé un script de recherche dans les noms de fichiers assez simple. Il marche, mais il affiche plein d'erreurs :

Notice: Undefined offset: 1 in D:\localhost\recherche.php on line 16
Notice: Undefined offset: 1 in D:\localhost\recherche.php on line 16
Résultat : Test

Le code :

Code : Tout sélectionner

<?php $compteur = 0; // Initialise le compteur du nombre de résultats $d = dir("./"); // Rechercher dans ce dossier if (isset($_POST['submit']) and isset($_POST['mot'])) { $mot = strtolower(trim($_POST['mot'])); // trim() efface les espaces avant et après while ($entry = $d->read()) { // var_dump($entry); preg_match("#($mot+?)#s", $entry, $new); // var_dump($new); $data = $new[1]; if (!empty($data)) { $compteur++; echo '<h2>Résultat : <a href="'.$entry.'">'.ucfirst($data).'</a></h2>'; } if ($compteur >= 3) {break;} // Limiter à 3 résultats } $d->close(); if ($compteur <= 0) {echo '<h2>Pas de résultat !</h2>';} } ?> <form method="post"> <input type="text" name="mot" maxlength="30"> <button type="submit" name="submit">Recherche</button> </form>

Avatar du membre
Mammouth du PHP | 1609 Messages

30 janv. 2020, 14:36

Salut, tu as cette erreur quand $new[1] n'existe pas. C'est lié au preg_match qui ne doit à priori pas trouver le pattern dans $entry.
Développeur web depuis + de 20 ans

fury_fatal
Invité n'ayant pas de compte PHPfrance

30 janv. 2020, 21:43

Ah d'accord !
Je vais vérifier que $new[1] existe.

Maintenant ça marche sans erreur :

Code : Tout sélectionner

while ($entry = $d->read()) { // var_dump($entry); preg_match("#($mot+?)#s", $entry, $new); // var_dump($new); if (isset($new[1])) { $compteur++; echo '<h2>Résultat : <a href="'.$entry.'">'.ucfirst($new[1]).'</a></h2>'; if ($compteur >= 3) {break;} // Limiter à 3 résultats } }
J'ai une autre question. Je suis nul en php objet.
$d->read() c'est du php objet ?
J'ai du mal à comprendre ->read(). En php procédural, c'est quoi l'équivalent ?

Avatar du membre
Mammouth du PHP | 1609 Messages

31 janv. 2020, 02:13

Oui c'est de l'objet. D'après la documentation c'est un objet de classe Directory. La valeur de retour de la fonction dir :
https://www.php.net/manual/fr/function.dir.php

Et la tu as le détaille de la classe :
https://www.php.net/manual/fr/class.directory.php

Quand tu fais un $d->read() tu appelles la méthode read de l'objet $d (une instance de Directory).
En procédurale tu pourrais utiliser les fonctions opendir et readdir.
Développeur web depuis + de 20 ans

Petit nouveau ! | 1 Messages

31 janv. 2020, 08:09

En parcourant le forum, je suis tombé par le grand du hasard sur ce topic, merci pour ces petites astuces les mecs car je suis vraiment un noob en la matière

fury_fatal
Invité n'ayant pas de compte PHPfrance

31 janv. 2020, 13:15

Merci,
La doc précise qu'il faut toujours mettre !== false pour vérifier la boucle while.

Code : Tout sélectionner

while (false !== ($entry = $d->read())) { }
J'ai réussi aussi avec la méthode procédurale :

Code : Tout sélectionner

if ($handle = opendir('./')) { while (($entry = readdir($handle)) !== false) { // code ici } closedir($handle); }