Odwołanie - co oznacza ten błąd w PHP?


1137

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

Zobacz także:


7
Ponadto, aby usunąć dyskusję z komentarzy, przejdź do tego meta pytania
Earlz,



Odpowiedzi:


275

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_WARNINGi nie zatrzyma skryptu.

Typowym przykładem może być plik szablonu taki jak ten:

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

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 <?phpma 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:


2
Jeśli używasz WordPress, sprawdź pliki motywu. Kiedy uaktualniłem witrynę do nowej wersji WordPress, nie byłem w stanie zaktualizować motywu, ponieważ nie był aktualizowany od kilku lat. Ten problem pojawił się. Okazało się, że plik functions.php miał więcej niż jeden <? ?> blok ze spacjami pomiędzy.
Roy Leban

2
@RoyLeban „Jeśli plik zawiera więcej niż jeden blok ...” Nie jestem pewien, co to oznacza. Co to jest „blok”? Czy jeden blok <?php ?>składałby się z „więcej niż jednego bloku” <?php ?> <?php ?>?
Andrew Fox

2
Proszę włączyć funkcję „buforowania danych wyjściowych” w pliku konfiguracyjnym PHP.ini, jeśli to możliwe. Służy do spowalniania tego problemu. Wysyła plik HTML jest zapisywany w buforze danych wyjściowych i wysyłany do klienta dopiero po zatrzymaniu skryptu, więc jeśli dwa nagłówki są wydawane w innej lokalizacji, wówczas stary nagłówek zostanie zastąpiony nowym nagłówkiem.
Nidhin David

191

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

Zdarza się z kodem podobnym do xyz->method()gdzie xyznie jest obiektem i dlatego methodnie 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ć

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

W powyższym przykładzie zapytanie nie może zostać przygotowane i prepare()zostanie przypisane falsedo $statement. Próba wywołania execute()metody spowoduje błąd krytyczny, ponieważ falsejest „nieobiektywny”, ponieważ wartość jest wartością logiczną.

Dowiedz się, dlaczego funkcja zwróciła wartość logiczną zamiast obiektu. Na przykład sprawdź $pdoobiekt 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 ->preparenie udaje wtedy Twój $pdoobiekt 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

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

Próba wykonania metody poza blokiem warunkowym może uniemożliwić zdefiniowanie obiektu.

Powiązane pytania:


115

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/apache2wielu ś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:

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

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_errorsdyrektywę na true. Czy to albo w php.inialbo w .htaccesslub 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:


3
error_reporting(~0);dlaczego nie -1? To właśnie ~0ocenia i jest znacznie mniej tajemnicze.
Fabrício Matté

3
Myślę, że oba są podobnie tajemnicze. ~0jest 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 binarny 1111'1111'1111'1111(dla 32 bitów).
dokładnie

2
Ups, 1111'1111'1111'1111to naprawdę 16 bitów, ale mam nadzieję, że rozumiesz, co mam na myśli.
dokładnie

3
@IvanSolntsev, przepraszam nie, dla wersji wcześniejszych niż 5.4, E_STRICTnie jest uwzględniony w E_ALL. php.net/manual/en/errorfunc.constants.php i przewiń w dół do E_STRICT.
dokładnie

102

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 Indexogłoszenia byłoby ( demo )

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

Oba spinachi 1nie istnieją w tablicy, co powoduje E_NOTICEwyzwolenie

Rozwią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_existslub isset:

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

Jeśli masz kod taki jak:

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

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ą:

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

Powiązane pytania:


if(!empty($_POST['message'])){ //do stuff }
Zwykle

85

Ostrzeżenie: mysql_fetch_array () oczekuje, że parametr 1 będzie zasobem, podana wartość logiczna

Przede wszystkim:

Proszę nie używać mysql_*funkcji w nowym kodzie . Nie są już utrzymywane i oficjalnie przestarzałe . Widzisz czerwone pole ? Dowiedz sięzamiast tegoo przygotowanych instrukcjach i użyj PDO lub MySQLi - ten artykuł pomoże ci zdecydować, które. Jeśli wybierzesz PDO, oto dobry tutorial .


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

Jest to ostrzeżenie i nie zatrzyma skryptu, ale spowoduje błąd w programie.

Musisz sprawdzić wynik zwracany mysql_queryprzez

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

Powią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.


5
Tylko uwaga. Jeśli mysql_querynie jest wystarczająco źle, dodawanie or diena nim jest obrazą obrażeń.
Duch Madary

Problem, który napotykam, $res = mysql_query($query)zwraca 1, jeśli zapytanie zakończy się powodzeniem, więc jest uważane za prawdziwe. Dlatego przy przekazywaniu wyniku mysql_query do mysql_fetch_array() ogłoszenia pokazuje.
mboy

@mboy Dla instrukcji SELECT, SHOW, DESCRIBE, EXPLAIN i innych zwracających zestaw wyników, mysql_query () zwraca zasób w przypadku powodzenia lub FALSE w przypadku błędu. Dla innych typów instrukcji SQL INSERT, UPDATE, DELETE, DROP itp. Mysql_query () zwraca TRUE w przypadku sukcesu lub FALSE w przypadku błędu.
xdazz

@xdazz Z tym problemem mam do czynienia. Wstawianie aktualizacji zwraca wartość PRAWDA, więc nie mogę pozbyć się tego błędu, 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?
mboy

2
@mboy 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ć).
xdazz

79

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

$thisjest 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ć:

  1. Jeśli metoda niestatyczna jest wywoływana 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 przejrzyj kod,$thismoż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_propertyaby uzyskać dostęp do właściwości statycznej.

  2. Jeśli kod z metody klasy został skopiowany do normalnej funkcji lub po prostu do zakresu globalnego i zachowuje $thisspecjalną zmienną.
    Jak naprawić: Przejrzyj kod i zastąp $thisinną zmienną podstawiania.

Powiązane pytania:

  1. Wywołaj metodę niestatyczną jako statyczną: PHP Błąd krytyczny: Używanie $ this, gdy nie jest w kontekście obiektowym
  2. Skopiuj kod: Błąd krytyczny: użycie $ this, gdy nie jest w kontekście obiektowym
  3. Wszystkie pytania „Korzystanie z $ this, gdy nie ma kontekstu obiektowego” na Stackoverflow

2
Możesz również wspomnieć o tym, jak to działa z zamknięciami (nawet w metodach niestatycznych) i jak to jest „naprawione” w 5.4.
Kendall Hopkins,

2
@hakre Mówiłem o statycznym wywołaniu wewnątrz Zamknięcia. Jak $closure = function() { self::method(); }.
Kendall Hopkins,

2
@KendallHopkins: To jest inny błąd: „Błąd krytyczny: nie można uzyskać dostępu do self ::, gdy żaden zakres klasy nie jest aktywny” Jednak za pomocą $thismożna wywołać na zamówienie „Błąd krytyczny: użycie $ this, gdy nie jest on w kontekście obiektowym” :$closure = function() { $this->method(); };
hakre

75

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

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

W takim przypadku fn()nigdy nie zostanie zadeklarowane, ponieważ $someConditionjest to nieprawda.

Przykład 2 - Funkcja w deklaracji funkcji

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

W takim przypadku fnzostanie zadeklarowane dopiero po createFn()wywołaniu. Zauważ, że kolejne wywołania do createFn()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. aptW Debianie lub Ubuntu, yumw 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:


73

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

Zdarza się, gdy masz T_XXXtoken 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:


70

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:

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

Wynika to z faktu, że emptyjest 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 argumentem empty()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 (jak is_null(null)w przykładzie) zawsze będą uważane za istniejące, więc tutaj emptysprawdzamy tylko, czy jest równe false. Możesz zastąpić empty()tutaj !np. if (!is_null(null))Lub jawnie porównać do fałszu, np if (is_null(null) == false).

Powiązane pytania:


64

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ł”):

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

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? $queryskończy z:

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

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:


3
Ponadto, jeśli tego nie zrobisz, Twoja strona zostanie automatycznie zaatakowana przez boty
apscience

2
@gladoscc Kliknij „edytuj” i zmodyfikuj odpowiedź. Wiem, że można to poprawić.
Jocelyn

2
Lub użyj przygotowanego zapytania SQL.
Matej

53

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.inipliku lub za pomocą ini_set('memory_limit', '128 M');skryptu (który zastąpi wartość zdefiniowaną w php.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_usagefunkcja jest Twoim przyjacielem.

Powiązane pytania:


53

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:

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

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:

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

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.

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 alternatywą dla któregokolwiek z powyższych jest konkatenacja zmiennej tablicowej zamiast jej interpolacji:

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

Dla porównania, patrz rozdział o zmiennej parsowania w ręcznym strony PHP Ciągi


45

Ostrzeżenie: [funkcja] : nie można otworzyć strumienia: [powód]

Zdarza się, kiedy można nazwać plik zwykle include, requirealbo fopeni 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:

  • ścieżka pliku jest nieprawidłowa
  • ścieżka do pliku jest względna
  • ścieżka dołączania jest nieprawidłowa
  • uprawnienia są zbyt restrykcyjne
  • SELinux obowiązuje
  • i wiele więcej ...

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__lub dirname(__FILE__):

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

lub:

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

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:


44

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:


Najłatwiejszym sposobem na wywołanie tego błędu jest uruchomienie a()::b;lub $a=::;.
Ismael Miguel

43

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:

// Wrong
echo $array[key];

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

Inną częstą przyczyną jest brakujący $znak (dolar) przed nazwą zmiennej:

// Wrong
echo varName;

// Right
echo $varName;

A może źle wpisałeś inną stałą lub słowo kluczowe:

// Wrong
$foo = fasle;

// Right
$foo = false;

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:


2
Powiedziałbym, że najczęstszą przyczyną jest zapomnienie o $ przed zmienną, a nie tablicą.
Overv

42

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ś requirelub includegdzie powinieneś używać require_oncelub 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 wywołanie do_stuff()wywoła powyższy błąd. Zmieniając requirena require_once, możemy być pewni, że plik zawierający definicję MyClasszostanie załadowany tylko raz, a błąd zostanie uniknięty.


3
Czy warto wspomnieć o automatycznym ładowaniu, a standardy, takie jak PSR-4, a nawet przestarzałe PSR-0, prawie się tego pozbywają, oszczędzając sobie konieczności używania wymagania / uwzględnienia siebie (pomijając kilka dziwnych przypadków na krawędzi).
DanielM

39

Uwaga: Niezdefiniowana zmienna

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

Typowy przykład to

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

Jeśli nie zdefiniowałeś $counterwcześ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

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

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ż counterwłaściwość nie została ustawiona.

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

Powiązane pytania:


35

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:

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

Co próbuję

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

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. To T_VARIABLEsię nazywa token. 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_VARIABLEna liście tłumacza znajduje się token.

Dobra lektura: Lista tokenów analizatora składni

Więc upewnij się, że włączysz przynajmniej E_PARSEw swoim php.ini. Błędy analizy nie powinny występować w skryptach produkcyjnych.

Zawsze zalecałem dodanie następującej instrukcji podczas kodowania:

error_reporting(E_ALL);

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ć:

  1. NetBeans (piękna sztuka, darmowe oprogramowanie) (najlepsze moim zdaniem)
  2. PhpStorm (wujek Gordon uwielbia to: P, płatny plan, zawiera zastrzeżone i bezpłatne oprogramowanie)
  3. Eclipse (piękna i bestia, darmowe oprogramowanie)

Powiązane pytania:


34

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

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

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

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

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ć 0i echa Dzanim dotrze do 4, wyrzuci błąd przesunięcia.

Podobne błędy:


32

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:

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

W tym przypadku $usersjest 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, NULLjeś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 :

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

Problemem jest dostęp do nodeValuewłaściwości (pola) pierwszego elementu, który nie został sprawdzony, czy istnieje w $resultkolekcji. Zamiast tego opłaca się uczynić kod bardziej wyraźnym, 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 (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

Powiązane błędy:


1
json_decodeteraz stdclassdomyślnie zwraca instancję , więc przykładowy kod faktycznie działałby .
Hugo Zink

@ HugoZink: W rzeczywistości zwraca (i zawsze zwracał) tablicę dla tego przykładu: 3v4l.org/SUDe0 - Czy możesz również podać odniesienie do swojego pisania, że json_decodeteraz stdclassdomyślnie zwraca instancję ” ? Nie mogę tego znaleźć w dzienniku zmian.
hakre

Zgodnie ze stroną podręcznika PHP na json_decode , domyślnie assocparametr ma wartość false. Ten parametr decyduje, czy funkcja zwraca stdclasstablicę zamiast asocjacyjnej.
Hugo Zink,

json_decode('[{"name": "hakre"}]', true)zwróci tablicę, w przeciwnym razie stdclassobiekt
zanderwar

29

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 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:



28

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

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

Wariacja 1

$arr = [1, 2, 3];

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:

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

Zobacz także ten przykład z podręcznika.

Wariant 2

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

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:

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

Zobacz także ten przykład z podręcznika.


23

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 :

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

Rozszerzenie cURL definiuje kolejne dwa typy zasobów :

... uchwyt CURL i uchwyt wielofunkcyjny cURL.

Po var_dumped wartości wyglądają tak:

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

resource(1) of type (curl)

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ład fopenfunkcja ma następujący opis:

Zwracane wartości

Zwraca zasób wskaźnika pliku w przypadku powodzenia lub FALSEbłędu.

Więc w tym kodzie, $fpbędzie albo resource(x) of type (stream)albo false:

$fp = fopen(...);

Jeśli nie sprawdzisz, czy fopenoperacja się powiodła, czy nie, a zatem czy $fpjest to prawidłowy zasób, czy też falseprzejdziesz $fpdo 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ć błąd zwracanej wartości funkcji, które próbują przydzielić zasób i mogą się nie powieść :

$fp = fopen(...);

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

$data = fread($fp, 1024);

Powiązane błędy:


22

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:

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

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


20

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:

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

* 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:

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

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:

http://localhost/my/file.php

Możesz również sprawdzić, czy używasz krótkich otwartych tagów <?zamiast, <?phpa 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


18

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ś $usernamea $password.

    • Jest to niczym niezwykłym, że można uzyskać dostęp za pomocą hasła - co nie jest to, co się stało, gdy Ostrzeżenie: powiedział (using password: NO).
    • Tylko lokalny serwer testowy zazwyczaj pozwala połączyć się z nazwą użytkownika root, bez hasła i testnazwą 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_USERLub DB_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.phpzostał faktycznie uwzględniony i whatelse.

  • Sprawdź, czy poprawnie ustawiono GRANTuprawnienia .

    • 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_queryrozmowy, jeśli nie masz uprawnień do SELECTz tabeli określonej, lub INSERT/ UPDATEi bardziej powszechnie DELETEczegokolwiek.

    • 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=i mysql.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:

  • 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:

Przy okazji, prawdopodobnie nie chcesz mysql_*już używać funkcji . Nowo przybyli często migrują do mysqli , co jest jednak równie nudne. Zamiast tego przeczytaj o PDO i przygotowanych oświadczeniach .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


2
mysql pozwala na automatyczne połączenie poprzez ustawienia php-ini, wtedy ten sam komunikat o błędzie jest podawany z innym prefiksem polecenia, np. „Ostrzeżenie: mysql_query (): Odmowa dostępu dla użytkownika '' @ 'localhost' (przy użyciu hasła: NIE) w. .. ” - tylko zauważam.
hakre

Ha, zupełnie o tym zapomniałem! (Prawdopodobnie ostatnio używał tego z PHP3 lub tak ..)
mario

18

Uwaga: Konwersja tablic na łańcuchy

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

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

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

Tablicy nie można po prostu łączyć echoani łą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:

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

Lub zapętlić tablicę:

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

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.


12

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:

$value = @(2 / 0);

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ą.

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:


Ustawienie 1, jeśli było 0, zatrzyma błąd, ale czy to naprawdę jest lepsze niż wyłączenie, o którym mówiłeś, że nie powinno być stosowane (z czym się zgadzam)? Sugerowałbym, że w większości przypadków zwróciłaby się inna wiadomość lub wartość.
James

W tym przykładzie, jeśli $var1= = 0, możesz po prostu ustawić $var3na $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
James

8

Ś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_STRICTflagę w swoimerror_reporting() ustawieniach.

Przykład:

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

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

Rzeczywiście można uniknąć tego błędu, nie dodając E_STRICTdo error_reporting(), na przykład

error_reporting(E_ALL & ~E_STRICT);

ponieważ jak dla PHP 5.4.0 i wyżej, E_STRICTjest zawarty w E_ALL[ ref ]. Ale to nie jest zalecane. Rozwiązaniem jest zdefiniowanie zamierzonej funkcji statycznej jako rzeczywistej static:

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

lub wywołać funkcję konwencjonalnie:

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

Powiązane pytania :


7

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:

$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1

Jest to przestarzałe od PHP 7.4.0 i generuje ostrzeżenie:

Przestarzałe: Składnia dostępu do macierzy i przesunięcia łańcucha w nawiasach klamrowych jest przestarzała

Musisz użyć nawiasów kwadratowych, []aby uzyskać dostęp do przesunięć ciągów i elementów tablicy:

$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1

RFC tej zmiany linki do PHP skrypt , który próbuje naprawić to mechanicznie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.