2009-11-25 18 views
5

Z przyjemnością korzystam z operatora tłumienia błędów w mojej instalacji dev dev. Ale ostatnio dostał trafiony zawiadomień tak:Eliminacja błędów @ Nie działa

Notice: Uninitialized string offset: 0 in C:\websites\xxx\htdocs\includes\myscript.php on line 35

linii 35:

$file_name = @$File['file_name'];

mam display_errors dalej, a error_reporting ustawiona na 6143 (E_ALL).

Czy brakuje mi czegoś? Czy błąd nie powinien być wyłączony?

Edit:

Testowany w dziewiczej skryptu:

 
$a = array(); 
$b = @$a['f5']; 

stłumił błąd. Więc myślę, że jakoś zmieniamy wartość error_reporting. (Film w 11)

Thx za pomoc na rok.

+1

Czy możesz opublikować wiersz 35? –

+0

To tak, jakby tłumić niewłaściwe stwierdzenie. Podaj kod –

+0

Pokaż cały kod, może być w dowolnej linii. – Cesar

Odpowiedz

5

Nie jest wielkim fanem tłumienia błędów tutaj, z wyjątkiem skryptów wyrzucania lub przypadków, w których naprawdę nie ma dobrego sposobu na złapanie błędu.

Pozwól mi wyjaśnić zachowanie błędu Uninitialized string offset.To nie jest błąd:

Przykład # 1

$a = 0; 
$b = $a['f5']; 

$a jest numeryczna wartość skalarna. W drugiej linii PHP domyślnie rzuca tę wartość numeryczną na ciąg znaków. Łańcuch '0' ma długość 1.

W PHP można wyszukać znak w ciągu znaków za pomocą indeksu tablicy, ponieważ PHP przechowuje ciągi jako tablice wewnętrznie. Na przykład:

$s= 'abcd'; 
print_r($s[1]); 

Wyjście z tego kodu będzie b, ponieważ jest to drugi znak w ciągu. W przykładzie # 1 wyszukiwanie 'f5' jest konwertowane na liczbę, ponieważ łańcuchy znaków mogą być indeksowane tylko po pozycji znaku. echo intval('f5'); pokazuje nam, co PHP interpretuje ciąg 'f5' jako 0 w kontekście numerycznym.

Ze mną do tej pory? Oto co się dzieje, gdy zastosujemy to przykład # 2

Przykład # 2

$a = ''; 
$b = $a['f5']; 

$a jest ciąg o zerowej długości. Druga linia jest taka sama jak $b= $a[0]; - tj. Druga linia pyta o pierwszy znak łańcucha o zerowej długości, ale ciąg nie zawiera znaków. Więc PHP generuje następujący błąd, pozwalając wiesz indeks po prostu nie istnieje:

Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3 

Są twarde uderzenia programowania w luźno wpisywanych języka.

+0

Thx za jasne i zwięzłe wyjaśnienie, pygorex1. – NotoriousWebmaster

-3

Nie, tłumik @ unika wyświetlania ostrzeżeń z wywołań funkcji, a nie zmiennego dostępu i deklaracji. Notice informuje, że uzyskujesz dostęp do elementu łańcuchowego [0], który nie jest zdefiniowany, a zatem nie jest inicjowany. Jeśli chcesz je pominąć, spróbuj sprawdzić wszystkie niezainicjowane zmienne i nadaj im wartość zgodnie z tym, co możesz zrobić z C.

+2

Instrukcja nie zgadza się z Tobą, Derek: http://ca.php.net/manual/en/language.operators.errorcontrol.php – NotoriousWebmaster

1

Ponieważ błąd obejmuje przesunięcie łańcucha o wartości 0, nie może on mieć zastosowania do linii podanego kodu. Nie ma żadnego offsetu całkowitego; używasz tam ciąg 'file_name'.

Również użycie "@" jest naprawdę okropnym pomysłem. Funkcje mogą zawieść, powodując zakończenie działania skryptu bez absolutnie żadnego wskazania, gdzie i dlaczego. Lepszym sposobem obsługi linii kodu wklejeniu to:

if (isset($File['file_name'])) { 
    $file_name = $File['file_name']; 
} else { 
    // throw exception, return FALSE, print an error and exit, whatever 
} 
+0

Normalnie użyłbym ($ isset ($ File [' nazwa_pliku '])? $ Plik [' nazwa_pliku ']:' '). Ale muszę się z tobą nie zgadzać w kwestii indeksu: wygląda na to błąd w wersji PHP, której używam (5.2.2). Zobacz odpowiedź, którą podniosłem. – NotoriousWebmaster

+0

Dziwaczne. Dzięki za heads-up. –

0

OK, tu jest jedno: PHP nie radzą sobie dobrze z indeksami do non-array vars. Na przykład:

 
$a = 0; 
$b = $a['f5']; 

Nie generuje błędu.

następuje:

 
$a = ''; 
$b = $a['f5']; 

Generuje ten błąd:

 
Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3 

I w tym tkwi problem miałem. Jeśli przełączę ją na inicjalizację $ a za pomocą array(), działa funkcja tłumienia błędów. Co więcej, bez tłumienia błędów daje właściwy wskaźnik błędu.

Podejrzewam, że jest to błąd w PHP 5.2.2. Czy ktoś może przetestować to w bardziej aktualnej wersji?

Thx za pomoc dla facetów.

+0

Kiedy mówisz "błąd w PHP" ... mówisz o pierwszym fragmencie kodu, który nie generuje błędu, prawda? Błąd uzyskany z drugiego kodu jest całkowicie poprawny. – DisgruntledGoat