2012-10-18 20 views
5

Oto kod I zostały z trudem przez kilka godzin:PHP wymaga nie bez błędu

if ((require $_SESSION['ROOT_PATH'] . '/templates/core/menu_js.php') == 'OK') { 
    echo 'OK'; 
} else { 
    echo 'KO'; 
} 

Jeśli rozumiem dokumentacji PHP na „wymagają” dyrektywy poprawnie, „KO” nigdy nie powinny być napisane ponieważ, jeśli wymaganie nie działa, powstaje błąd.

W moim przypadku „KO” jest zawsze wyświetlany nawet przy błędzie tunning:

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR); 

Należy pamiętać, że sama wymaga (lub obejmuje) działa doskonale na innych stronach serwisu.

EDIT

if struktura została dodana po obejrzeniu dokumentacji. Początkowo miałem jedną linię:

require $_SESSION['ROOT_PATH'] . '/templates/core/menu_js.php'; 

Jak sprawdziliśmy, że linia ta nie działa, dodałem if.

Przy okazji. Wymagana strona (jeśli działa) dodaje tag script do strony wywołującej, której nigdy nie widzę na tej unikalnej stronie. Na dowolnej innej stronie, na której jest to wymagane, skrypt pojawia się na wyjściu.

Moje pytanie powinno brzmieć "jeśli wynik wymaganego pliku php nie zostanie wyświetlony, dlaczego nie zgłoszono błędu?"

+1

Czy menu_js.php rzeczywiście zawiera instrukcję, która mówi: return "OK"? Jeśli nie, zawsze będzie mówić "KO". Zobacz także: http://nl1.php.net/manual/en/function.include.php – Friek

Odpowiedz

4

Według the documentation

Udane obejmuje, chyba że zostaną zamienione przez dołączonego pliku, powrót 1 ... Ponadto, jest to możliwe do zwracania wartości z dołączonych plików. Możesz wziąć wartość wywołania włączającego, tak jak w przypadku zwykłej funkcji.

Twój plik nie zwraca "OK". Zwraca 1 (na sukces) lub wartość niestandardową.

require to konstrukcja językowa, a nie funkcja standardowa. Przy użyciu require już wskazujesz, że kod powinien się nie udać, jeśli plik nie zostanie znaleziony. Najprawdopodobniej nie musisz sprawdzać wartości zwracanej.

+0

Masz rację. Dlatego nie mogę zrozumieć, dlaczego wyświetlane jest "KO". – Targol

+0

Proszę zobaczyć moje edycje. Nie brałem udziału w twoich parens. –

1

Nie można używać require w if

użytkowania tego

if(file_exists($_SESSION['ROOT_PATH'] . '/templates/core/menu_js.php')) 
{ 
echo 'OK'; 
} else { 
    echo 'KO'; 
} 
+0

Dziękuję za odpowiedź, ale, jak powiedziałem w pytaniu, dokładnie linia SAME (np. "Wymagaj") działa na wielu innych stronach mojej strony, więc WIEM na pewno, że plik istnieje. – Targol

+0

@jhonraymos: Z podręcznika PHP include: Successful zawiera, chyba że zostanie przesłonięty przez dołączony plik, zwraca 1. Możliwe jest wykonanie instrukcji return w dołączonym pliku w celu zakończenia przetwarzania w tym pliku i powrotu do skryptu, który wywołał to. – Friek

+1

Twoje pierwsze zdanie jest moją odpowiedzią: Nie można użyć wymagania w przypadku, gdy Ale gdzie jest to napisane w dokumentacji? – Targol

1

Choć to prawda, że ​​wymagać będzie nie powrót coś, co warunkowego zawsze zwrot „KO”, ponieważ z lewej strony wartość w nawiasie nigdy nie będzie równa "OK", możesz sprawdzić, czy plik się nie powiódł, ustawiając tymczasowo wartość display_errors ini w tym skrypcie.

Ponieważ masz ustawione zestawienie błędów, aby to złapać, twój display_errors jest prawdopodobnie wyłączony, dlatego nie pokazuje tego.Ustawić go do tego skryptu tak:

ini_set('display_errors', 'on'); 
+0

Próbowałem tego bez powodzenia. – Targol

3

ta działa tylko zgodnie z oczekiwaniami, jeśli menu_js.php zawiera return 'OK';. W przeciwnym razie require działa dobrze, ale zwrócona wartość nie jest "OK", dlatego też wyzwalany jest warunek "KO". require nie zwraca 'OK'. Jeśli funkcja require nie działa, program zostanie natychmiast zatrzymany, a twój stan nie zostanie nigdy osiągnięty zgodnie z oczekiwaniami.

2

Istnieją pewne błędy tutaj:

  1. Zgodnie z dokumentacją PHP:

    require jest identyczna include wyjątkiem przypadku awarii będzie również produkować błąd krytyczny E_COMPILE_ERROR poziomu.

    Błąd krytyczny przerwie wykonywanie skryptu.

  2. require zwraca jaka zawarte powraca plików:

    // a.php 
    return 'test'; 
    
    // b.php 
    $result = require 'a.php'; 
    echo $result; // will display 'test' 
    

Więc nie testować wartość zwracaną require! Użyj is_file(), a następnie, jeśli true, wymagają tego pliku!

Powiązane problemy