2012-07-12 17 views
6

Eventuali duplicati:
PHP uploading script - create folder automaticallyPHP mkdir() Funzione - Se la cartella esiste

Ho uno script PHP che crea una cartella in base a un modulo. Mi chiedo se c'è un modo per non creare e sostituire quella cartella se già esiste?

<?php 
mkdir("QuickLinks/$_POST[contractno]"); 
?> 
+0

Cosa stai cercando di ottenere esattamente? Cosa fa il tuo programma? –

+0

Il programma crea una cartella in base all'input da un modulo e quindi copia una cartella modello nella nuova cartella. Mi chiedo se c'è anche un modo per dire allo script che se la cartella è già lì; non copiare nulla? È un progetto in-house, è necessaria la password per accedere alla pagina web. – ItsJoeTurner

risposta

15

È possibile utilizzare is_dir:

<?php 
$path = "QuickLinks/$_POST[contractno]"; 
if(!is_dir($path)){ 
    mkdir($path); 
} 
?> 
2

In generale:

$dirname = "whatever"; 
if (!is_dir($dirname)) { 
    mkdir($dirname); 
} 

In particolare: sii molto attento a quando esegui operazioni con filesystem (o qualsiasi altro tipo di dati sensibili) che coinvolgono l'input dell'utente! L'esempio corrente (creare una directory) non lascia gran parte di una superficie di attacco aperta, ma la convalida dell'input non può mai danneggiare.

1

Utilizzare la funzione is_dir di PHP per verificare se esiste già una directory e chiamare la funzione mkdir solo se non ce n'è una.

2

Si può provare:

<?php 
    if (!is_dir("QuickLinks/$_POST[contractno]")) 
     mkdir("QuickLinks/$_POST[contractno]"); 
?> 
+0

Questo sembra aver funzionato. C'è un modo per fare questo per copiare una cartella? Se la cartella esiste già, non copiare nulla? – ItsJoeTurner

+0

Sì, questo dovrebbe funzionare: ' '. Se c'è un problema con la funzione shell_exec(), sostituiscila con qualche altra funzione di copiatura ispirata a [this] (http://stackoverflow.com/questions/2050859/copy-entire-contents-of-a-directory-to-another -using-php) argomento. –

0

fare un po 'le regole di validazione (regexp) qui prima di utilizzare variabili POST per creare la directory!

if(!file_exists("QuickLinks/$_POST[contractno]")) 
    mkdir("QuickLinks/$_POST[contractno]"); 
+0

file_exists non distingue tra file e directory, quindi un file con il nome che si sta cercando produrrà un falso true. is_dir controlla se esiste E se è una directory – hellsgate

+1

@hellsgate: quale è l'approccio migliore in questi casi. Non è possibile creare la directory se esiste un file o un socket con nome con lo stesso nome. Quindi 'is_dir' sembra l'approccio più esatto, ma può portare a falsi negativi e ulteriori errori. Puramente immaginario. Ma il codice di fallback dovrebbe essere invocato per le directory * e * esistenti. – mario

+0

@mario: buon punto. Per questo scenario, ora mi rendo conto che file_exists è l'opzione migliore per i motivi elencati. – hellsgate

2

Usa is_dir per verificare se la cartella esiste

$dir = "/my/path/to/dir"; 
if (!is_dir($dir)) { 
    if (false === @mkdir($dir, 0777, true)) { 
     throw new \RuntimeException(sprintf('Unable to create the %s directory', $dir)); 
    } 
} 

L'attenzione per l'ingresso incontrollato, è molto pericoloso!

Problemi correlati