Co to jest?
Oto wiele odpowiedzi na temat ostrzeżeń, błędów i uwag, które możesz napotkać podczas programowania PHP i nie masz pojęcia, jak je naprawić. To jest również Wiki Wiki, więc wszyscy są zaproszeni do udziału w dodawaniu i utrzymywaniu tej listy.
Dlaczego to?
Pytania takie jak „Nagłówki już wysłane” lub „Wywołanie członka obiektu niebędącego obiektem” pojawiają się często w przypadku przepełnienia stosu. Podstawowa przyczyna tych pytań jest zawsze taka sama. Tak więc odpowiedzi na te pytania zwykle je powtarzają, a następnie pokazują PO, który wiersz zmienić w konkretnym przypadku. Te odpowiedzi nie dodają żadnej wartości do strony, ponieważ dotyczą tylko określonego kodu PO. Inni użytkownicy mający ten sam błąd nie mogą łatwo odczytać z niego rozwiązania, ponieważ są zbyt zlokalizowani. To smutne, ponieważ po zrozumieniu pierwotnej przyczyny naprawienie błędu jest banalne. Dlatego ta lista próbuje wyjaśnić rozwiązanie w sposób ogólny.
Co mam tu zrobić?
Jeśli Twoje pytanie zostało oznaczone jako duplikat tego pytania, znajdź poniżej komunikat o błędzie i zastosuj poprawkę do swojego kodu. Odpowiedzi zwykle zawierają dalsze linki do zbadania, na wypadek gdyby nie były jasne z samej ogólnej odpowiedzi.
Jeśli chcesz przyczynić się, dodaj swój „ulubiony” komunikat o błędzie, ostrzeżenie lub powiadomienie, po jednym na odpowiedź, krótki opis, co to oznacza (nawet jeśli tylko wyróżnia terminy na stronie podręcznika), możliwe rozwiązanie lub podejście do debugowania i wykaz istniejących pytań i odpowiedzi, które są wartościowe. Możesz również poprawić wszelkie istniejące odpowiedzi.
Lista
- Nic nie widać. Strona jest pusta i biała. (znany również jako White Page / Screen Of Death )
- Kod nie działa / wygląda na to, że wyodrębnia się część mojego kodu PHP
- Ostrzeżenie: nie można modyfikować informacji nagłówka - nagłówki już wysłane
- Ostrzeżenie: mysql_fetch_array () oczekuje, że parametr 1 będzie zasobem, boolean otrzyma aka
Ostrzeżenie: mysql_fetch_array (): podany argument nie jest prawidłowym zasobem wynikowym MySQL alias
Ostrzeżenie: mysqli_num_rows () oczekuje, że parametr 1 będzie mysqli_result, podany boolean (lub podobne odmiany) - Ostrzeżenie: [funkcja] oczekuje, że parametr 1 będzie zasobem, podana wartość logiczna
- Ostrzeżenie: [funkcja] : nie można otworzyć strumienia: [powód]
- Ostrzeżenie: obowiązuje ograniczenie open_basedir
- Ostrzeżenie: dzielenie przez zero
- Ostrzeżenie: niedozwolone przesunięcie ciągu „XXX”
- Ostrzeżenie: count (): Parametr musi być tablicą lub obiektem, który implementuje Countable
- Błąd analizy: błąd składni, nieoczekiwany „[”
- Błąd analizy: błąd składni, nieoczekiwany T_XXX
- Błąd analizy: błąd składni, nieoczekiwany T_ENCAPSED_AND_WHITESPACE
- Błąd analizy: błąd składni, nieoczekiwany T_PAAMAYIM_NEKUDOTAYIM
- Błąd analizy: błąd składni, nieoczekiwany „wymagany_once” (T_REQUIRE_ONCE), oczekiwanie na funkcję (T_FUNCTION)
- Błąd analizy: błąd składni, nieoczekiwany T_VARIABLE
- Błąd krytyczny: wyczerpany dozwolony rozmiar pamięci XXX bajtów (próbował przydzielić XXX bajtów)
- Błąd krytyczny: wywołanie funkcji składowej ... na obiekcie niebędącym obiektem lub pustym
- Błąd krytyczny: wywołanie niezdefiniowanej funkcji XXX
- Błąd krytyczny: nie można ponownie ustawić XXX
- Błąd krytyczny: nie można użyć wartości zwracanej przez funkcję w kontekście zapisu
- Błąd krytyczny: Deklaracja AAA :: BBB () musi być zgodna z deklaracją CCC :: BBB () ”
- Błąd krytyczny: użycie $ this, gdy nie znajduje się w kontekście obiektowym
- Błąd krytyczny: Nie można przekonwertować obiektu klasy Zamknięcie na ciąg
- Błąd krytyczny: niezdefiniowana stała klasy
- Uwaga: Konwersja tablic na łańcuchy
- Uwaga: próba uzyskania właściwości błędu nieobiektywnego
- Uwaga: Niezdefiniowana zmienna lub właściwość
- Uwaga: niezdefiniowany indeks
- Uwaga: Nieokreślone przesunięcie XXX [Odniesienie]
- Uwaga: Niezainicjowane przesunięcie łańcucha: XXX
- Uwaga: użycie niezdefiniowanej stałej XXX - przyjęto „XXX”
- MySQL: Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL pod kątem właściwej składni do użycia w pobliżu ... w linii ...
- Surowe standardy: Niestatyczna metoda [<klasa> :: <metoda>] nie powinna być wywoływana statycznie
- Ostrzeżenie: funkcja oczekuje, że parametr X ma wartość logiczną / ciąg / liczbę całkowitą
- Błąd HTTP 500 - Wewnętrzny błąd serwera
- Przestarzałe: Składnia dostępu do macierzy i przesunięcia łańcucha w nawiasach klamrowych jest przestarzała
Zobacz także:
Odpowiedzi:
Ostrzeżenie: nie można modyfikować informacji nagłówka - nagłówki już wysłane
Zdarza się, gdy skrypt próbuje wysłać nagłówek HTTP do klienta, ale wcześniej było już wyjście, co spowodowało, że nagłówki zostały już wysłane do klienta.
To jest
E_WARNING
i nie zatrzyma skryptu.Typowym przykładem może być plik szablonu taki jak ten:
session_start()
Funkcja spróbuje wysłać nagłówki z pliku cookie sesji do klienta. Ale PHP już wysłało nagłówki, gdy zapisało<html>
element w strumieniu wyjściowym. Trzeba by przenieśćsession_start()
na górę.Możesz rozwiązać ten problem, przechodząc przez wiersze przed kodem wyzwalającym Ostrzeżenie i sprawdzając, gdzie wyprowadza. Przenieś dowolny kod wysyłający nagłówek przed tym kodem.
Często pomijanym wyjściem są nowe wiersze po zamknięciu PHP
?>
. Standardową praktyką jest pomijanie,?>
gdy jest to ostatnia rzecz w pliku. Podobnie, inną częstą przyczyną tego ostrzeżenia jest to, że otwór<?php
ma przed sobą pustą spację, linię lub niewidoczny znak, co powoduje, że serwer WWW wysyła nagłówki i białe znaki / nowa linia, dlatego PHP nie może wysłać parsowania dowolny nagłówek.Jeśli plik zawiera więcej niż jeden
<?php ... ?>
blok kodu, nie powinno być między nimi żadnych spacji. (Uwaga: Możesz mieć wiele bloków, jeśli masz kod, który jest automatycznie konstruowany)Upewnij się również, że nie masz żadnych znaków kolejności bajtów w kodzie, na przykład, gdy kodowanie skryptu to UTF-8 z BOM.
Powiązane pytania:
źródło
<?php ?>
składałby się z „więcej niż jednego bloku”<?php ?> <?php ?>
?Błąd krytyczny: wywołanie funkcji członka ... na obiekcie niebędącym obiektem
Zdarza się z kodem podobnym do
xyz->method()
gdziexyz
nie jest obiektem i dlategomethod
nie można go wywołać.Jest to błąd krytyczny, który powoduje zatrzymanie skryptu (powiadomienie o kompatybilności do przodu: stanie się wykrywalnym błędem, począwszy od PHP 7).
Najczęściej jest to znak, że w kodzie brakuje sprawdzania warunków błędu. Sprawdź, czy obiekt jest faktycznie obiektem przed wywołaniem jego metod.
Typowym przykładem może być
W powyższym przykładzie zapytanie nie może zostać przygotowane i
prepare()
zostanie przypisanefalse
do$statement
. Próba wywołaniaexecute()
metody spowoduje błąd krytyczny, ponieważfalse
jest „nieobiektywny”, ponieważ wartość jest wartością logiczną.Dowiedz się, dlaczego funkcja zwróciła wartość logiczną zamiast obiektu. Na przykład sprawdź
$pdo
obiekt pod kątem ostatniego występującego błędu. Szczegóły dotyczące debugowania będą zależeć od tego, w jaki sposób obsługiwane są błędy dla danej funkcji / obiektu / klasy.Jeśli nawet
->prepare
nie udaje wtedy Twój$pdo
obiekt uchwyt baza danych nie przejdzie do bieżącego zakresu . Znajdź, gdzie zostało zdefiniowane. Następnie przekaż go jako parametr, zapisz jako właściwość lub udostępnij przez zakres globalny.Innym problemem może być warunkowe utworzenie obiektu, a następnie próba wywołania metody poza tym blokiem warunkowym. Na przykład
Próba wykonania metody poza blokiem warunkowym może uniemożliwić zdefiniowanie obiektu.
Powiązane pytania:
źródło
Nic nie widać. Strona jest pusta i biała.
Znany również jako Biała Strona Śmierci lub Biały Ekran Śmierci . Dzieje się tak, gdy raportowanie błędów jest wyłączone i wystąpił błąd krytyczny (często błąd składniowy).
Jeśli masz włączone rejestrowanie błędów, w dzienniku błędów znajdziesz konkretny komunikat o błędzie. Zwykle będzie to plik o nazwie „php_errors.log”, albo w centralnej lokalizacji (np. W
/var/log/apache2
wielu środowiskach Linux), albo w katalogu samego skryptu (czasami używany w udostępnianym środowisku hostingowym).Czasami może być prostsze tymczasowe włączenie wyświetlania błędów. Biała strona wyświetli komunikat o błędzie. Zachowaj ostrożność, ponieważ błędy te są widoczne dla wszystkich odwiedzających witrynę.
Można to łatwo zrobić, dodając na górze skryptu następujący kod PHP:
Kod włączy wyświetlanie błędów i ustawi raportowanie na najwyższym poziomie.
Ponieważ
ini_set()
jest wykonywany w czasie wykonywania, nie ma wpływu na błędy analizy / składni. Te błędy pojawią się w dzienniku. Jeśli chcesz je również wyświetlić na wyjściu (np. W przeglądarce), musisz ustawićdisplay_startup_errors
dyrektywę natrue
. Czy to albo wphp.ini
albo w.htaccess
lub przez jakikolwiek inny sposób, który wpływa na konfigurację przed starcie .Możesz użyć tych samych metod, aby ustawić dyrektywy log_errors i error_log, aby wybrać własną lokalizację pliku dziennika.
Przeglądając dziennik lub korzystając z wyświetlacza, otrzymasz znacznie lepszy komunikat o błędzie i wiersz kodu, w którym skrypt się zatrzymuje.
Powiązane pytania:
Powiązane błędy:
źródło
error_reporting(~0);
dlaczego nie-1
? To właśnie~0
ocenia i jest znacznie mniej tajemnicze.~0
jest bardziej jednoznaczny IMO: zaneguj pusty zestaw bitów, tzn. włącz wszystkie flagi. -1 nie oznacza „nie znaleziono” jak w strpos () w C, ale jako zestaw bitów ze wszystkimi ustawionymi flagami, ponieważ -1 jest binarny1111'1111'1111'1111
(dla 32 bitów).1111'1111'1111'1111
to naprawdę 16 bitów, ale mam nadzieję, że rozumiesz, co mam na myśli.E_STRICT
nie jest uwzględniony wE_ALL
. php.net/manual/en/errorfunc.constants.php i przewiń w dół doE_STRICT
.Uwaga: niezdefiniowany indeks
Zdarza się, gdy próbujesz uzyskać dostęp do tablicy za pomocą klucza, który nie istnieje w tablicy.
Typowym przykładem
Undefined Index
ogłoszenia byłoby ( demo )Oba
spinach
i1
nie istnieją w tablicy, co powodujeE_NOTICE
wyzwolenieRozwiązaniem jest upewnienie się, że indeks lub offset istnieje przed uzyskaniem dostępu do tego indeksu. Może to oznaczać, że musisz naprawić błąd w swoim programie, aby upewnić się, że te indeksy istnieją, gdy się ich spodziewasz. Lub może to oznaczać, że musisz sprawdzić, czy indeksy istnieją za pomocą
array_key_exists
lubisset
:Jeśli masz kod taki jak:
wtedy
$_POST['message']
nie zostanie ustawiony, gdy strona zostanie załadowana po raz pierwszy i pojawi się powyższy błąd. Dopiero po przesłaniu formularza i uruchomieniu tego kodu indeks tablicy będzie istniał po raz drugi. Zazwyczaj sprawdzasz to za pomocą:Powiązane pytania:
źródło
if(!empty($_POST['message'])){ //do stuff }
Ostrzeżenie: mysql_fetch_array () oczekuje, że parametr 1 będzie zasobem, podana wartość logiczna
Przede wszystkim:
Dzieje się tak, gdy próbujesz pobrać dane z wyniku,
mysql_query
ale zapytanie nie powiodło się.Jest to ostrzeżenie i nie zatrzyma skryptu, ale spowoduje błąd w programie.
Musisz sprawdzić wynik zwracany
mysql_query
przezPowiązane pytania:
Powiązane błędy:
Inne
mysql*
funkcje, które również oczekują zasobu wynikowego MySQL jako parametru, powodują ten sam błąd z tego samego powodu.źródło
mysql_query
nie jest wystarczająco źle, dodawanieor die
na nim jest obrazą obrażeń.$res = mysql_query($query)
zwraca 1, jeśli zapytanie zakończy się powodzeniem, więc jest uważane za prawdziwe. Dlatego przy przekazywaniu wynikumysql_query
domysql_fetch_array()
ogłoszenia pokazuje.mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
proszę zobaczyć - gist.github.com/romelemperado/93af4cdbd44ebf3a07cbfa0e3fc539d7 Wszelkie sugestie, aby pozbyć się tego błędu?mysql_fetch_array()
służy do wyboru zapytania, do wstawiania i aktualizacji nie trzeba pobierać zestawu wyników (i nie ma zestawu wyników, który można pobrać).Błąd krytyczny: użycie $ this, gdy nie znajduje się w kontekście obiektowym
$this
jest specjalną zmienną w PHP, której nie można przypisać. Jeśli jest dostępny w kontekście, w którym nie istnieje, występuje błąd krytyczny.Ten błąd może wystąpić:
Jeśli metoda niestatyczna jest wywoływana statycznie. Przykład:
Jak naprawić: ponownie przejrzyj kod,
$this
można go używać tylko w kontekście obiektowym i nigdy nie należy go używać w metodzie statycznej. Ponadto metoda statyczna nie powinna mieć dostępu do właściwości niestatycznej. Użyj,self::$static_property
aby uzyskać dostęp do właściwości statycznej.Jeśli kod z metody klasy został skopiowany do normalnej funkcji lub po prostu do zakresu globalnego i zachowuje
$this
specjalną zmienną.Jak naprawić: Przejrzyj kod i zastąp
$this
inną zmienną podstawiania.Powiązane pytania:
źródło
$closure = function() { self::method(); }
.$this
można wywołać na zamówienie „Błąd krytyczny: użycie $ this, gdy nie jest on w kontekście obiektowym” :$closure = function() { $this->method(); };
Błąd krytyczny: wywołanie niezdefiniowanej funkcji XXX
Zdarza się, gdy próbujesz wywołać funkcję, która nie została jeszcze zdefiniowana. Typowe przyczyny to brakujące rozszerzenia i obejmuje, deklaracja funkcji warunkowej, funkcja w deklaracji funkcji lub proste literówki.
Przykład 1 - Deklaracja funkcji warunkowej
W takim przypadku
fn()
nigdy nie zostanie zadeklarowane, ponieważ$someCondition
jest to nieprawda.Przykład 2 - Funkcja w deklaracji funkcji
W takim przypadku
fn
zostanie zadeklarowane dopiero pocreateFn()
wywołaniu. Zauważ, że kolejne wywołania docreateFn()
wywołują błąd dotyczący ponownej deklaracji istniejącej funkcji.Możesz to również zobaczyć dla wbudowanej funkcji PHP. Spróbuj wyszukać funkcję w oficjalnym podręczniku i sprawdź, do jakiego „rozszerzenia” (modułu PHP) należy i jakie wersje PHP ją obsługują.
W przypadku brakującego rozszerzenia zainstaluj je i włącz w php.ini. Informacje na temat rozszerzenia, w którym pojawia się funkcja, można znaleźć w Instrukcji instalacji. Można również włączyć lub zainstalować rozszerzenie przy użyciu menedżera pakietów (np.
apt
W Debianie lub Ubuntu,yum
w Red Hat lub CentOS) lub w panelu sterowania we współdzielonym środowisku hostingowym.Jeśli funkcja została wprowadzona w nowszej wersji PHP z tego, czego używasz, możesz znaleźć linki do alternatywnych implementacji w instrukcji lub w sekcji komentarzy. Jeśli został usunięty z PHP, poszukaj informacji o tym, dlaczego nie jest już potrzebny.
W przypadku braku dołączeń, pamiętaj o dołączeniu pliku deklarującego funkcję przed wywołaniem funkcji.
W przypadku literówek napraw literówkę.
Powiązane pytania:
źródło
Błąd analizy: błąd składni, nieoczekiwany T_XXX
Zdarza się, gdy masz
T_XXX
token w nieoczekiwanym miejscu, niezrównoważone (zbędne) nawiasy, użycie krótkiego znacznika bez aktywacji go w php.ini i wiele innych.Powiązane pytania:
Aby uzyskać dalszą pomoc, zobacz:
źródło
Błąd krytyczny: nie można użyć wartości zwracanej przez funkcję w kontekście zapisu
Zwykle dzieje się tak, gdy używasz funkcji bezpośrednio z
empty
.Przykład:
Wynika to z faktu, że
empty
jest konstrukcją języka, a nie funkcją, dlatego nie można go wywoływać z wyrażeniem jako argumentem w wersjach PHP wcześniejszych niż 5.5. Przed PHP 5.5 argumentemempty()
musi być zmienna , ale dowolne wyrażenie (takie jak wartość zwracana przez funkcję) jest dozwolone w PHP 5.5+.empty
, pomimo swojej nazwy, nie sprawdza, czy zmienna jest „pusta”. Zamiast tego sprawdza, czy zmienna nie istnieje, lub== false
. Wyrażenia (jakis_null(null)
w przykładzie) zawsze będą uważane za istniejące, więc tutajempty
sprawdzamy tylko, czy jest równe false. Możesz zastąpićempty()
tutaj!
np.if (!is_null(null))
Lub jawnie porównać do fałszu, npif (is_null(null) == false)
.Powiązane pytania:
źródło
MySQL: Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL pod kątem właściwej składni do użycia w pobliżu ... w linii ...
Ten błąd jest często spowodowany, ponieważ zapomniałeś poprawnie uciec danych przekazywanych do zapytania MySQL.
Przykład tego, czego nie należy robić („zły pomysł”):
Ten kod może być zawarty na stronie z formularzem do przesłania, z adresem URL takim jak http://example.com/edit.php?id=10 (w celu edycji postu nr 10)
Co się stanie, jeśli przesłany tekst zawiera pojedyncze cudzysłowy?
$query
skończy z:A gdy zapytanie zostanie wysłane do MySQL, będzie się skarżyć, że składnia jest nieprawidłowa, ponieważ w środku jest dodatkowy pojedynczy cytat.
Aby uniknąć takich błędów, MUSISZ zawsze uciekać przed użyciem danych w zapytaniu.
Ucieczka danych przed użyciem w zapytaniu SQL jest również bardzo ważna, ponieważ jeśli tego nie zrobisz, twój skrypt będzie otwarty na zastrzyki SQL. Wstrzyknięcie SQL może spowodować zmianę, utratę lub modyfikację rekordu, tabeli lub całej bazy danych. To bardzo poważny problem bezpieczeństwa!
Dokumentacja:
mysql_real_escape_string()
mysqli_real_escape_string()
źródło
Błąd krytyczny: wyczerpany dozwolony rozmiar pamięci XXX bajtów (próbował przydzielić XXX bajtów)
Za mało pamięci, aby uruchomić skrypt. PHP osiągnęło limit pamięci i przestaje go wykonywać. Ten błąd jest krytyczny, skrypt zatrzymuje się. Wartość limitu pamięci można skonfigurować w
php.ini
pliku lub za pomocąini_set('memory_limit', '128 M');
skryptu (który zastąpi wartość zdefiniowaną wphp.ini
). Limit pamięci ma na celu zapobieżenie pożarciu jednego skryptu PHP przez całą dostępną pamięć i awarii całego serwera WWW.Pierwszą rzeczą do zrobienia jest zminimalizowanie ilości pamięci wymaganej przez skrypt. Na przykład, jeśli czytasz duży plik do zmiennej lub pobierasz wiele rekordów z bazy danych i przechowujesz je wszystkie w tablicy, która może zużywać dużo pamięci. Zmień kod, aby zamiast tego czytać plik linia po linii lub pobierać rekordy bazy danych pojedynczo, bez zapisywania ich wszystkich w pamięci. Wymaga to nieco pojęciowej świadomości tego, co dzieje się za kulisami i kiedy dane są przechowywane w pamięci, a gdzie indziej.
Jeśli ten błąd wystąpił, gdy skrypt nie wykonywał pracy wymagającej dużej ilości pamięci, musisz sprawdzić kod, aby sprawdzić, czy nie ma wycieku pamięci. Ta
memory_get_usage
funkcja jest Twoim przyjacielem.Powiązane pytania:
źródło
Błąd analizy: błąd składni, nieoczekiwany T_ENCAPSED_AND_WHITESPACE
Ten błąd występuje najczęściej podczas próby odwołania się do wartości tablicy za pomocą cytowanego klucza do interpolacji w łańcuchu z podwójnym cudzysłowem, gdy cała konstrukcja zmiennej złożonej nie jest ujęta
{}
.Przypadek błędu:
Spowoduje to
Unexpected T_ENCAPSED_AND_WHITESPACE
:Możliwe poprawki:
W łańcuchu z podwójnym cudzysłowem PHP zezwoli na użycie ciągów kluczy tablicy bez cudzysłowu i nie wyda znaku
E_NOTICE
. Tak więc powyższe można zapisać jako:Całą zmienną tablicy zespolonej i klucze można zawrzeć
{}
, w takim przypadku należy je cytować, aby uniknąćE_NOTICE
. Dokumentacja PHP zaleca tę składnię dla zmiennych złożonych.Oczywiście alternatywą dla któregokolwiek z powyższych jest konkatenacja zmiennej tablicowej zamiast jej interpolacji:
Dla porównania, patrz rozdział o zmiennej parsowania w ręcznym strony PHP Ciągi
źródło
Ostrzeżenie: [funkcja] : nie można otworzyć strumienia: [powód]
Zdarza się, kiedy można nazwać plik zwykle
include
,require
albofopen
i PHP nie może odnaleźć pliku lub nie mają wystarczającej ilości uprawnień do załadowania pliku.Może się to zdarzyć z różnych powodów:
Jednym z powszechnych błędów jest niestosowanie bezwzględnej ścieżki. Można to łatwo rozwiązać za pomocą pełnej ścieżki lub stałych magicznych, takich jak
__DIR__
lubdirname(__FILE__)
:lub:
Zapewnienie prawidłowej ścieżki jest jednym z kroków w rozwiązywaniu tych problemów, może to być również związane z nieistniejącymi plikami, prawami systemu plików uniemożliwiającymi dostęp lub ograniczeniami otwartego oprogramowania przez samego PHP.
Najlepszym sposobem szybkiego rozwiązania tego problemu jest skorzystanie z poniższej listy kontrolnej rozwiązywania problemów.
Powiązane pytania:
Powiązane błędy:
źródło
Błąd analizy: błąd składni, nieoczekiwany T_PAAMAYIM_NEKUDOTAYIM
Operator rozdzielczości zakresu jest również nazywany „Paamayim Nekudotayim” z hebrajskiego פעמיים נקודתיים. co oznacza „podwójny dwukropek”.
Ten błąd zwykle występuje, jeśli nieumyślnie wpiszesz
::
swój kod.Powiązane pytania:
Dokumentacja:
źródło
a()::b;
lub$a=::;
.Uwaga: użycie niezdefiniowanej stałej XXX - przyjęto „XXX”
lub w PHP 7.2 lub nowszym:
Ostrzeżenie: użycie niezdefiniowanej stałej XXX - przyjęto „XXX” (spowoduje to wyświetlenie błędu w przyszłej wersji PHP)
To powiadomienie występuje, gdy token jest używany w kodzie i wydaje się być stałą, ale stała o tej nazwie nie jest zdefiniowana.
Jedną z najczęstszych przyczyn tego zawiadomienia jest brak cytowania ciągu używanego jako klucz tablicy asocjacyjnej.
Na przykład:
Inną częstą przyczyną jest brakujący
$
znak (dolar) przed nazwą zmiennej:A może źle wpisałeś inną stałą lub słowo kluczowe:
Może to również oznaczać brak wymaganego rozszerzenia PHP lub biblioteki podczas próby uzyskania dostępu do stałej zdefiniowanej przez tę bibliotekę.
Powiązane pytania:
źródło
Błąd krytyczny: nie można ponownie ustawić klasy [nazwa klasy]
Błąd krytyczny: nie można ponownie ustawić [nazwa funkcji]
Oznacza to, że albo używasz tej samej nazwy funkcji / klasy dwa razy i musisz zmienić nazwę jednej z nich, albo to dlatego, że użyłeś
require
lubinclude
gdzie powinieneś używaćrequire_once
lubinclude_once
.Kiedy klasa lub funkcja jest zadeklarowana w PHP, jest niezmienna i nie może być później zadeklarowana z nową wartością.
Rozważ następujący kod:
class.php
index.php
Drugie wywołanie
do_stuff()
wywoła powyższy błąd. Zmieniającrequire
narequire_once
, możemy być pewni, że plik zawierający definicjęMyClass
zostanie załadowany tylko raz, a błąd zostanie uniknięty.źródło
Uwaga: Niezdefiniowana zmienna
Zdarza się, gdy próbujesz użyć zmiennej, która nie została wcześniej zdefiniowana.
Typowy przykład to
Jeśli nie zdefiniowałeś
$counter
wcześniej, powyższy kod wywoła powiadomienie.Prawidłowym sposobem byłoby ustawienie zmiennej przed użyciem, nawet jeśli jest to po prostu pusty ciąg znaków
Uwaga: Właściwość niezdefiniowana
Ten błąd oznacza prawie to samo, ale odnosi się do właściwości obiektu. Ponownie wykorzystując powyższy przykład, ten kod spowodowałby błąd, ponieważ
counter
właściwość nie została ustawiona.Powiązane pytania:
źródło
Błąd analizy: błąd składni, nieoczekiwany T_VARIABLE
Możliwy scenariusz
Nie mogę znaleźć miejsca, w którym mój kod poszedł źle. Oto mój pełny błąd:
Co próbuję
Odpowiedź
Błąd analizy: problem ze składnią programu, taki jak pozostawienie średnika na końcu instrukcji lub, jak w powyższym przypadku, brak
.
operatora. Tłumacz przestaje uruchamiać program, gdy napotka błąd analizy.Krótko mówiąc, jest to błąd składniowy, co oznacza, że w kodzie jest coś, co powstrzymuje go przed prawidłowym parsowaniem, a tym samym działaniem.
To, co powinieneś zrobić, to dokładnie sprawdzić na liniach wokół tego, gdzie jest błąd dla prostych błędów.
Ten komunikat o błędzie oznacza, że w wierszu x pliku interpreter PHP spodziewał się otwartego nawiasu, ale zamiast tego napotkał coś o nazwie
T_VARIABLE
. ToT_VARIABLE
się nazywatoken
. Jest to sposób interpretera PHP na wyrażanie różnych podstawowych części programów. Kiedy interpreter odczytuje program, tłumaczy to, co napisałeś, na listę tokenów. Gdziekolwiek umieścisz zmienną w swoim programie,T_VARIABLE
na liście tłumacza znajduje się token.Dobra lektura: Lista tokenów analizatora składni
Więc upewnij się, że włączysz przynajmniej
E_PARSE
w swoimphp.ini
. Błędy analizy nie powinny występować w skryptach produkcyjnych.Zawsze zalecałem dodanie następującej instrukcji podczas kodowania:
Raportowanie błędów PHP
Ponadto dobrym pomysłem jest użycie IDE, które da ci znać błędy analizy podczas pisania. Możesz użyć:
Powiązane pytania:
źródło
Uwaga: Niezainicjowane przesunięcie łańcucha:
*
Jak sama nazwa wskazuje, tego typu błąd występuje, gdy najprawdopodobniej próbujesz wykonać iterację lub znaleźć wartość z tablicy z nieistniejącym kluczem.
Zastanów się, próbujesz pokazać każdą literę od
$string
Powyższy przykład wygeneruje ( demo online ):
I gdy tylko skrypt zakończy echo
D
,for()
pojawi się błąd, ponieważ w pętli powiedziałeś PHP, aby pokazywał ci od pierwszego do piątego ciągu znaków, z'ABCD'
którego istnieje, ale ponieważ pętla zaczyna liczyć0
i echaD
zanim dotrze do4
, wyrzuci błąd przesunięcia.Podobne błędy:
źródło
Uwaga: próba uzyskania właściwości błędu nieobiektywnego
Zdarza się, gdy próbujesz uzyskać dostęp do właściwości obiektu, gdy nie ma żadnego obiektu.
Typowym przykładem powiadomienia o braku obiektu jest:
W tym przypadku
$users
jest tablicą (a więc nie obiektem) i nie ma żadnych właściwości.Jest to podobne do uzyskiwania dostępu do nieistniejącego indeksu lub klucza tablicy (patrz Uwaga: Indeks niezdefiniowany ).
Ten przykład jest znacznie uproszczony. Najczęściej takie powiadomienie sygnalizuje niesprawdzoną wartość zwracaną, np. Gdy biblioteka zwraca,
NULL
jeśli obiekt nie istnieje, lub po prostu nieoczekiwana wartość niebędąca przedmiotem (np. W wyniku Xpath, struktury JSON o nieoczekiwanym formacie, XML o nieoczekiwanym formacie itp.) ale kod nie sprawdza takiego warunku.Ponieważ te obiekty niebędące obiektami są często przetwarzane dalej, często następuje błąd krytyczny podczas wywoływania metody obiektowej na obiekcie niebędącym obiektem (patrz: Błąd krytyczny: wywołanie funkcji składowej ... na obiekcie niebędącym obiektem ), który zatrzymuje scenariusz.
Można temu łatwo zapobiec, sprawdzając warunki błędu i / lub czy zmienna spełnia oczekiwania. Oto takie powiadomienie z przykładem DOMXPath :
Problemem jest dostęp do
nodeValue
właściwości (pola) pierwszego elementu, który nie został sprawdzony, czy istnieje w$result
kolekcji. Zamiast tego opłaca się uczynić kod bardziej wyraźnym, przypisując zmienne do obiektów, na których działa kod:Powiązane błędy:
źródło
json_decode
terazstdclass
domyślnie zwraca instancję , więc przykładowy kod faktycznie działałby .json_decode
terazstdclass
domyślnie zwraca instancję ” ? Nie mogę tego znaleźć w dzienniku zmian.assoc
parametr ma wartość false. Ten parametr decyduje, czy funkcja zwracastdclass
tablicę zamiast asocjacyjnej.json_decode('[{"name": "hakre"}]', true)
zwróci tablicę, w przeciwnym raziestdclass
obiektOstrzeżenie: obowiązuje ograniczenie open_basedir
To ostrzeżenie może pojawić się przy różnych funkcjach związanych z dostępem do plików i katalogów. Ostrzega o problemie z konfiguracją.
Gdy się pojawi, oznacza to, że dostęp do niektórych plików został zabroniony.
Samo ostrzeżenie niczego nie psuje, ale najczęściej skrypt nie działa poprawnie, jeśli dostęp do plików jest uniemożliwiony.
Poprawka polega zwykle na zmianie konfiguracji PHP , wywoływane jest powiązane ustawienie
open_basedir
.Czasami używa się niewłaściwych nazw plików lub katalogów, wówczas poprawką jest użycie właściwych.
Powiązane pytania:
źródło
Błąd analizy: błąd składni, nieoczekiwany „[”
Ten błąd występuje w dwóch wariantach:
Wariacja 1
Ta składnia inicjalizująca tablicę została wprowadzona tylko w PHP 5.4; spowoduje to błąd parsera w wersjach wcześniejszych. Jeśli to możliwe, zaktualizuj instalację lub użyj starej składni:
Zobacz także ten przykład z podręcznika.
Wariant 2
Wyniki funkcji dereferencji tablicy zostały również wprowadzone w PHP 5.4. Jeśli aktualizacja nie jest możliwa, musisz użyć (tymczasowej) zmiennej:
Zobacz także ten przykład z podręcznika.
źródło
Ostrzeżenie: [funkcja] oczekuje, że parametr 1 będzie zasobem, podana wartość logiczna
(Bardziej ogólna odmiana Ostrzeżenie: mysql_fetch_array () oczekuje, że parametr 1 będzie zasobem, podano wartość logiczną )
Zasoby są typem w PHP (np. Ciągi, liczby całkowite lub obiekty). Zasób jest nieprzezroczystą kroplą bez własnej wartości znaczącej. Zasób jest specyficzny i określony przez określony zestaw funkcji PHP lub rozszerzenia. Na przykład rozszerzenie Mysql definiuje dwa typy zasobów :
Rozszerzenie cURL definiuje kolejne dwa typy zasobów :
Po
var_dump
ed wartości wyglądają tak:To wszystko, co większość zasobów, to identyfikator numeryczny (
(1)
) określonego typu ((curl)
).Nosisz te zasoby i przekazujesz je do różnych funkcji, dla których taki zasób coś znaczy. Zazwyczaj funkcje te przydzielają pewne dane w tle, a zasób jest tylko odniesieniem, którego używają do wewnętrznego śledzenia tych danych.
Błąd „ ... oczekuje, że parametr 1 będzie zasobem, boolean podano ” jest zwykle wynikiem niezaznaczonej operacji, która miała utworzyć zasób, ale została zwrócona
false
. Na przykładfopen
funkcja ma następujący opis:Więc w tym kodzie,
$fp
będzie alboresource(x) of type (stream)
albofalse
:Jeśli nie sprawdzisz, czy
fopen
operacja się powiodła, czy nie, a zatem czy$fp
jest to prawidłowy zasób, czy teżfalse
przejdziesz$fp
do innej funkcji, która oczekuje zasobu, możesz otrzymać powyższy błąd:Zawsze musisz sprawdzić błąd zwracanej wartości funkcji, które próbują przydzielić zasób i mogą się nie powieść :
Powiązane błędy:
źródło
Ostrzeżenie: niedozwolone przesunięcie ciągu „XXX”
Dzieje się tak, gdy próbujesz uzyskać dostęp do elementu tablicy za pomocą składni nawiasu kwadratowego, ale robisz to na łańcuchu, a nie na tablicy, więc operacja najwyraźniej nie ma sensu .
Przykład:
Jeśli uważasz, że zmienna powinna być tablicą, sprawdź, skąd pochodzi i napraw tam problem.
źródło
Kod nie działa / wygląda na to, że wyodrębnia się część mojego kodu PHP
Jeśli nie widzisz żadnych rezultatów z kodu PHP i / lub widzisz fragmenty dosłownego kodu źródłowego PHP na stronie internetowej, możesz być całkiem pewien, że twoje PHP nie zostanie w rzeczywistości wykonane. Jeśli używasz View Source w przeglądarce, prawdopodobnie widzisz cały plik kodu źródłowego PHP w takiej postaci, w jakiej jest. Ponieważ kod PHP jest osadzony w
<?php ?>
znacznikach, przeglądarka spróbuje zinterpretować je jako znaczniki HTML, a wynik może wyglądać na nieco zagmatwany.Aby faktycznie uruchomić skrypty PHP, potrzebujesz:
* O ile go nie zmienisz, wszystko można skonfigurować.
Ten ostatni jest szczególnie ważny. Dwukrotne kliknięcie pliku prawdopodobnie otworzy go w przeglądarce przy użyciu adresu takiego jak:
To całkowicie pomija każdy serwer WWW, który możesz mieć uruchomiony, a plik nie jest interpretowany. Musisz odwiedzić adres URL pliku na serwerze sieciowym, prawdopodobnie coś takiego:
Możesz również sprawdzić, czy używasz krótkich otwartych tagów
<?
zamiast,<?php
a Twoja konfiguracja PHP wyłączyła krótkie otwarte tagi.Zobacz także, że kod PHP nie jest wykonywany, zamiast tego kod wyświetla się na stronie
źródło
Ostrzeżenie: mysql_connect (): Odmowa dostępu dla użytkownika „nazwa” @ „host”
To ostrzeżenie pojawia się, gdy łączysz się z serwerem MySQL / MariaDB z niepoprawnymi lub brakującymi poświadczeniami (nazwa użytkownika / hasło). Więc zazwyczaj nie jest to problem z kodem, ale problem z konfiguracją serwera.
mysql_connect("localhost", "user", "pw")
Przykłady znajdują się na stronie instrukcji obsługi .Sprawdź, czy faktycznie użyłeś
$username
a$password
.(using password: NO)
.Tylko lokalny serwer testowy zazwyczaj pozwala połączyć się z nazwą użytkownika
root
, bez hasła itest
nazwą bazy danych.Możesz sprawdzić, czy są naprawdę poprawne, używając klienta wiersza poleceń:
mysql --user="username" --password="password" testdb
W nazwie użytkownika i haśle rozróżniana jest wielkość liter, a białe znaki nie są ignorowane. Jeśli twoje hasło zawiera takie meta znaki, jak
$
ucieczka lub umieść hasło w cudzysłowie .Większość współużytkowanych dostawców hostingu wstępnie określa konta mysql w stosunku do konta użytkownika unix (czasami tylko przedrostki lub dodatkowe przyrostki numeryczne). Zobacz dokumentację dla wzoru lub dokumentacji oraz CPanel lub inny interfejs do ustawiania hasła.
Zobacz podręcznik MySQL na temat dodawania kont użytkowników za pomocą wiersza poleceń. Po połączeniu jako administrator możesz wysłać zapytanie takie jak:
CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';
Lub użyj Adminer lub stole warsztatowym lub innego narzędzia graficzne do tworzenia, wyboru lub właściwy rachunek szczegóły.
Jeśli nie możesz naprawić swoich danych uwierzytelniających, prośba o pomoc w Internecie nie przyniesie efektu. Tylko Ty i Twój dostawca hostingu macie uprawnienia i wystarczający dostęp do diagnozowania i naprawy rzeczy.
Sprawdź, czy możesz połączyć się z serwerem bazy danych, używając nazwy hosta podanej przez dostawcę:
ping dbserver.hoster.example.net
Sprawdź to z konsoli SSH bezpośrednio na swoim serwerze internetowym. Testowanie z lokalnego klienta programistycznego na współużytkowanym serwerze hostingowym rzadko ma znaczenie.
Często po prostu chcesz, aby nazwa serwera była taka
"localhost"
, która zwykle wykorzystuje lokalne nazwane gniazdo, jeśli jest dostępne. Innym razem możesz spróbować"127.0.0.1"
jako rezerwowy.Jeśli Twój serwer MySQL / MariaDB nasłuchuje na innym porcie, użyj
"servername:3306"
.Jeśli to się nie powiedzie, być może występuje problem z zaporą ogniową. (Nie na temat, nie pytanie programistyczne. Brak możliwości zdalnej pomocy w zgadywaniu.)
Korzystając ze stałych, takich jak np.
DB_USER
LubDB_PASSWORD
, sprawdź, czy są one rzeczywiście zdefiniowane .Jeśli dostaniesz a
"Warning: Access defined for 'DB_USER'@'host'"
i a"Notice: use of undefined constant 'DB_PASS'"
, to twój problem.Sprawdź, czy twój eg
xy/db-config.php
został faktycznie uwzględniony i whatelse.Sprawdź, czy poprawnie ustawiono
GRANT
uprawnienia .Nie wystarczy mieć parę
username
+password
.Każde konto MySQL / MariaDB może mieć dołączony zestaw uprawnień.
Mogą one ograniczać, z którymi bazami danych możesz się łączyć, z którego klienta / serwera może pochodzić połączenie i które zapytania są dozwolone.
W „Odmowa dostępu” ostrzegając w ten sposób może również pokazać się na
mysql_query
rozmowy, jeśli nie masz uprawnień doSELECT
z tabeli określonej, lubINSERT
/UPDATE
i bardziej powszechnieDELETE
czegokolwiek.Możesz dostosować uprawnienia do konta po podłączeniu do klienta wiersza poleceń, używając konta administratora z zapytaniem:
GRANT ALL ON yourdb.* TO 'username'@'localhost';
Jeśli ostrzeżenie pojawi się jako pierwsze, oznacza
Warning: mysql_query(): Access denied for user ''@'localhost'
to, że możesz mieć wstępnie skonfigurowaną parę konta / hasła php.ini .Sprawdź to
mysql.default_user=
imysql.default_password=
miej znaczące wartości.Często jest to konfiguracja dostawcy. Skontaktuj się z ich wsparciem w sprawie niezgodności.
Znajdź dokumentację swojego dostawcy hostingu współdzielonego:
np HostGator , GoDaddy , 1and1 , DigitalOcean , BlueHost , DreamHost , MediaTemple , Ixwebhosting , lunarhosting , lub po prostu google yours'.
W przeciwnym razie skonsultuj się z dostawcą usług hostingowych za pośrednictwem kanałów wsparcia.
Pamiętaj, że być może wyczerpałeś dostępną pulę połączeń . Otrzymasz ostrzeżenia o odmowie dostępu dla zbyt wielu równoczesnych połączeń. (Musisz sprawdzić konfigurację. Jest to problem z konfiguracją serwera nie na temat, a nie pytanie programistyczne.)
Twoja wersja klienta libmysql może nie być kompatybilna z serwerem bazy danych. Zazwyczaj serwery MySQL i MariaDB są dostępne przy pomocy PHP skompilowanego w sterowniku. Jeśli masz niestandardową konfigurację lub nieaktualną wersję PHP i znacznie nowszy serwer bazy danych lub znacznie nieaktualny - niezgodność wersji może uniemożliwić połączenia. (Nie, musisz sam to sprawdzić. Nikt nie zgadnie twojej konfiguracji).
Więcej referencji:
źródło
Uwaga: Konwersja tablic na łańcuchy
Dzieje się tak po prostu, jeśli próbujesz traktować tablicę jako ciąg:
Tablicy nie można po prostu łączyć
echo
ani łączyć z łańcuchem, ponieważ wynik nie jest dobrze zdefiniowany. PHP użyje ciągu „Array” zamiast tablicy i spowoduje wyświetlenie powiadomienia, że prawdopodobnie nie jest to zamierzone i że powinieneś sprawdzić tutaj swój kod. Prawdopodobnie chcesz coś takiego:Lub zapętlić tablicę:
Jeśli to powiadomienie pojawi się w miejscu, którego się nie spodziewasz, oznacza to, że zmienna, którą uważałeś za łańcuch, jest w rzeczywistości tablicą. Oznacza to, że masz błąd w kodzie, który sprawia, że ta zmienna jest tablicą zamiast oczekiwanego ciągu.
źródło
Ostrzeżenie: dzielenie przez zero
Komunikat ostrzegawczy „Dzielenie przez zero” jest jednym z najczęściej zadawanych pytań wśród nowych programistów PHP. Ten błąd nie spowoduje wyjątku, dlatego niektórzy programiści czasami odsuwają ostrzeżenie, dodając operator tłumienia błędów @ przed wyrażeniem. Na przykład:
Ale, jak w przypadku każdego ostrzeżenia, najlepszym rozwiązaniem byłoby wyśledzenie przyczyny ostrzeżenia i rozwiązanie go. Przyczyna ostrzeżenia będzie pochodzić z każdego przypadku, w którym spróbujesz podzielić przez 0, zmienną równą 0 lub zmienną, która nie została przypisana (ponieważ NULL == 0), ponieważ wynik będzie „niezdefiniowany”.
Aby skorygować to ostrzeżenie, należy przepisać wyrażenie, aby sprawdzić, czy wartość nie jest równa 0, jeśli tak, zrób coś innego. Jeśli wartość wynosi zero, albo nie należy dzielić, albo należy zmienić wartość na 1, a następnie dzielić, aby podział był równoważny podzieleniu tylko przez dodatkową zmienną.
Powiązane pytania:
źródło
$var1
= = 0, możesz po prostu ustawić$var3
na$var2
. Nawet jeśli tego nie zrobisz, reszta nie jest wcale potrzebna, ponieważ przydział jest taki sam w obu przypadkach, więc nie ma nic innego i przypisuj pozaif
Ścisłe standardy: metoda niestatyczna [<klasa> :: <metoda>] nie powinna być wywoływana statycznie
Występuje, gdy próbujesz wywołać metodę niestatyczną na klasie, ponieważ była ona statyczna, i masz również
E_STRICT
flagę w swoimerror_reporting()
ustawieniach.Przykład:
HTML::br()
lub$html::br()
Rzeczywiście można uniknąć tego błędu, nie dodając
E_STRICT
doerror_reporting()
, na przykładponieważ jak dla PHP 5.4.0 i wyżej,
E_STRICT
jest zawarty wE_ALL
[ ref ]. Ale to nie jest zalecane. Rozwiązaniem jest zdefiniowanie zamierzonej funkcji statycznej jako rzeczywistejstatic
:lub wywołać funkcję konwencjonalnie:
Powiązane pytania :
źródło
Przestarzałe: Składnia dostępu do macierzy i przesunięcia łańcucha w nawiasach klamrowych jest przestarzała
{}
Przesunięcia ciągów i elementy tablicy mogą być dostępne przez nawiasy klamrowe przed PHP 7.4.0:Jest to przestarzałe od PHP 7.4.0 i generuje ostrzeżenie:
Musisz użyć nawiasów kwadratowych,
[]
aby uzyskać dostęp do przesunięć ciągów i elementów tablicy:RFC tej zmiany linki do PHP skrypt , który próbuje naprawić to mechanicznie.
źródło