/ / Reference - Co ten błąd oznacza w PHP? - php, mysql, debugowanie, ostrzeżenia

Odniesienie - co oznacza ten błąd w PHP? - php, mysql, debugowanie, ostrzeżenia

Co to jest?

To jest wiele odpowiedzi na temat ostrzeżeń,błędy i uwagi, które możesz napotkać podczas programowania PHP i nie mają pojęcia, jak je naprawić. Jest to również Wiki społeczności, więc każdy jest zaproszony do wzięcia 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" często pojawiają się w Stack Overflow. Podstawowa przyczyna tych pytań jest zawsze taka sama. Odpowiedzi na te pytania zazwyczaj je powtarzają, a następnie pokazują OP, którą linię należy zmienić w swoim konkretnym przypadku. Odpowiedzi te nie dodają żadnej wartości do witryny, ponieważ odnoszą się tylko do określonego kodu OP. Inni użytkownicy, którzy mają ten sam błąd, nie mogą z łatwością odczytać rozwiązania, ponieważ są zbyt zlokalizowane. zrozumiał podstawową przyczynę, naprawienie błędu jest banalne, dlatego ta lista stara się wyjaśnić rozwiązanie w sposób ogólny.

Co powinienem tu zrobić?

Jeśli twoje pytanie zostało oznaczone jako duplikattego, znajdź poniżej swój komunikat o błędzie i zastosuj poprawkę do swojego kodu. Odpowiedzi zwykle zawierają dalsze linki do zbadania, na wypadek gdyby nie wynikało to wyłącznie z ogólnej odpowiedzi.

Jeśli chcesz wnieść swój wkład, dodaj swoje"ulubiony" komunikat o błędzie, ostrzeżenie lub komunikat, po jednym na odpowiedź, krótki opis, co to oznacza (nawet jeśli jest to tylko wyróżnienie terminów na stronie podręcznika), możliwe rozwiązanie lub metoda debugowania oraz lista istniejących pytań i odpowiedzi, które są wartościowe . Możesz również poprawić wszelkie istniejące odpowiedzi.

Lista

Zobacz także

Odpowiedzi:

226 dla odpowiedzi nr 1

Ostrzeżenie: Nie można zmodyfikować informacji w nagłówku - nagłówki zostały już wysłane

Dzieje się tak, gdy skrypt próbuje wysłać nagłówek HTTP do klienta, ale już wcześniej było 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 podobny do tego:

<html>
<?php session_start(); ?>
<head><title>My Page</title>
</html>
...

The session_start() Funkcja spróbuje wysłać nagłówki z plikiem cookie sesji do klienta. Ale PHP już wysłał nagłówki, kiedy to napisał <html> element do strumienia wyjściowego. Musisz przenieść session_start() na szczyt.

Możesz rozwiązać ten problem, przechodząc przez linie przed kod wyzwalający Ostrzeżenie i sprawdzający, gdzie powstaje. Przenieś dowolny kod wysyłania nagłówka przed tym kodem.

Często pomijanym wyjściem są nowe linie po zamknięciu PHP ?>. Uważa się za standardową praktykę pominięcie ?> kiedy jest ostatnią rzeczą w pliku. Podobnie, inną częstą przyczyną tego ostrzeżenia jest otwarcie <?php ma przed sobą pustą spację, linię lub niewidoczną postać, co powoduje, że serwer WWW wysyła nagłówki i białą / nową linię, więc kiedy PHP rozpocznie parsowanie, nie będzie mógł przesłać żadnego nagłówka.

Jeśli twój plik ma więcej niż jeden <?php ... ?> blok kodu w nim, nie powinno być żadnych spacji pomiędzy nimi. (Uwaga: możesz mieć wiele bloków, jeśli masz kod, który został automatycznie skonstruowany)

Upewnij się także, że w kodzie nie ma żadnych znaków Byte Order Marks, na przykład, gdy kodowanie skryptu jest utf-8 z BOM.

Powiązane pytania:


157 dla odpowiedzi nr 2

Błąd krytyczny: wywołanie funkcji członkowskiej ... na obiekcie niebędącym obiektem

Zdarza się z kodem podobnym do xyz->method() gdzie xyz nie jest przedmiotem, a zatem tym method nie można nazwać.

Jest to błąd krytyczny, który zatrzyma skrypt (powiadomienie o kompatybilności do przodu: stanie się możliwym do złapania błędem, zaczynając od PHP 7).

Najczęściej jest to znak, że kod nie zawiera sprawdzeń pod kątem błędów. Sprawdź, czy obiekt jest faktycznie obiektem przed wywołaniem jego metod.

ZA typowy przykład byłby

// ... some code using PDO
$statement = $pdo->prepare("invalid query", ...);
$statement->execute(...);

W powyższym przykładzie zapytanie nie może zostać przygotowane i prepare() przypisze false do $statement. Próbuję zadzwonić do execute() Metoda spowoduje błąd krytyczny, ponieważ false jest "nieobiektowy", ponieważ wartość jest wartością logiczną.

Rozwiązać czemu twoja funkcja zwróciła wartość boolowską zamiast obiektu. Na przykład sprawdź $pdo obiekt dla ostatniego błędu, który wystąpił. Szczegóły dotyczące debugowania będą zależeć od sposobu obsługi błędów dla konkretnej funkcji / obiektu / klasy.

Jeśli nawet ->prepare zawodzi wtedy twój $pdo obiekt obsługi bazy danych nie przeszedł do obecnego zakresu. Znajdź, gdzie zostało zdefiniowane. Następnie przekazuj go jako parametr, przechowuj jako właściwość lub udostępniaj go w zasięgu globalnym.

Innym problemem może być warunkowe tworzenie obiektu, a następnie próba wywołania metody poza tym blokiem warunkowym. Na przykład

if ($someCondition) {
$myObj = new MyObj();
}
// ...
$myObj->someMethod();

