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
- Nic nie jest widoczne. Strona jest pusta i biała. (znany również jako Biała strona / ekran śmierci)
- Kod nie uruchamia się / wygląda na to, że część mojego kodu PHP jest wyprowadzana
- Ostrzeżenie: Nie można zmodyfikować informacji w nagłówku - nagłówki zostały już wysłane
- Ostrzeżenie: mysql_fetch_array () oczekuje, że parametr 1 będzie zasób, boolean given znany jako.
Ostrzeżenie: mysql_fetch_array (): podany argument nie jest prawidłowym zasobem wyniku MySQL znany jako.
Ostrzeżenie: mysqli_num_rows () oczekuje, że parametr 1 będzie mysqli_result, boolean given (lub podobne odmiany) - Ostrzeżenie: [funkcjonować] oczekuje, że parametr 1 będzie zasób, boolean given
- Ostrzeżenie: [funkcjonować]: nie udało się otworzyć strumienia: [powód]
- Ostrzeżenie: obowiązuje ograniczenie open_basedir
- Ostrzeżenie: dzielenie przez zero
- Ostrzeżenie: niedozwolone przesunięcie łańcucha znaków "XXX"
- Błąd analizy: błąd składni, nieoczekiwany "["
- Błąd składni: błąd składni, nieoczekiwany T_XXX
- Błąd składni: błąd składni, nieoczekiwany T_ENCAPSED_AND_WHITESPACE
- Błąd analizy: błąd składni, nieoczekiwany T_PAAMAYIM_NEKUDOTAYIM
- Błąd składni: błąd składni, nieoczekiwane "require_once" (T_REQUIRE_ONCE), oczekiwana funkcja (T_FUNCTION)
- Błąd składni: błąd składni, nieoczekiwany błąd T_VARIABLE
- Błąd krytyczny: Dozwolony rozmiar pamięci wynoszący XXX bajtów wyczerpał się (próbowano przydzielić XXX bajtów)
- Błąd krytyczny: wywołanie funkcji członkowskiej ... na obiekcie niebędącym obiektem
- Błąd krytyczny: połączenie z niezdefiniowaną funkcją XXX
- Błąd krytyczny: nie można redeclare 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 obiektu
- Uwaga: Array do konwersji łańcuchowej
- Uwaga: Próba uzyskania właściwości błędu nieobiektowego
- Uwaga: Niezdefiniowana zmienna
- Uwaga: niezdefiniowany indeks
- Uwaga: Undefined offset XXX [Odniesienie]
- Uwaga: Niezainicjalizowane przesunięcie łańcucha: XXX
- Uwaga: użycie niezdefiniowanej stałej XXX - przyjęto "XXX"
- 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 ...
- Surowe normy: metoda niestatyczna [<klasa> :: <metoda>] nie powinno się nazywać statycznie
Zobacz także
Odpowiedzi:
226 dla odpowiedzi nr 1Ostrzeż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:
- Nagłówki już wysłane przez PHP
- Wszystkie nagłówki PHP "już wysłane" Pytania dotyczące Stackoverflow
- Znak zamówienia Byte
- Jakie funkcje PHP tworzą dane wyjściowe?
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:
- Wywołanie funkcji członka na obiekcie niebędącym obiektem
- Lista wszystkich PHP "Błąd krytyczny: Wezwanie do funkcji członkowskiej ... na nieobiektowym" Pytania dotyczące Stackoverflow
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:
- Biały ekran śmierci PHP
- Biały ekran śmierci!
- PHP nie wyświetla komunikatów o błędach
- PHP emitujące 500 błędów - gdzie jest to udokumentowane?
- Jak uzyskać przydatne komunikaty o błędach w PHP?
- Wszystkie pytania "Biała strona śmierci" PHP na Stackoverflow
Powiązane błędy:
- Błąd składni: błąd składni, nieoczekiwany T_XXX
- Błąd krytyczny: wywołanie funkcji członkowskiej ... na obiekcie niebędącym obiektem
- Kod nie uruchamia się / wygląda na to, że część mojego kodu PHP jest wyprowadzana
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:
- Odniesienie: "Notice: Undefined variable" and "Notice: Undefined index"
- Wszystkie pytania "Uwaga: niezdefiniowany indeks" na Stackoverflow
- http://php.net/arrays
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:
- mysql_fetch_array () oczekuje, że parametr 1 będzie zasobem, boolean podany w select
- Wszystkie "mysql_fetch_array () oczekuje, że parametr 1 będzie zasób, boolean biorąc pod uwagę" Pytania na Stackoverflow
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ć:
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.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:
- Wywołanie metody statycznej niestatyczną: PHP Błąd krytyczny: Używanie $ this, gdy nie w kontekście obiektu
- Skopiuj kod: Błąd krytyczny: użycie $ this, gdy nie znajduje się w kontekście obiektu
- 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:
- Odniesienie: PHP Parse / błędy składni; i jak je rozwiązać?
- Błąd analizy: błąd składniowy: nieoczekiwane "{"
- Błąd parsowania: błąd składni, nieoczekiwany koniec pliku w moim kodzie PHP
- Błąd parsowania: błąd składni, nieoczekiwane "<" w - Fix?
- Błąd analizy: błąd składni, nieoczekiwane "?"
Aby uzyskać dalszą pomoc, patrz:
- http://phpcodechecker.com/ - Które dostarcza bardziej użytecznych wyjaśnień na temat błędów w składni.
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:
- Jak mogę zapobiec iniekcji SQL w PHP?
mysql_real_escape_string()
mysqli_real_escape_string()
- Jak działa iniekcja SQL z komiksu XKCD "Bobby Tables"?
- SQL injection, który dostaje się wokół mysql_real_escape_string ()
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:
- Odniesienie: PHP Parse / błędy składni; i jak je rozwiązać?
- Co oznaczają dwa dwukropki w PHP?
- Jaka jest różnica między :: (podwójny dwukropek) i -> (strzałka) w PHP?
- Nieoczekiwany T_PAAMAYIM_NEKUDOTAYIM, oczekując T_NS_Separator
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:
- Wszystkie pytania "Uwaga: niezdefiniowana zmienna" na Stackoverflow
- PHP: "Notice: Undefined variable", "Notice: Undefined index" i "Notice: Undefined offset"
- Odsyłacz: Czym jest zakres zmienny, które zmienne są dostępne z miejsca i jakie są błędy "niezdefiniowanej zmiennej"?
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:
- W praktyce obowiązuje ograniczenie open_basedir. Plik (/) nie mieści się w dozwolonych ścieżkach:
- Wszystkie PHP "Ostrzeżenie: ograniczenie open_basedir w efekcie" Querstions on Stackoverflow
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);
Dobrym pomysłem jest również użycie IDE, które pozwoli ci poznać błędy parsowania podczas pisania. Możesz użyć:
- NetBeans (piękny spokój, wolne oprogramowanie) (najlepsze według mnie)
- PhpStorm (wujek Gordon uwielbia to: P, płatny plan, zawiera własne i darmowe oprogramowanie)
- Zaćmienie (piękno i bestia, wolne oprogramowanie)
Powiązane pytania:
- Odniesienie: PHP Parse / błędy składni; i jak je rozwiązać?
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:
- Uwaga: niezdefiniowany indeks
- Błąd krytyczny: wywołanie funkcji członkowskiej ... na obiekcie niebędącym obiektem
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_dump
ed, 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 itest
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.
- Niezwykłe jest to, że uzyskujesz dostęp bez użycia hasła - co się stało, gdy Ostrzeżenie: powiedział
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
lubDB_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 lubINSERT
/UPDATE
i częściejDELETE
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=
imysql.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:
na przykład HostGator, Idź Tato, 1 i 1, DigitalOcean, BlueHost, DreamHost, MediaTemple, ixWebhosting, lunarhostinglub po prostu Google.
W innym przypadku skonsultuj się ze swoim dostawcą usług hostingowych za pośrednictwem kanałów wsparcia.
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:
- Serverfault: odmowa dostępu mysql dla "root" @ "nazwa komputera"
- Ostrzeżenie: mysql_connect (): Odmowa dostępu
- Ostrzeżenie: mysql_select_db () Odmowa dostępu dla użytkownika '' @ 'localhost' (przy użyciu hasła: NO)
- Odmowa dostępu dla użytkownika 'root' @ 'localhost' za pomocą PHPMyAdmin
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:
- ostrzeżenie: dzielenie przez zero
- Ostrzeżenie: Division By Zero Działa na PHP i MySQL
- Błąd dzielenia przez zero w WordPress Theme
- Jak wyłączyć błąd "Podział przez zero"
- Jak złapać podział przez zero?
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 :
- Jak mogę rozwiązać "Niestatyczna metoda xxx: xxx () nie powinna być wywoływana statycznie w PHP 5.4?
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: