- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- Php e creazione tree di cartelle da mysql
-
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]