• User

    Php e creazione tree di cartelle da mysql

    Ciao a tutti

    ho una tabella mysql con un nome file con il suo path per ogni record. Vorrei che php mi creasse le cartelle cosi come sono nel record. Per esempio se il record è

    /cartella1/cartella2/file

    non avendo ancora la cartella1 nè la cartella2 , php dovrebbe creare cartella1 e poi cartella2 , va bene anche senza creare il file.
    Ho provato cosi ma non mi funziona:
    [php]
    $db_selected = mysql_select_db($database, $connection);
    if (!$db_selected) {
    die ("Errore nella selezione del database: " . mysql_error());
    }

    $query = "SELECT * FROM files ";

    $file = mysql_query($query);

    while ( $dati = mysql_fetch_array($file) ) {

    $path=$base.$dati['link'];

    while ($path){
    print $path;
    $dirs = explode('/', $path);
    $count = count($dirs);
    $path = '.';
    for ($i = 0; $i < $count; ++$i) {
        $path .= '/' . $dirs*;
        if (is_dir($path)) {
        print 'folder exist';
        }
        if (!mkdir($path, 0777)) {
            print 'folder created';
            
        }
    

    }
    [/php]

    Grazie dell'aiuto. :bigsmile:


  • ModSenior

    Ciao,

    La cartella in cui tenti di creare cartelle ha i permessi a 777?


  • User

    La cartella ha i permessi 777. Inoltre mi sono accorto di un piccolo errore nella chiusura delle graffe , ma anche dopo questa correzione ottengo , se lo eseguo da riga di comando , una serie di:

    Warning: mkdir(): File exists in /home/iltk/public_html/mkdir.php on line 40
    folder createdfolder exist
    Warning: mkdir(): File exists in /home/iltk/public_html/mkdir.php on line 40
    folder createdfolder exist
    Warning: mkdir(): File exists in /home/iltk/public_html/mkdir.php on line 40
    folder createdfolder exist
    Warning: mkdir(): File exists in /home/iltk/public_html/mkdir.php on line 40
    folder created./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/home/iltk/moodle/bash/moodledatafolder exist
    Warning: mkdir(): File exists in /home/iltk/public_html/mkdir.php on line 40
    folder createdfolder exist

    la riga 40 si riferisce alla parte:

    if (!mkdir($path, 0777)) {
    print 'folder created';


  • ModSenior

    Ma questo:
    [php]
    if (is_dir($path)) {
    print 'folder exist';
    }
    if (!mkdir($path, 0777)) {
    print 'folder created';

        }
    

    [/php]

    Non dovrebbe essere cosi:
    [php]
    if (is_dir($path)) {
    print 'folder exist';
    }
    else(mkdir($path, 0777)) {
    print 'folder created';

        }
    

    [/php]


  • User

    Ho provato a correggere come dici , ma ottengo un errore di sintassi. In ogni caso anche mettendo else if , lo script mi da:

    exist././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/home/iltk/moodle/bash/moodledatafolder existfolder existfolder existfolder existfolder existfolder existfolder existfolder existfolder existfolder

    simile a prima


  • ModSenior

    Ma facendo un echo di $path il percorso è corretto?


  • User

    Povero me...non avevo neanche pensato di fare un echo..... comunque facendolo è evidente che i path sono sbagliati:

    ./././home
    ./././home/iltk
    ./././home/iltk/moodle
    ./././home/iltk/moodle/bash
    ./././home/iltk/moodle/bash/moodledata
    ./.
    ././.
    ./././.
    ././././home
    ././././home/iltk
    ././././home/iltk/moodle
    ././././home/iltk/moodle/bash
    ././././home/iltk/moodle/bash/moodledata

    Se tolgo la dichiarazione della variable $path ( $path = '.'; ) ottengo:

    home/iltk/moodle/bash/moodledata/home
    home/iltk/moodle/bash/moodledata/home/iltk
    home/iltk/moodle/bash/moodledata/home/iltk/moodle
    home/iltk/moodle/bash/moodledata/home/iltk/moodle/bash
    home/iltk/moodle/bash/moodledata/home/iltk/moodle/bash/moodledata
    home/iltk/moodle/bash/moodledata/home/iltk/moodle/bash/moodledata/home
    home/iltk/moodle/bash/moodledata/home/iltk/moodle/bash/moodledata/home/iltk

    che già mi piace di più ma il ciclo non si chiude , tantè che ricomincia da /home (vedi ultime due righe dell'ultimo output)


  • ModSenior

    Che sia infinito è normale perchè hai fatto while ($path) quindi a meno che $path non sia uguale a false continuerà a ciclare all'infinito.
    Suppongo tu dovessi usare un mysql_fetch_array per ciclarti i dati recuperati dalla tabella.


  • User Attivo

    Forse così...

    [PHP]$db_selected = mysql_select_db($database, $connection);
    if (!$db_selected) {
    die ("Errore nella selezione del database: " . mysql_error());
    }

    $query = "SELECT * FROM files ";

    $file = mysql_query($query);

    while ( $dati = mysql_fetch_array($file) ) {

    $path=$base.$dati['link'];

    print $path;
    $dirs = explode('/', $path);
    $count = count($dirs);
    $path = '.';
    for ($i = 0; $i < $count; ++$i) {
        $path .= '/' . $dirs*;
        if (!is_dir($path)) {
      
        if (!mkdir($path, 0777)) {
            die("Cartella ".$path." non creata!");
            
        }
    

    }

    }
    }[/PHP]


  • User

    Ciao e grazie del suggerimento. Purtroppo il problema per il momento è sulla estrazione e ricompilazione della variabile $path. Lavorandoci un pò su ho modificato lo script , che al momento è cosi:

    [php]<?php
    $db_selected = mysql_select_db($database, $connection);
    if (!$db_selected) {
    die ("Errore nella selezione del database: " . mysql_error());
    }

    $query = "SELECT * FROM files ";

    $file = mysql_query($query);

    while ( $dati = mysql_fetch_array($file) ) {

    $path=$dati['link'];

    //while ($path){
    //print $path;
    $dirs = explode('/', $path);
    $count = count($dirs);
    print $count."<p>";
    

    $count -= 1;
    // print $count."<p>";
    //$path = '.';
    for ($i = 1; $i < ($count); ++$i) {
    $dir .= '/'.$dirs*;
    print $dir."<p>";

        /*
         if(is_dir($dir)) {
        print "folder ".$dir."exist \n";
        }
        else if (mkdir($dir, 0777)) {
            print "folder ".$dir."created \n";
            }
    

    */
    }

    }

    ?>[/php]

    sottrarre una unità a $count mi serve per togliere il file all fne del record , mentre per il ciclo for $i=1 perchè mi veniva il risultato "//dir/dir/" essendo il record iniziante con "/".
    Così ottengo questo risultato:

    26
    /moodledata
    /moodledata/temp
    /moodledata/temp/typo3temp
    /moodledata/temp/typo3temp/cs
    4
    /moodledata/temp/typo3temp/cs/moodledata
    /moodledata/temp/typo3temp/cs/moodledata/upgradelogs
    4
    /moodledata/temp/typo3temp/cs/moodledata/upgradelogs/moodledata

    i problema , come si vede , è che il ciclo for continua anche dopo l'ultimo $i e quindi come si vede anche nell'ultima riga viene creata di nuova tutto il tree all'interno della sottodirectory creata precedentemente , anzichè partire dalla root.


  • User

    Credo di essere riuscito a risolvere,naturalmente se avete suggerimenti per migliorare li script sono ben accetti.Vi ringrazio perchè mi avetedato gli spunti per andare avanti.
    Ecco quindi come ho fatto:

    [php]<?php

    $host = 'xxxxxxx';
    $user = 'xxxxxx';
    $database = 'xxxxx';
    $pass = 'xxxxxx';
    $base = '/home/iltk/moodle/bash';
    $connection = mysql_connect($host, $user, $pass)
    or die("Connessione non riuscita: " . mysql_error());

    $db_selected = mysql_select_db($database, $connection);
    if (!$db_selected) {
    die ("Errore nella selezione del database: " . mysql_error());
    }

    $query = "SELECT * FROM files ";

    $file = mysql_query($query);

    while($dati=mysql_fetch_array($file) ) {

    $path=$dati['link'];
    
    
    $dirs = explode('/', $path);
    
    $count = count($dirs);
    

    //the string begin with a / , so start to the second

    if ($count > 1){ 
    

    for($i=0;$i<$count;$i++){

    //rebuild array using only the needed voices
    
    $def=array_slice($dirs,0,$i,true);
    
    
    $dir=implode("/",$def);
    
    
    $directory=$base.$dir;
    
      if(is_dir($directory)) {
        print "folder ".$directory."exist \n";
        }
        else if (mkdir($directory, 0777)) {
            print "folder ".$directory."created \n";
            }
    

    }
    }

    }

    ?>[/php]