Podejmując próbę wykonania metody poza blokiem warunkowym, twój obiekt może nie zostać zdefiniowany.

Powiązane pytania:


102 za odpowiedź nr 3

Nic nie jest widoczne. 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ładni).

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 lokalizacji centralnej (np. /var/log/apache2 w wielu środowiskach Linux) lub w katalogu samego skryptu (czasem używanego we wspólnym środowisku hostingowym).

Czasami może to być bardziej prostetymczasowo włączyć wyświetlanie błędów. Biała strona wyświetli komunikat o błędzie. Uważaj, ponieważ te błędy są widoczne dla wszystkich odwiedzających witrynę.

Można to łatwo zrobić, dodając u góry skryptu następujący kod PHP:

ini_set("display_errors", 1); error_reporting(~0);

Kod włącza wyświetlanie błędów i ustawia raportowanie na najwyższy poziom.

Od ini_set() jest wykonywany w czasie wykonywania, nie ma wpływu na błędy parsowania / składni. Te błędy pojawią się w dzienniku. Jeśli chcesz wyświetlać je również w wynikach (np. W przeglądarce), musisz ustawić display_startup_errors dyrektywa do true. Zrób to albo w php.ini lub w .htaccess lub przez dowolna inna metoda wpływająca na konfigurację przed środowisko wykonawcze.

Możesz użyć tych samych metod, aby ustawić log_errors i error_log dyrektywy, aby wybrać własną lokalizację pliku dziennika.

Patrząc w dzienniku lub używając wyświetlacza, otrzymasz znacznie lepszy komunikat o błędzie i linię kodu, w której zatrzyma się twój skrypt.

Powiązane pytania:

Powiązane błędy:


90 dla odpowiedzi № 4

Uwaga: niezdefiniowany indeks

Dzieje się tak, gdy próbujesz uzyskać dostęp do tablicy za pomocą klucza, który nie istnieje w tablicy.

Typowy przykład dla Undefined Index zawiadomienie będzie (próbny)

$data = array("foo" => "42", "bar");
echo $data["spinach"];
echo $data[1];

Obie spinach i 1 nie istnieją w tablicy, powodując E_NOTICE być wyzwalane.

Rozwiązaniem jest upewnienie się, że indeks lub offsetistnieje przed uzyskaniem dostępu do tego indeksu. Może to oznaczać, że musisz naprawić błąd w swoim programie, aby upewnić się, że indeksy istnieją, kiedy tego oczekujesz. Lub może to oznaczać, że musisz sprawdzić, czy istnieją indeksy array_key_exists lub isset:

$data = array("foo" => "42", "bar");
if (array_key_exists("spinach", $data)) {
echo $data["spinach"];
}
else {
echo "No key spinach in array";
}

Jeśli masz kod taki jak:

<?php echo $_POST["message"]; ?>
<form method="post" action="">
<input type="text" name="message">
...

następnie $_POST["message"] nie zostanie ustawione po załadowaniu tej stronyi otrzymasz powyższy błąd. Tylko wtedy, gdy formularz zostanie przesłany i ten kod zostanie uruchomiony po raz drugi, będzie istniał indeks tablicy. Zazwyczaj sprawdza się to za pomocą:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER["REQUEST_METHOD"] == "POST") ..  // page was requested with POST

Powiązane pytania:


76 dla odpowiedzi № 5

Ostrzeżenie: mysql_fetch_array () oczekuje, że parametr 1 będzie zasób, boolean given

Po pierwsze i najważniejsze:

Proszę, nie używaj mysql_* funkcje w nowym kodzie. Nie są już utrzymywane i są oficjalnie przestarzałe. Zobacz czerwone pudełko? Uczyć się o przygotowane oświadczenia zamiast tego i użyj CHNP lub MySQLi - Ten artykuł pomoże ci zdecydować, które. Jeśli wybierzesz CHNP, oto dobry samouczek.


Dzieje się tak, gdy próbujesz pobrać dane z wyniku mysql_query ale zapytanie nie powiodło się.

To jest ostrzeżenie i nie powstrzyma skryptu, ale spowoduje, że twój program będzie źle.

Musisz sprawdzić wynik zwracany przez mysql_query przez

$res = mysql_query($sql);
if (!$res) {
die(mysql_error());
}
// after checking, do the fetch

Powiązane pytania:

Powiązane błędy:

Inny mysql* funkcje, które również oczekują wyniku mysql jako parametru, spowoduje ten sam błąd z tego samego powodu.


70 dla odpowiedzi № 6

Błąd krytyczny: użycie $ this, gdy nie znajduje się w kontekście obiektu

$this jest specjalną zmienną w PHP których nie można przypisać. Jeśli jest dostępny w kontekście, w którym nie istnieje, podawany jest ten błąd krytyczny.

Ten błąd może wystąpić:

  1. Jeśli niestatyczna metoda nazywana jest statycznie. Przykład:

    class Foo {
    protected $var;
    public function __construct($var) {
    $this->var = $var;
    }
    
    public static function bar () {
    // ^^^^^^
    echo $this->var;
    //   ^^^^^
    }
    }
    
    Foo::bar();
    

    Jak naprawić: ponownie sprawdź swój kod, $this może być użyty tylko w kontekście obiektowym i nigdy nie powinien być używany w metodzie statycznej. Ponadto metoda statyczna nie powinna uzyskiwać dostępu do właściwości niestatycznych. Posługiwać się self::$static_property aby uzyskać dostęp do właściwości statycznej.

  2. Jeśli kod z metody klasy został skopiowany do normalnej funkcji lub tylko zakresu globalnego i utrzymanie $this specjalna zmienna.
    Jak naprawić: Przejrzyj kod i zastąp $this z inną zmienną podstawienia.

