• 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]