2009-05-29 14 views
15

La funzione mkdir di PHP restituisce solo true e false. Il problema è quando restituisce false.Come trovare un motivo quando l'mkdir non riesce da PHP?

Se sono in esecuzione con segnalazione errori abilitata, viene visualizzato il messaggio di errore sullo schermo. Posso anche vedere il messaggio di errore nel registro di Apache. Ma mi piacerebbe prendere il testo del messaggio e fare qualcos'altro con esso (ad esempio, inviare a me stesso tramite IM). Come ottengo il testo dell'errore?

Aggiornamento: Seguendo l'idea di Ayman, sono venuto a questo:

function error_handler($errno, $errstr) { 
    global $last_error; 
    $last_error = $errstr; 
} 

set_error_handler('error_handler'); 
if (!mkdir('/somedir')) 
    echo "MKDIR failed, reason: $last_error\n"; 
restore_error_handler(); 

Tuttavia, non mi piace perché usa variabile globale. Qualche idea per una soluzione più pulita?

+0

risposta di Soulmerge è una scelta migliore perché ti dice l'errore senza sostituire il gestore. –

+4

Nota che i gestori degli errori sono memorizzati in una pila in PHP, il che significa che la chiamata a restore_error_handler() ripristinerà il precedente gestore degli errori, sia che si tratti del gestore integrato o di un altro gestore personalizzato. Quindi non c'è alcuna perdita nella sostituzione temporanea del gestore degli errori con set_error_handler(). – soulmerge

risposta

42

È possibile suppress the warning e fare uso di error_get_last():

if ([email protected]($dir)) { 
    $error = error_get_last(); 
    echo $error['message']; 
} 
+5

+1, ma vale la pena notare che questo è potenzialmente fragile se si verifica un altro errore tra mkdir() e error_get_last(), cosa che potrebbe accadere quando il codice diventa più complesso (come un esempio estremo, non realistico, potrebbe funzionare una funzione tick genera un errore prima della tua chiamata error_get_last()). Questo è sempre un rischio ogni volta che usi una sorta di funzione get-last-error. –

14

Si potrebbe utilizzare le eccezioni:

Setup po 'di codice in questo modo:

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

E poi basta fare:

try { 
    mkdir('/somedir'); 
} catch(ErrorException $ex) { 
    echo "Error: " . $ex->getMessage(); 
} 

Questo dovrebbe fare quello che vuoi.

Se si desidera conservare il gestore degli errori php, poi, dopo che blocco try catch, basta chiamare:

restore_error_handler() 
+0

+1 Mi piace questo approccio, non l'ho provato ma sembra solido. Inoltre sembra più oo-friendly;) –

+2

Inoltre, le librerie OO di PHP gestiscono tutte queste cose molto meglio http://www.php.net/manual/en/class.splfileobject.php –

+1

@nickfox mkdir non lancia un'eccezione , questo è il motivo per il gestore di errori personalizzato che genera un'eccezione. Per quanto riguarda le librerie OO di PHP, sì, probabilmente lo fanno meglio. – Kazar

3

io uso qualcosa come il seguente:

if(! @mkdir('$fileLocation', 0777, $recursive = true)){ 
    $mkdirErrorArray = error_get_last(); 
    throw new Exception('cant create directory ' .$mkdirErrorArray['message'], 1); 
} 
Problemi correlati