Powiązane pytania:

  1. Wywołanie metody statycznej niestatyczną: PHP Błąd krytyczny: Używanie $ this, gdy nie w kontekście obiektu
  2. Skopiuj kod: Błąd krytyczny: użycie $ this, gdy nie znajduje się w kontekście obiektu
  3. Wszystkie "Używanie $ this, gdy nie w kontekście obiektu" Pytania dotyczące Stackoverflow

67 dla odpowiedzi № 7

Błąd krytyczny: wywołanie niezdefiniowanej funkcji XXX

Zdarza się, gdy próbujesz wywołać funkcję, która jestjeszcze nie zdefiniowane. Typowe przyczyny to brakujące rozszerzenia i obejmuje, deklaracja funkcji warunkowych, funkcja w deklaracji funkcji lub proste literówki.

Przykład 1 - Deklaracja funkcji warunkowych

$someCondition = false;
if ($someCondition === true) {
function fn() {
return 1;
}
}
echo fn(); // triggers error

W tym przypadku, fn() nigdy nie zostanie zadeklarowany, ponieważ $someCondition to nie jest prawda.

Przykład 2 - Funkcja w deklaracji funkcji

function createFn()
{
function fn() {
return 1;
}
}
echo fn(); // triggers error

W tym przypadku, fn zostanie zadeklarowane tylko raz createFn() zostaje wywołany. Pamiętaj, że kolejne połączenia z createFn() wywoła błąd o Redeclaration of Existing function.

Możesz również zobaczyć to dla wbudowanej funkcji PHP. Spróbuj wyszukać tę funkcję oficjalny podręczniki sprawdź, do czego "rozszerzenie" (moduł PHP) należy i jakie wersje PHP go obsługują.

W przypadku brakującego rozszerzenia zainstaluj torozszerzenie i włącz go w php.ini. Zapoznaj się z Instrukcjami instalacji w Podręczniku PHP dla rozszerzenia, w którym pojawia się twoja funkcja. Możesz 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 panelu kontrolnym we wspólnym środowisku hostingowym.

Jeśli funkcja została wprowadzona w nowszej wersjiPHP z tego, czego używasz, możesz znaleźć linki do alternatywnych implementacji w podręczniku lub w sekcji komentarzy. Jeśli został usunięty z PHP, poszukaj informacji o tym, dlaczego, ponieważ może nie być już konieczne.

W przypadku braku załączników, pamiętaj o dołączeniu pliku deklarującego funkcję przed wywołaniem funkcji.

W przypadku literówek, popraw literówkę.

Powiązane pytania:


66 dla odpowiedzi № 8

Błąd składni: błąd składni, nieoczekiwany T_XXX

Dzieje się, gdy masz T_XXX znak w nieoczekiwanym miejscu, niezbalansowane (niepotrzebne) nawiasy, użycie krótkiego tagu bez aktywacji go w php.ini i wiele innych.

Powiązane pytania:

Aby uzyskać dalszą pomoc, patrz:


61 dla odpowiedzi № 9

Błąd krytyczny: Nie można użyć wartości zwracanej przez funkcję w kontekście zapisu

Zwykle dzieje się tak, gdy używa się funkcji bezpośrednio z empty.

Przykład:

if (empty(is_null(null))) {
echo "empty";
}

To dlatego, że empty jest konstruktem języka, a nie funkcją, nie można go wywołać z wyrażeniem jako jego argumentem w wersjach PHP przed 5.5. Przed PHP 5.5 argumentem jest empty() musi być zmienna, ale dowolne wyrażenie (takie jak wartość zwracana przez funkcję) jest dopuszczalne w PHP 5.5+.

empty, pomimo swojej nazwy, w rzeczywistości nie sprawdza, czy zmienna jest "pusta". Zamiast tego sprawdza, czy zmienna nie istnieje, lub == false. Wyrażenia (np is_null(null) w tym przykładzie) zawsze będzie istnieć, więc tutaj empty sprawdza tylko, czy jest równa false. Możesz wymienić empty() tutaj z !, np. if (!is_null(null))lub jawnie porównać do fałszu, np. if (is_null(null) == false).

Powiązane pytania:


57 dla odpowiedzi № 10

MySQL: Masz błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu ... w linii ...

Ten błąd jest często spowodowany tym, że zapomniałeś poprawnie wymazać dane przekazane do zapytania MySQL.

Przykład tego, co nie do zrobienia ("Zły pomysł"):

$query = "UPDATE `posts` SET my_text="{$_POST["text"]}" WHERE id={$_GET["id"]}";
mysqli_query($db, $query);

Ten kod może zostać zawarty na stronie z formularzem do przesłania, z adresem URL takim jak http://example.com/edit.php?id=10 (aby edytować wpis nr 10)

Co się stanie, jeśli nadesłany tekst zawiera pojedyncze cytaty? $query zakończy się:

$query = "UPDATE `posts` SET my_text="I"m a PHP newbie" WHERE id=10";

A kiedy zapytanie zostanie wysłane do MySQL, będzie narzekać, że składnia jest błędna, ponieważ w środku znajduje się dodatkowy pojedynczy cytat.

Aby uniknąć takich błędów, ty MUSI zawsze unikaj danych przed użyciem w zapytaniu.

Wyjątkiem jest także ucieczka danych przed użyciem w zapytaniu SQLbardzo ważne, ponieważ jeśli nie, twój skrypt będzie otwarty na iniekcje SQL.Injection SQL może spowodować zmianę, utratę lub modyfikację rekordu, tabeli lub całej bazy danych. Jest to bardzo poważny problem bezpieczeństwa!

Dokumentacja:


49 dla odpowiedzi № 11

Błąd krytyczny: Dozwolony rozmiar pamięci wynoszący XXX bajtów wyczerpał się (próbowano przydzielić XXX bajtów)

Brak wystarczającej ilości pamięci do uruchomienia skryptu. PHP osiągnął limit pamięci i przestaje go wykonywać. Ten błąd jest krytyczny, skrypt zatrzymuje się. Wartość ograniczenie pamięci można skonfigurować w php.ini plik lub za pomocą ini_set("memory_limit", "128 M"); w skrypcie (który nadpisze wartość zdefiniowaną w php.ini). Celem limitu pamięci jest zapobieganie gobblingowi całej dostępnej pamięci przez cały pojedynczy skrypt PHP i opuszczenie całego serwera WWW.

Pierwszą rzeczą do zrobienia jest zminimalizowanie kwotypamięci, której potrzebuje twój skrypt. Na przykład, jeśli czytasz duży plik w 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 odczytać wiersz pliku po linii lub pobierać rekordy bazy danych po jednym na raz, nie przechowując ich wszystkich w pamięci, co wymaga nieco konceptualnej świadomości tego, co dzieje się za kulisami, a dane są przechowywane w pamięci i gdzie indziej.

Jeśli ten błąd wystąpił, gdy skrypt nie zajmował dużej ilości pamięci, musisz sprawdzić swój kod, aby sprawdzić, czy nie ma wycieku pamięci. The memory_get_usage funkcja jest twoim przyjacielem.

Powiązane pytania:


45 za odpowiedź № 12

Błąd składni: błąd składni, nieoczekiwany T_ENCAPSED_AND_WHITESPACE

Ten błąd jest najczęściej napotykany podczas próby odniesienia wartości tablicy za pomocą zacytowany klucz do interpolacji wewnątrz łańcucha podwójnie cytowanego, gdy cała złożona konstrukcja zmienna nie jest zamknięta {}.

Przypadek błędu:

Spowoduje to Unexpected T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array["key"]";
//---------------------------------------------------------------------^^^^^

Możliwe poprawki:

W łańcuchu o podwójnym cudzysłowiu PHP zezwala na użycie łańcuchów kluczy tablicowych niecytowanei nie wyda E_NOTICE. Tak więc powyższe może być napisane jako:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

Całą złożoną zmienną tablicy i klucz (klucze) można dołączyć do {}, w takim razie oni powinien być cytowane, aby uniknąć E_NOTICE. Dokumentacja PHP zaleca tę składnię dla zmiennych złożonych.

echo "This is a double-quoted string with a quoted array key in {$array["key"]}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array["key"]}";

Oczywiście alternatywa dla każdy z powyższego jest łączenie zmiennej tablicowej zamiast interpolowania jej:

echo "This is a double-quoted string with an array variable " . $array["key"] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

Aby zapoznać się z informacjami, zobacz sekcję na temat Variable Parsing w strona podręcznika PHP Struny


39 dla odpowiedzi № 13

Błąd analizy: błąd składni, nieoczekiwany T_PAAMAYIM_NEKUDOTAYIM

Operator rozdzielczości jest również nazywany "Paamayim Nekudotayim" z hebrajskiego פעמיים נקודתיים. co oznacza "podwójny dwukropek" lub "podwójna kropka dwa razy".

Ten błąd zazwyczaj występuje, jeśli przypadkowo go wprowadzisz :: w twoim kodzie.

Powiązane pytania:

Dokumentacja:


37 dla odpowiedzi № 14

Błąd krytyczny: nie można redeclare class [Nazwa klasy]

Błąd krytyczny: nie można redeclare [nazwa funkcji]

Oznacza to, że używasz tej samej nazwy funkcji / klasy dwa razy i musisz zmienić nazwę jednego z nich lub dlatego, że użyłeś require lub include gdzie powinieneś używać require_once lub include_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

<?php

class MyClass
{
public function doSomething()
{
// do stuff here
}
}

index.php

<?php

function do_stuff()
{
require "class.php";
$obj = new MyClass;
$obj->doSomething();
}

do_stuff();
do_stuff();

Drugie połączenie z do_stuff() spowoduje błąd powyżej. Poprzez zmiane require do require_once, możemy być pewni, że plik zawierający definicję MyClass zostanie załadowany tylko raz, a błąd będzie unikany.


37 dla odpowiedzi № 15

Ostrzeżenie: [funkcjonować]: nie udało się otworzyć strumienia: [powód]

Zdarza się, gdy wywołujesz plik zwykle przez include, require lub fopen a PHP nie może znaleźć pliku lub nie ma wystarczających uprawnień do załadowania pliku.

Może się tak zdarzyć z różnych powodów:

  • ścieżka pliku jest nieprawidłowa
  • ścieżka pliku jest względna
  • ścieżka jest błędna
  • uprawnienia są zbyt restrykcyjne
  • SELinux jest w mocy
  • i wiele więcej ...

Jednym powszechnym błędem jest niestosowanie bezwzględnej ścieżki. Można to łatwo rozwiązać za pomocą pełnej ścieżki lub magiczne stałe lubić __DIR__ lub dirname(__FILE__):

include __DIR__ . "/inc/globals.inc.php";

lub:

require dirname(__FILE__) . "/inc/globals.inc.php";

Zapewnienie prawidłowej ścieżki jest jednym krokiemrozwiązywanie 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 otwartymi ograniczeniami bazującymi na samym PHP.

Najlepszym sposobem szybkiego rozwiązania tego problemu jest wykonanie poniższej listy kontrolnej rozwiązywania problemów.

Powiązane pytania:

Powiązane błędy:


36 dla odpowiedzi № 16

Uwaga: Niezdefiniowana zmienna

Dzieje się tak, gdy próbujesz użyć zmiennej, która nie została wcześniej zdefiniowana.

Typowy przykład

foreach ($items as $item) {
// do something with item
$counter++;
}

Jeśli nie zdefiniowałeś $counter wcześniej powyższy kod wywoła powiadomienie.

Prawidłowym sposobem byłoby ustawienie zmiennej przed jej użyciem, nawet jeśli jest to po prostu pusty ciąg znaków, jak

$counter = 0;
foreach ($items as $item) {
// do something with item
$counter++;
}

Powiązane pytania:


35 dla odpowiedzi № 17

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 - założono "XXX" (spowoduje to błąd w przyszłej wersji PHP)

To powiadomienie występuje, gdy w kodzie wykorzystywany jest token i wydaje się być stałą, ale stała o tej nazwie nie jest zdefiniowana.

Jedną z najczęstszych przyczyn tego powiadomienia jest niepowodzenie w cytowaniu ciągu znaków używanego jako klucz tablicy asocjacyjnej.

Na przykład:

// Wrong
echo $array[key];

// Right
echo $array["key"];

Inną częstą przyczyną jest brak $ (dolar) przed nazwą zmiennej:

// Wrong
echo varName;

// Right
echo $varName;

A może masz błędnie napisaną inną stałą lub słowo kluczowe:

// Wrong
$foo = fasle;

// Right
$foo = false;

Może to być również znak, że brakuje potrzebnego rozszerzenia lub biblioteki PHP podczas próby uzyskania dostępu do stałej zdefiniowanej przez tę bibliotekę.

Powiązane pytania:


28 dla odpowiedzi № 18

Ostrzeż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 przed problemem konfiguracji.

Kiedy się pojawi, oznacza to, że dostęp do niektórych plików jest zabroniony.

Samo ostrzeżenie nie niszczy niczego, ale najczęściej skrypt nie działa poprawnie, jeśli dostęp do pliku jest uniemożliwiony.

Poprawka zazwyczaj zmienia nazwę Konfiguracja PHP, powiązane ustawienie zostanie wywołane open_basedir.

Czasem używane są nieprawidłowe nazwy plików lub katalogów, dlatego poprawka polega na użyciu właściwych.

Powiązane pytania:


28 dla odpowiedzi № 19

Uwaga: Niezainicjowane przesunięcie łańcucha: *

Jak wskazuje nazwa, tego typu błąd występuje, gdy najprawdopodobniej próbuje się iterować, lub znaleźć wartość z tablicy za pomocą nieistniejącego klucza.

Zastanów się, próbujesz pokazać każdą literę od $string

$string = "ABCD";
for ($i=0, $len = strlen($string); $i <= $len; $i++){
echo "$string[$i] n";
}

Powyższy przykład wygeneruje (wersja online):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

I tak szybko, jak skrypt kończy się echem D dostaniesz błąd, ponieważ w środku for() w pętli, powiedziałeś PHP, żeby pokazał ci od pierwszej do piątej ciąg znaków od "ABCD" Który istnieje, ale od kiedy zaczyna się liczyć pętla 0 i echa D zanim dotrze do 4, wyświetli błąd przesunięcia.

Podobne błędy:


27 dla odpowiedzi № 20

Błąd składni: błąd składni, nieoczekiwany błąd T_VARIABLE

Możliwy scenariusz

Nie mogę znaleźć, gdzie mój kod się nie udał. Oto mój pełny błąd:

Błąd składni: błąd składni, nieoczekiwany T_VARIABLE w linii x

Co próbuję

$sql = "SELECT * FROM dealer WHERE id=""$id.""";

Odpowiedź

Błąd przetwarzania: Problem ze składnią Twojego programu, np. Pozostawienie średnika poza końcem instrukcji lub, tak jak w powyższym przypadku, brakujące . operator. Tłumacz przestaje uruchamiać twój program, gdy napotka błąd parsowania.

W prostych słowach jest to błąd składniowy, co oznacza, że ​​w kodzie jest coś, co powoduje, że nie jest poprawnie przetwarzany i dlatego działa.

Co powinieneś zrobić należy dokładnie sprawdzić na liniach, w których błąd dotyczy prostych błędów.

Ten komunikat o błędzie oznacza, że ​​w linii x pliku interpreter PHP spodziewał się zobaczyć otwarty nawias, ale zamiast tego napotkał coś, co nazywa się T_VARIABLE. Że T_VARIABLE rzecz nazywa się token. Jest to sposób wyrażania interpretera PHPróżne podstawowe części programów. Kiedy interpreter czyta w programie, tłumaczy to, co napisałeś na listę tokenów. Gdziekolwiek umieścisz zmienną w swoim programie, pojawia sięT_VARIABLE token na liście tłumacza.

Dobrze się czyta: Lista tokenów parsera

Więc upewnij się, że przynajmniej włączasz E_PARSE w Twoim php.ini. Błędy parsowania nie powinny występować w skryptach produkcyjnych.

Zawsze polecam dodać następującą instrukcję, podczas gdy kodowanie:

error_reporting(E_ALL);

Raportowanie błędów PHP

Dobrym pomysłem jest również użycie IDE, które pozwoli ci poznać błędy parsowania podczas pisania. Możesz użyć:

  1. NetBeans (piękny spokój, wolne oprogramowanie) (najlepsze według mnie)
  2. PhpStorm (wujek Gordon uwielbia to: P, płatny plan, zawiera własne i darmowe oprogramowanie)
  3. Zaćmienie (piękno i bestia, wolne oprogramowanie)

Powiązane pytania:


25 dla odpowiedzi № 21

Błąd analizy: błąd składni, nieoczekiwany "["

Ten błąd występuje w dwóch odmianach:

Wariacja 1

$arr = [1, 2, 3];

Ta składnia inicjatora macierzy została wprowadzona tylko w PHP 5.4; spowoduje to zwiększenie błędu analizatora składni w poprzednich wersjach. Jeśli to możliwe, zaktualizuj instalację lub użyj starej składni:

$arr = array(1, 2, 3);

Zobacz też ten przykład z instrukcji.

Wariacja 2

$suffix = explode(",", "foo,bar")[1];

Wyniki funkcji dereferencji macierzy zostały również wprowadzone w PHP 5.4. Jeśli nie można dokonać aktualizacji, należy użyć zmiennej (tymczasowej):

$parts = explode(",", "foo,bar");
$suffix = $parts[1];

