2009-05-29 11 views
15

Funkcja mkdir PHP zwraca tylko wartość true i false. Problem polega na tym, że zwraca false.Jak znaleźć powód niepowodzenia mkdir z PHP?

Jeśli mam włączony komunikat o błędzie, widzę komunikat o błędzie na ekranie. Mogę również zobaczyć komunikat o błędzie w dzienniku Apache. Ale chciałbym pobrać tekst wiadomości i zrobić z nią coś innego (np. Wysłać do mnie przez IM). Jak mogę uzyskać tekst błędu?

Aktualizacja: Po idei Ayman za doszedłem do tego:

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(); 

Jednak nie podoba mi się to, ponieważ wykorzystuje zmienną globalną. Masz pomysł na czystsze rozwiązanie?

+0

odpowiedź Soulmerge jest lepszym wyborem ponieważ informuje o błędzie bez zastępowania programu obsługi. –

+4

Należy zauważyć, że obsługa błędów jest przechowywana na stosie w PHP, co oznacza, że ​​wywołanie funkcji restore_error_handler() przywróci poprzednią procedurę obsługi błędów, niezależnie od tego, czy był to wbudowany program obsługi lub inny niestandardowy moduł obsługi. Więc nie ma strat w czasowym zastąpieniu procedury obsługi błędu przez set_error_handler(). – soulmerge

Odpowiedz

42

Można suppress the warning i skorzystać z error_get_last():

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

+1, ale warto zauważyć, że jest to potencjalnie kruche, jeśli wystąpi inny błąd między mkdir() i error_get_last(), co może się zdarzyć, gdy kod stanie się bardziej złożony (jako ekstremalny, nierealistyczny przykład, funkcja tick może działać i wygeneruj błąd przed wywołaniem funkcji error_get_last()). Jest to zawsze ryzyko za każdym razem, gdy używasz jakiejkolwiek funkcji "get-last-error". –

14

Można użyć wyjątki:

Konfiguracja jakiś kod tak:

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

a potem po prostu zrobić:

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

To powinno zrobić, co chcesz.

Jeśli chcesz zachować obsługi błędów php, a następnie po tym bloku try catch, po prostu zadzwoń:

restore_error_handler() 
+0

+1 Podoba mi się to podejście, nie testowałem tego, ale czuję się solidnie. Również wygląda na bardziej przyjazny dla użytkownika;) –

+2

Ponadto, biblioteki OO PHP radzą sobie z tym wszystkim znacznie lepiej http://www.php.net/manual/en/class.splfileobject.php –

+1

@nickfox mkdir nie rzuca wyjątku , to jest powód niestandardowego programu obsługi błędów, który rzuca wyjątek. Jeśli chodzi o biblioteki OO PHP, tak, prawdopodobnie robią to lepiej. – Kazar

3

używam coś jak poniżej:

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