Creare uno script per leggere una dir e salvare dei dati in un database

Salve forum.

Sono nuovamente alle prese con il mio sito.

Avevo usato joomla per organizzarlo ma mi sono reso conto che joomla è troppo per quello che devo fare quindi ho rimesso mano al codice.

Devo creare un sistema per visualizzare le foto della gallery.

Avevo pensato ad uno script che leggesse una directory che contiene cartelle e foto e che popolasse il database.

Il database è così ordinato:

Categorie: id, parent_id, titolo, ordine

Immagini: id, url, titolo, categoria, ordine

la prima tabella racchiude i dati delle categorie che corrispondono all'albero delle dir che lo script scansiona.

Es:

Dir:

foto

- ritratti

- - alessandra

- - carlo

- - marco

- paesaggi

- -italia

- - kenia

etc

quindi ritratti avrà per esempio id = 1 e parent_id = 0 mentre alessandra avrà id =2 e parent_id = 1 (quello della directory ritratti)

la foto, per esempio ritratti/carlo/carlo-01.jpg avrà come id =1, titolo = carlo-01 url = foto/ritratti/carlo/carlo-01.jpg categoria = 3 ordinamento = 2

Adesso lo script deve esplorare la cartella foto e popolare il database, ma come fare?

ecco un abbozzo:

$filename = "../foto/";

// apre la root
if ($handleRoot = opendir($filename)) {
   //legge la dir
   while (false !== ($cartella = readdir($handleRoot))) {

         if (($cartella !== '.')
         && ($cartella !== '..')) {

         // setta il nome della cartella
            $albumNome =$cartella;

            // apre la cartella
         if ($handleDir = opendir($filename.$cartella)) {
            // legge la cartella
            while (false !== ($file = readdir($handleDir))) {

                  if (($file !== '.')
                  && ($file !== '..')
                  && ($file !== 'info.txt')) {
                     // se e' una directory
                     if (is_dir($file)) {

                        // setta il nome della cartella
                        $subAlbumNome =$file;

                        // apre la directory
                        if ($handleSubDir = opendir($filename.$cartella.$file)) {

                           while (false !== ($subFile = readdir($handleSubDir))) {

                              if (($file !== '.')
                              && ($file !== '..')
                              && ($file !== 'info.txt')) {

                                 

                              }
                           }
                        }

                        
                     } else {

                        $fileNome = strlen($file);
                        $fileNome = substr($file, 0, -4);

                        $percorso = $filename.$cartella.'/'.$file;
                        $percorso = substr($percorso, 3);
                     }

                  } // end ifDir

            } // end whileDir

            closedir($handleDir);

            } else {
               echo "la directory $filename.$cartella non esiste";
         }


      } // end ifRoot

   } // end whileDir

   closedir($handleRoot);

} else {
   echo "la directory $filename non esiste";
}

è solo una bozza per far vedere cosa stavo affrontando... suggerimenti?

inviato 10 anni fa
arjuna
X 0 X

sto procedendo per piccoli passi.

ho scritto una funzione:

function leggiCartella ($dir, $filtra) {
   if ($handle = opendir($dir)) {

      while (false !== ($file = readdir($handle))) {

         if ($filtra) {

            $filtro = true;

            if ($filtra === 1) $filtro = (is_dir($file));
            // if ($filtra === 2) $filtro = (is_jpg($file));

            if (($file !== '.')
            && ($file !== '..')
            && $filtro ) {
                  echo $file."<br />";
             }

         } else {
            if (($file !== '.')
            && ($file !== '..')) {
                  echo $file."<br />";
             }

         }

      }
   }

   closedir($handle);
}

se non applico filtri riesco a leggere tutto il contenuto di dir, ma se metto il filtro 1 non succede nulla, tempo che dipenda dal fatto che php non risolva

if (($file !== '.')

            && ($file !== '..')

            && $filtro ) {

suggerimenti?

risposto 10 anni fa
arjuna
X 0 X

rettifico, avevo sbagliato a scrivere il filtro.

non

$filtro = (is_dir($file));

ma

$filtro = (is_dir($dir.$file));

risposto 10 anni fa
arjuna
X 0 X

adesso mi serve un filtro per le immagini, potrei usare :

$test = "test.jpg";

$ext = strlen($test);

$ext = substr($test, -4);

if ($ext != ".jpg");

risposto 10 anni fa
arjuna
X 0 X

scusate ma a volte postare qui mi aiuta a raccogliere le idee, è un pò che non mastico php.

ecco la funzione fino ad ora:

function leggiCartella ($dir, $filtra) {
   if ($handle = opendir($dir)) {

      while (false !== ($file = readdir($handle))) {

         if ($filtra) {

            $filtro = true;

            if ($filtra === 1) $filtro = (is_dir($dir.$file));
            if ($filtra === 2) {

               $ext = strlen($file);
               $ext = substr($file, -4);
               if ($ext != ".jpg") $filtro = false;
            }

            if (($file !== '.')
            && ($file !== '..')
            && $filtro ) {
                  echo $file."<br />";
             }

         } else {
            if (($file !== '.')
            && ($file !== '..')) {
                  echo $file."<br />";
             }

         }

      }
   }

   closedir($handle);
}
risposto 10 anni fa
arjuna
X 0 X

Adesso va meglio, riesco a leggere la directory ma ho dovuto impostare a mano i livelli di addentramento nella gerarchia, ci vorrebbe qualcosa che lo facesse in automatico ma è meglio che per ora diriga le mie energie a come scrivere sul database.

ecco il codice:

<?php
require 'config.php';
require 'mysql_connect.php';



$filename = "../foto/";

$album = leggiCartella ($filename, 1);

foreach ($album as $key=>$value) {

   $album[$key] = leggiCartella ($filename.$value, 2);

}
foreach ($album as $key=>$value) {

   if (count($album[$key]) === 0) {
      $percorso = $filename.$key.'/';
      $album[$key] = '';
      $album[$key] = leggiCartella ($percorso, 1);

      foreach ($album[$key] as $key2=>$value2) {
         if (count($album[$key]) === 0) {
            $percorso = $filename.$key.'/'.$key2.'/';
            $album[$key][$key2] = '';
            $album[$key][$key2] = leggiCartella ($percorso, 1);
         } else {
            $percorso = $filename.$key.'/'.$key2.'/';
            $album[$key][$key2] = '';
            $album[$key][$key2] = leggiCartella ($percorso, 2);
         }
      }
   }
}
echo "<pre>";
print_r ($album);
echo "</pre>";



function leggiCartella ($dir, $filtra) {

   $array = array ();
   if ($handle = opendir($dir)) {

      while (false !== ($file = readdir($handle))) {

         if ($filtra) {

            $filtro = true;

            $key = $file;
            if ($filtra === 1) {

               if (($file !== '.')
               && ($file !== '..')
               && (is_dir($dir.$file)) ) {
                     $array[$key] = $file;
                }

            }
            if ($filtra === 2) {

               $ext = strlen($file);
               $ext = substr($file, -4);
               if ($ext != ".jpg") $filtro = false;
               $ext = strlen($file);
               $ext = substr($file, -10);
               if ($ext === "-thumb.jpg") $filtro = false;
               $ext = strlen($file);
               $ext = substr($file, -7, 1);
               if ($ext !== "-") $filtro = false;

               if (($file !== '.')
               && ($file !== '..')
               && $filtro ) {
                     $array[] = $file;
                }
            }



         } else {
            if (($file !== '.')
            && ($file !== '..')) {
                  $array[] = $file;
             }

         }

      }
   } else {
      $array = false;
   }

   closedir($handle);

   return $array;
}

?>
risposto 10 anni fa
arjuna
X 0 X

ma perché vuoi usare il database? Non basterebbe mostrare il contenuto delle cartelle agli utenti e permettere loro di navigare tra le foto e le directory?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

questo lo avevo gia fatto con un file xml, ma credo (e sottolineo credo), che un database possa permettere più upgrade.

del resto non sono pratico di xml e lo script che legge il file mi è un pò ostico.

non so perchè ma non ho fiducia nell'xml, tu avevi in mente qualcosa di diverso?

risposto 10 anni fa
arjuna
X 0 X

Perché non hai fiducia in xml per piccoli progetti è molto pratico e mette a disposizione le stesse cose che ti permetterebbe di usare un database ... o ma un xml è un database :D

risposto 10 anni fa
Marco Grazia
X 0 X

forse per ignoranza.

trovo molto più facile lavorare con phpmyadmin e php che impazzire su xml, del resto non mi capita spesso di usare xml, non vedo esigenze per imparare un'interessante tecnologia che però non mi serve.

un server con mysql non costa nulla...

come ti dicevo gia avevo creato uno script che leggesse una dir e includesse i risultati della scansione in un file xml che veniva interpellato poi per visualizzare una gallery.

ma faccio prima con un database senza considerare che così sono cmq aperto per ulteriori sviluppi del software.

risposto 10 anni fa
arjuna
X 0 X

ma nel database (o nell'XML) devi memorizzare utleriori informazioni oltre a quelle desunte automaticamente dalle cartelle e dai file?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

in futuro forse si, ma per ora no

risposto 10 anni fa
arjuna
X 0 X

Un database mysql a te non costa nulla ma al processori sì.

Se i dati sono seriali, un file di testo o comunque formattato come xml, è anche più rapido in lettura e scrittura.

risposto 10 anni fa
Marco Grazia
X 0 X

se non devi memorizzare altro allora eviterei a priori tutta la procedura di salvataggio su DB/XML e farei navigare l'utente all'interno delle cartelle. In pratica lo script crea la struttura navigabile leggendo direttamente la struttura delle directory.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

il sito dovrà funzionare così:

una pagina di accesso al portfolio con le immagini di presentazione delle gallerie e i link ad esse.

da questi link si accede alla pagina della categoria selezionata con le presentazioni delle sottocategorie

le sottocategorie contengono un'immagine e le miniature cliccabili delle altre foto.

non è più oneroso per il server gestire ogni volta l'accesso alle directory piuttosto che leggere un file che contiene i dati di esse per recuperare solo quello che serve?

non è altresì più rischioso questo metodo?

risposto 10 anni fa
arjuna
X 0 X

per quanto riguarda le prestazioni se usi un DB non penso che andrai sensibilemnte più veloce, anzi, forse è anche più lento.

Se invece leggi un solo file, di dimensioni ridotte, allora la cosa andrà meglio.

Per quanto riguarda invece la sicurezzo, in entrambi i casi devi fare dei controlli su cosa è lecito fare e cosa impedire, quindi in fin dei conti cambia poco...

Ovviamente l'accesso diretto al file system ti impedisce di associare ai file e alle cartelle ulteriori dati.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Per la sicurezza, se nel file di testo ci sono dati sensibili, è ovvio che potrebbe risultare più pericoloso, nella misura in cui lo è anche un database.

E mi spiego un poco meglio: se alla cartella di amministrazione di ogni utente si accede tramite autenticazione, e la cartella è protetta tramite un sistema di autenticazione, che so tramite .htaccess e .htpassword be allora in teoria, se l'utente è stato furbo, ci sono poche possibilità di accedervi e allora i dati sono al sicuro.

Con un database Mysql rischi di più, perché se ti bucano il database, attraverso che so un'iniezine di codice attraverso una query fatta male, allora buchi tutto il database e tutta la sicurezza del sito se ne va a farsi benedire.

Quindi la scelta del sistema di autenticazione e immagazzinamento dei dati si impone al momento che si inizia a parlare di sicurezza. Col sistema xml, crei un file per ogni utente e quindi se bucato, si buca solo la sicurezza di quell'utente, d'altra parte è indubbio che un database in mysql permette query più complesse e quindi se è questo il tuo'problema', la scelta si è già autoimposta.

Se ho capito ciò che vuoi fare però, mi pare di capire che query complesse non ne dovrai mai fare, dato che devi estrapolare dati da un file (database) seriale, tipo quelli delle news.

Al limite, come dice Gianni e come consiglierei anche io, in un progetto come questo, è più veloce e semplice, fare un controllo in una cartella e mettere nella pagina le thumbnail delle immagini trovate, così senza nessun database con i nomi delle immagini stesse.

In pratica, tante ce ne sono e tante ne vedi, ovvio che non hai un controllo su immagini che l'autore non vorrebbe far vedere ad esempio, ma in questo caso si ritorna a bomba alla questione del database.

risposto 10 anni fa
Marco Grazia
X 0 X

Concordo e sottoscrivo.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Io per un sito dove non c'è db a disposizione ho optato per una soluzione come questa, ma la mia è una scelta obbligata.

Il controllo lo eseguo nello script, se ha l'estensione dell'immagine viene visualizzata se è anche presente un file di testo con lo stesso nome (es. img001.jpg e img001.txt) questo contiene il commento della stessa foto e viene incluso.

Ho "istruito" la persona su come deve gestirsi le cartelle ed il file di configurazione a monte della galleria (nome_cartella_reale;descrizione visualizzata sul collegamento).

Semplice e veloce.

risposto 10 anni fa
LonelyWolf
X 0 X

quindi leggi le cartelle senza creare ne un xml ne un database?

mi posteresti il codice usato o chiedo troppo?

risposto 10 anni fa
arjuna
X 0 X

Non ce l'ho sottomano, sono lavoretti che faccio per hobby a casa, al max domani.

Comunque il principio è questo:

stabilisci la cartella principale (la radice) della galleria, a.e.  /gallery

in questa cartella ci sarà solo un file di testo che contiene le categorie con le descrizioni, ogni riga una categoria: a.e.

ritratti;Galleria dei ritratti

paesaggi:Galleria dei paesaggi

ecc.

quindi la struttura sarebbe

/gallery/ritratti

/gallery/paesaggi

lo script quindi apre solo il file di testo, legge ogni riga e mette un link alla cartella es. /gallery/ritratti con la descrizione Galleria dei ritratti su cui cliccare (rimandando a se stessa).

quando viene ricaricata con il parametro apre la cartella, controlla se c'è ancora gallery.txt ed eventualmente ricrea la struttura dei link, poi scorre la cartella e se ci sono immagini le visualizza, per ogni immagine controlla se c'è il corrispondente file di testo con la descrizione e lo include.

Pro:

Non serve il db

Veloce esecuzione

Contro:

Per ogni livello di ogni cartella serve un file di testo per la presentazione delle categorie successive; (nel mio caso non c'erano altri livelli sotto al primo, quindi è + semplice.)

Ecco un esempio di struttura con + categorie:

/gallery
  gallery.txt (ritratti;galleria ritratti, paesaggi;galleria paesaggi, ecc)
  /ritratti
    gallery.txt (carlo;ritratti di carlo, maria;ritratti di maria, ecc)
    /carlo
      img001.jpg
      img001.txt (il suo commento)
      img002.jpg
      img003.jpg
      img003.txt
    /maria
  /paesaggi
    gallery.txt (italia;paesaggi italiani, kenya;paesaggi kenioti, ecc)
    /italia
      img001.jpg
      img001.txt (il suo commento)
      img002.jpg
      img003.jpg
      img003.txt
    /kenya
risposto 10 anni fa
LonelyWolf
X 0 X

come faccio a leggere il file .txt?

risposto 10 anni fa
arjuna
X 0 X

nessuno mi sa dire come faccio a leggere un file txt?

risposto 10 anni fa
arjuna
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda