- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- Php e creazione tree di cartelle da mysql
-
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.
-
Ciao,
La cartella in cui tenti di creare cartelle ha i permessi a 777?
-
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 existla riga 40 si riferisce alla parte:
if (!mkdir($path, 0777)) {
print 'folder created';
-
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]
-
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
-
Ma facendo un echo di $path il percorso è corretto?
-
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/moodledataSe 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/iltkche già mi piace di più ma il ciclo non si chiude , tantè che ricomincia da /home (vedi ultime due righe dell'ultimo output)
-
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.
-
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]
-
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/moodledatai 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.
-
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]