Zobacz też ten przykład z instrukcji.


23 dla odpowiedzi № 22

Uwaga: Próba uzyskania właściwości błędu nieobiektowego

Zdarza się, gdy próbujesz uzyskać dostęp do właściwości obiektu, gdy nie ma obiektu.

Typowym przykładem zawiadomienia o nieobiektowym byłoby

$users = json_decode("[{"name": "hakre"}]");
echo $users->name; # Notice: Trying to get property of non-object

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: niezdefiniowany indeks).

Ten przykład jest znacznie uproszczony. Najczęściej takie powiadomienie sygnalizuje niesprawdzoną wartość zwrotną, np. po powrocie biblioteki NULL jeśli obiekt nie istnieje lub po prostunieoczekiwana wartość nieobiektowa (na przykład w wyniku Xpath, strukturach JSON o nieoczekiwanym formacie, XML z nieoczekiwanym formatem itp.), ale kod nie sprawdza takiego warunku.

Ponieważ te obiekty nie są często przetwarzane dalej, często występuje błąd krytyczny przy wywoływaniu metody obiektowej na obiekcie innym niż obiekt (patrz: Błąd krytyczny: wywołanie funkcji członkowskiej ... na obiekcie niebędącym obiektem) zatrzymanie skryptu.

Można temu zapobiec, sprawdzając warunki błędu i / lub czy zmienna odpowiada oczekiwaniom. Tutaj takie ogłoszenie z DOMXPath przykład:

$result  = $xpath->query("//*[@id="detail-sections"]/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Problem polega na dostępie do nodeValue właściwość (pole) pierwszej pozycji, która nie została sprawdzona, jeśli istnieje, lub nie znajduje się w $result kolekcja. Zamiast tego warto uściślić kod, przypisując zmienne do obiektów, na których działa kod:

$result  = $xpath->query("//*[@id="detail-sections"]/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if ($div) {
$divText = $div->nodeValue;
}
echo $divText;

Powiązane błędy:


22 dla odpowiedzi № 23

Ostrzeżenie: [funkcjonować] oczekuje, że parametr 1 będzie zasób, boolean given

(Bardziej ogólna odmiana Ostrzeżenie: mysql_fetch_array () oczekuje, że parametr 1 będzie zasób, boolean given)

Zasoby to rodzaj w PHP (jak ciągi, liczby całkowite lub obiekty). Zasobem jest nieprzezroczysty obszar typu blob, który nie ma własnej istotnej wartości. Zasób jest specyficzny i określony przez pewien zestaw funkcji PHP lub rozszerzenia. Na przykład rozszerzenie Mysql definiuje dwa typy zasobów:

W module MySQL są używane dwa typy zasobów. Pierwszy to identyfikator łącza dla połączenia z bazą danych, drugi to zasób, który przechowuje wynik zapytania.

Rozszerzenie cURL definiuje inne dwa typy zasobów:

... uchwyt cURL i uchwyt multi cURL.

Gdy var_dumped, wartości wyglądają tak:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

To jest większość zasobów, numeryczny identyfikator ((1)) określonego typu ((curl)).

Nosisz te zasoby i przekazujesz jeróżne funkcje, dla których taki zasób coś znaczy. Zwykle te funkcje przydzielają pewne dane w tle, a zasób jest jedynie odniesieniem, którego używają do wewnętrznego śledzenia tych danych.


"... oczekuje, że parametr 1 będzie zasobem, boolean given"błąd jest zazwyczaj wynikiem niezaznaczonej operacji, która miała utworzyć zasób, ale zwrócona false zamiast. Na przykład fopen funkcjonować ma ten opis:

Zwróć wartości

Zwraca zasób wskaźnika pliku po pomyślnym zakończeniu, lub FALSE w przypadku błędu.

W tym kodzie $fp będzie albo resource(x) of type (stream) lub false:

$fp = fopen(...);

Jeśli nie sprawdzasz, czy fopen operacja zakończyła się sukcesem lub zakończyła się niepowodzeniem, a tym $fp jest prawidłowym zasobem lub false i zdać $fp do innej funkcji, która oczekuje zasobu, możesz otrzymać powyższy błąd:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

Zawsze musisz sprawdzić wartość zwracaną przez funkcje, które próbują przydzielić zasoby i może zawieść:

$fp = fopen(...);

if (!$fp) {
trigger_error("Failed to allocate resource");
exit;
}

$data = fread($fp, 1024);

Powiązane błędy:


18 za odpowiedź № 24

Ostrzeżenie: niedozwolone przesunięcie łańcucha znaków "XXX"

Dzieje się tak, gdy próbujesz uzyskać dostęp do elementu tablicy za pomocą składni nawias kwadratowy, ale robisz to na ciąg, a nie na tablicy, więc operacja wyraźnie nie ma sensu.

Przykład:

$var = "test";
echo $var["a_key"];

Jeśli uważasz, że zmienna powinna być tablicą, sprawdź, skąd pochodzi i napraw problem.


17 dla odpowiedzi № 25

Kod nie uruchamia się / wygląda na to, że część mojego kodu PHP jest wyprowadzana

Jeśli nie widzisz wyniku z twojego kodu PHPW jaki sposób i / lub widzisz części swojego dosłownego kodu źródłowego PHP na stronie internetowej, możesz być całkiem pewien, że twój PHP nie zostanie faktycznie wykonany. Jeśli używasz View Source w przeglądarce, prawdopodobnie widzisz całość Plik kodu źródłowego PHP, jaki jest. Ponieważ kod PHP jest osadzony w <?php ?> tagi, przeglądarka spróbuje zinterpretować je jako tagi HTML, a wynik może wydawać się nieco zagmatwany.

Aby faktycznie uruchomić swoje skrypty PHP, potrzebujesz:

  • serwer WWW, który wykonuje twój skrypt
  • ustawić rozszerzenie pliku na .php, w przeciwnym razie serwer WWW nie będzie go interpretować jako takiego *
  • uzyskać dostęp do pliku .php za pośrednictwem serwera WWW

* O ile nie zmienisz konfiguracji, wszystko można skonfigurować.

Ta ostatnia jest szczególnie ważna. Po dwukrotnym kliknięciu pliku najprawdopodobniej zostanie otwarty w przeglądarce przy użyciu adresu takiego jak:

file://C:/path/to/my/file.php

To całkowicie pomija każdy serwer sieciowy, który możesz uruchomić, a plik nie jest interpretowany. Musisz odwiedzić adres URL pliku na swoim serwerze WWW, prawdopodobnie coś takiego:

http://localhost/my/file.php

Możesz również sprawdzić, czy używasz krótkich tagów otwartych <? zamiast <?php a twoja konfiguracja PHP zmieniła krótkie tagi otwarte.

Zobacz także Kod PHP nie jest wykonywany, zamiast tego kod wyświetla się na stronie


16 dla odpowiedzi № 26

Ostrzeżenie: mysql_connect (): Odmowa dostępu dla użytkownika "name" @ "host"

To ostrzeżenie pojawia się, gdy łączysz się z serwerem MySQL / MariaDB z nieprawidłowymi lub brakującymi danymi uwierzytelniającymi (nazwa użytkownika / hasło). Tak jest zazwyczaj nie problem z kodem, ale problem z konfiguracją serwera.

  • Zobacz stronę podręcznika na mysql_connect("localhost", "user", "pw") dla przykładów.

  • Sprawdź, czy faktycznie użyłeś a $username i $password.

    • Niezwykłe jest to, że uzyskujesz dostęp bez użycia hasła - co się stało, gdy Ostrzeżenie: powiedział (using password: NO).
    • Tylko lokalny serwer testowy zwykle pozwala na połączenie z nazwą użytkownika root, bez hasła i test nazwa bazy danych.

    • Możesz sprawdzić, czy są "re naprawdę poprawne przy użyciu klienta wiersza poleceń:
      mysql --user="username" --password="password" testdb

    • Nazwa użytkownika i hasło są wielkość liter i biała spacja nie ignorowane. Jeśli twoje hasło zawiera meta takie jak $, uciec z nich lub wprowadzić hasło pojedyncze cytaty.

    • Większość współdzielonych dostawców hostingu sprzedaje mysqlkonta w stosunku do konta użytkownika unix (czasami tylko przedrostki lub dodatkowe przyrostki liczbowe). Zobacz dokumentację dotyczącą wzoru lub dokumentacji oraz CPanel lub inny interfejs do ustawiania hasła.

    • Zobacz podręcznik MySQL Dodawanie kont użytkowników za pomocą wiersza poleceń. Po połączeniu jako użytkownik admin możesz wysłać zapytanie takie jak:
      CREATE USER "username"@"localhost" IDENTIFIED BY "newpassword";

    • Albo użyj Administrator lub Stoł warsztatowy lub dowolne inne narzędzie graficzne do tworzenia, sprawdzania lub poprawiania szczegółów konta.

    • Jeśli nie możesz poprawić swoich danych uwierzytelniających, wówczas prośba do Internetu o "proszę o pomoc" nie przyniesie efektu. Tylko Ty i Twój dostawca usług hostingowych masz uprawnienia i wystarczający dostęp do diagnozy i naprawy.

  • Sprawdź, czy Ty móc osiągnąć serwer bazy danych, używając nazwy hosta podanej przez dostawcę:
    ping dbserver.hoster.example.net

    • Sprawdź to w konsoli SSH bezpośrednio na swoim serwerze internetowym. Testowanie z lokalnego klienta programistycznego na współużytkowany serwer hostingowy rzadko ma znaczenie.

    • Często potrzebujesz tylko nazwy serwera "localhost", który zwykle używa lokalnego gniazda o nazwie, jeśli jest dostępny. Czasem możesz spróbować "127.0.0.1" jako awaryjne.

    • Jeśli twój serwer MySQL / MariaDB słucha na innym porcie, użyj "servername:3306".

    • Jeśli to się nie powiedzie, może to być problem z zaporą sieciową (nie dotyczy tematu, nie jest pytaniem programistycznym, nie jest możliwa zdalna pomoc w odgadywaniu).

  • Podczas używania stałe jak np. DB_USER lub DB_PASSWORD, sprawdź, czy rzeczywiście są określone.

    • Jeśli dostaniesz "Warning: Access defined for "DB_USER"@"host"" i a "Notice: use of undefined constant "DB_PASS"", to twój problem.

    • Sprawdź, czy np. xy/db-config.php było rzeczywiście zawarte i whatelse.

  • Sprawdź, czy poprawnie ustawione GRANT uprawnienia.

    • To nie wystarczy, aby mieć username+password para.

    • Każde konto MySQL / MariaDB może mieć dołączony zestaw uprawnień.

    • Mogą one ograniczać, które bazy danych są dozwolone, z których może pochodzić klient / serwer i jakie zapytania są dozwolone.

    • Ostrzeżenie "Odmowa dostępu" również może się pojawić mysql_query dzwoni, jeśli nie masz uprawnień SELECT z określonej tabeli lub INSERT/UPDATEi częściej DELETE byle co.

    • Możesz dostosuj uprawnienia konta po połączeniu za pomocą klienta wiersza poleceń za pomocą konto administratora z zapytaniem takim jak:
      GRANT ALL ON yourdb.* TO "username"@"localhost";

  • Jeśli ostrzeżenie pojawi się jako pierwsze Warning: mysql_query(): Access denied for user ""@"localhost" wtedy możesz mieć php.ini-prekonfigurowana para kont / hasło.

    • Sprawdź to mysql.default_user= i mysql.default_password= mieć wartości znaczące.

    • Często jest to konfiguracja dostawcy. Skontaktuj się więc ze wsparciem dla niedopasowania.

  • Znajdź dokumentację udostępnionego dostawcy hostingu:

  • Zauważ, że możesz również mieć wyczerpała dostępną pulę połączeń. Otrzymasz ostrzeżenia odmowy dostępu dla zbyt wielu jednoczesnych połączeń (musisz sprawdzić konfigurację, to jest problem konfiguracji serwera poza tematem, a nie pytanie programistyczne).

  • Twój klient libmysql Wersja może nie być zgodna z serwerem bazy danych. Zwykle do serwerów MySQL i MariaDB można dotrzeć za pomocą PHP skompilowanego w sterowniku. Jeśli masz niestandardową konfigurację lub przestarzałą wersję PHP i znacznie nowszy serwer bazy danych lub znacznie nieaktualny - to niezgodność wersji może uniemożliwić połączenia. (Nie, musisz zbadać siebie, nikt nie może odgadnąć twojej konfiguracji).

Więcej referencji:

Btw, prawdopodobnie nie chcesz tego użyć mysql_* funkcje już. Nowo przybyli często migrują do mysqli, co jednak jest równie uciążliwe. Zamiast tego czytaj dalej CHNP i przygotowane oświadczenia.
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


14 dla odpowiedzi № 27

Uwaga: Array do konwersji łańcuchowej

Dzieje się tak po prostu, jeśli próbujesz traktować tablicę jako ciąg znaków:

$arr = array("foo", "bar");

echo $arr;  // Notice: Array to string conversion
$str = "Something, " . $arr;  // Notice: Array to string conversion

Tablica nie może po prostu być echo"d lub konkatenowany z ciągiem, ponieważwynik nie jest dobrze zdefiniowany. PHP użyje napisu "Array" zamiast tablicy i zwróci uwagę, że to prawdopodobnie nie jest to, co było zamierzone, i że powinieneś sprawdzić kod tutaj.

echo $arr[0];  // displays foo
$str = "Something " . join(", ", $arr); //displays Something, foo, bar

Lub zapętl tablicę:

foreach($arr as $key => $value) {
echo "array $key = $value";
// displays first: array 0 = foo
// displays next:  array 1 = bar
}

Jeśli to ogłoszenie pojawi się gdzieś, nieoczekiwać, to znaczy, że zmienna, którą myślałeś, że jest łańcuchem, jest w rzeczywistości tablicą. Oznacza to, że masz błąd w kodzie, który sprawia, że ​​ta zmienna jest tablicą zamiast oczekiwanego łańcucha.


11 dla odpowiedzi № 28

Ostrzeżenie: dzielenie przez zero

Komunikat ostrzegawczy "Podział przez zero" jest jednym znajczęściej zadawane pytania wśród nowych programistów PHP. Ten błąd nie spowoduje wyjątku, dlatego niektórzy programiści czasami odrzucają ostrzeżenie, dodając operator tłumienia błędów @ przed wyrażeniem. Na przykład:

$value = @(2 / 0);

Ale, jak przy każdym ostrzeżeniu, najlepsze podejściebyłoby wyśledzić przyczynę ostrzeżenia i rozwiązać problem. Przyczyna ostrzeżenia pochodzi z dowolnego przypadku, w którym próbujesz podzielić przez 0, zmienną równą 0 lub zmiennej, która nie została przypisana (ponieważ NULL == 0), ponieważ wynik będzie "niezdefiniowany".

Aby poprawić to ostrzeżenie, powinieneś przepisać swojewyrażenie, aby sprawdzić, czy wartość nie wynosi 0, jeśli tak, zrób coś innego. Jeśli wartość wynosi zero, nie powinieneś dzielić ani zmieniać wartości na 1, a następnie dzielić tak, aby podział był równoważny dzieleniu tylko przez dodatkową zmienną.

if ( $var1 == 0 ) { // check if var1 equals zero
$var1 = 1; // var1 equaled zero so change var1 to equal one instead
$var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
$var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Powiązane pytania:


8 dla odpowiedzi № 29

Surowe normy: metoda niestatyczna [<klasa> :: <metoda>] nie powinno się nazywać statycznie

Występuje, gdy próbujesz wywołać metodę niestatyczną na klasie, ponieważ była ona statyczna, a także masz E_STRICT flaga w twoim error_reporting() ustawienia.

Przykład:

class HTML {
public function br() {
echo "<br>";
}
}

HTML::br() lub $html::br()

Możesz faktycznie uniknąć tego błędu, nie dodając E_STRICT do error_reporting()np

error_reporting(E_ALL & ~E_STRICT);

ponieważ jak dla PHP 5.4.0 i wyżej, E_STRICT jest zawarte w E_ALL [ref]. Ale to nie jest wskazane. Rozwiązaniem jest zdefiniowanie planowanej funkcji statycznej jako rzeczywistej static :

public static function br() {
echo "<br>";
}

lub wywołaj funkcję konwencjonalnie:

$html = new HTML();
$html->br();

Powiązane pytania :


2 dla odpowiedzi № 30

Błąd krytyczny: [TraitA] i [TraitB] definiują tę samą właściwość ([$ x]) w składzie [ClassC]

Występuje, gdy klasa próbuje use wiele cech, gdzie mają dwie lub więcej cech zdefiniował właściwość o tej samej nazwie i o różnej wartości początkowej nieruchomości.

Przykład:

<?php
trait TraitA
{
public $x = "a";
}
trait TraitB
{
public $x = "b";
}
class ClassC
{
use TraitA, TraitB;
}

Problematyczny: Chociaż możliwe jest rozwiązywanie konfliktów między konkurencyjne metody, obecnie nie ma składni, która rozwiązałaby konflikt między dwoma konkurującymi właściwościami. Jedynym rozwiązaniem w tym momencie jest refaktor; tj. uniknąć konfliktu między nazwami właściwości powodującymi błąd krytyczny.


Powiązane pytania: