/ / Odkaz - Čo znamená táto chyba v PHP? - php, mysql, ladenie, varovania

Odkaz - Čo znamená táto chyba v PHP? - php, mysql, ladenie, varovania

Čo to je?

Toto je niekoľko odpovedí o upozorneniach,chyby a upozornenia, s ktorými by ste sa mohli stretnúť pri programovaní PHP a nemali by ste vedieť, ako opraviť. Toto je tiež komunitné Wiki, takže každý je pozvaný, aby sa zúčastnil na pridávaní a vedení tohto zoznamu.

Prečo je toto?

Otázky ako "Hlavičky už boli odoslané" alebo "Volanie člena ne-objektu" sa často objavuje pri pretečení zásobníka. Hlavná príčina týchto otázok je vždy rovnaká. Takže odpovede na tieto otázky zvyčajne zopakujú ich a potom ukazujú OP, ktorý riadok sa má zmeniť v jeho konkrétnom prípade. Tieto odpovede nepridávajú žiadnu hodnotu, pretože sa vzťahujú iba na konkrétny kód OP.Všetci používatelia, ktorí majú rovnakú chybu, nemôžu ľahko prečítať riešenie z toho, pretože sú príliš lokalizované.To je smutné, pretože akonáhle ste chápeme hlavnú príčinu, chyba je triviálna, a preto sa tento zoznam pokúša vysvetliť všeobecné riešenie.

Čo by som mal robiť tu?

Ak bola vaša otázka označená ako duplikátz tohto nájdite nižšie svoju chybovú správu a aplikujte opravu na kód. Odpovede zvyčajne obsahujú ďalšie prepojenia na vyšetrovanie v prípade, že by nemalo byť jasné len všeobecná odpoveď.

Ak chcete prispieť, pridajte svoje"obľúbená" chybové hlásenie, upozornenie alebo upozornenie, jeden na odpoveď, krátky opis toho, čo to znamená (aj keď iba zdôrazňuje výrazy na manuálnu stránku), možné riešenie alebo ladiaci prístup a zoznam existujúcich Otázok a odpovedí, ktoré sú cenné , Môžete tiež zlepšiť existujúce odpovede.

Zoznam

Pozri tiež

odpovede:

226 pre odpoveď č. 1

Upozornenie: Nie je možné upraviť informácie o hlavičke - záhlavia už boli odoslané

Stane sa, keď sa váš skript pokúša odoslať hlavičku HTTP klientovi, ale predtým už bol výstup, čo viedlo k tomu, že hlavičky už boli odoslané klientovi.

Toto je E_WARNING a skript nezastaví.

Typickým príkladom by mohol byť súbor šablóny, ako je tento:

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

Na session_start() Funkcia sa pokúsi odoslať hlavičky s cookie relácie klienta.Ale PHP už poslal hlavičky, keď to napísal <html> prvok výstupný prúd údajov. Ste "d sa pohybovať session_start() až na vrchol.

Môžete to vyriešiť prechádzajú linky pred kód spúšťanie upozornenie a kontrolu kde výstupy.Presunúť ľubovoľnú hlavičku zašlete kód pred vydaním kódexu.

Často prehliadajú výstupom je nové linky po PHP "s zatváranie ?>. Považuje za štandartné vynechať ?> Kedy je to posledné, čo v súbore. Podobne, Ďalšou častou príčinou pre toto upozornenie je pri otvorení <?php prázdny priestor, línie alebo neviditeľný znak, spôsobuje webový server poslať hlavičky a prázdne/newline tak keď začne PHP parsing vyhral "t byť schopný predložiť žiadne hlavičky.

Ak váš súbor má viac ako jeden <?php ... ?> blok kódu, by ste nemali mať medzery medzi nimi.(Poznámka: môžete mať viaceré bloky keby kódu, ktorá bola automaticky vytvorená)

Tiež, uistite sa, že ste don "t mať akékoľvek bajt poradí značky v kóde, napríklad pri kódovaní skript je utf-8 s Kusovníka.

Súvisiace otázky:


157 za odpoveď № 2

Smrteľná chyba: Volanie na funkciu člena ... na ne-objekt

Sa stane s kódom podobná xyz->method() kde xyz nie je objekt, a preto method nemožno nazvať.

To je fatálna chyba, ktorá zastaví skript (zašle oznámenie o kompatibilite: stane sa Zachytiteľný chyba počnúc PHP 7).

Najčastejšie je to znamenie, že kód chýba kontroly chýb. Overiť, že objekt je vlastne objekt pred volaním jeho metódy.

A typický napríklad

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

Vo vyššie uvedenom príklade sa dotaz nedá pripraviť a prepare() priradí false na $statement, Snažím sa zavolať execute() potom spôsobí fatálnu chybu, pretože false je "non-object", pretože hodnota je boolean.

Prísť na prečo Vaša funkcia vrátila boolean namiesto objektu. Skontrolujte napríklad $pdo objekt pre poslednú chybu, ktorá sa vyskytla. Podrobnosti o tom, ako ladiť, bude závisieť od toho, ako sú chyby spracovávané pre danú konkrétnu funkciu / objekt / triedu.

Ak aj ->prepare zlyháva potom vaše $pdo objekt databázy handle nedostali sa do súčasného rozsahu, Nájsť, kde to bolo definované. Potom ho odovzdajte ako parameter, uložte ho ako majetok alebo ho zdieľajte prostredníctvom globálneho rozsahu.

Ďalší problém môže byť podmienené vytváranie objektu a potom sa pokúsi volať metódu mimo tohto podmieneného bloku. Napríklad

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

Pokus o vykonanie metódy mimo podmieneného bloku, váš objekt nemusí byť definovaný.

Súvisiace otázky:


102 pre odpoveď № 3

Nič nie je vidieť. Stránka je prázdna a biela.

Tiež známy ako Biela stránka smrti alebo Biela obrazovka smrti, Toto sa stane, keď je vypnuté hlásenie chýb a vyskytla sa závažná chyba (často chyba syntaxe).

Ak máte povolené zapisovanie chýb, v protokole chýb nájdete konkrétne chybové hlásenie. Toto bude zvyčajne v súbore s názvom "php_errors.log", buď v centrálnom umiestnení (napr. /var/log/apache2 v mnohých prostrediach Linuxu) alebo v adresári samotného skriptu (niekedy sa používa v prostredí zdieľaného hostingu).

Niekedy to môže byť jednoduchšiedočasne povoliť zobrazovanie chýb. Na bielej stránke sa potom zobrazí chybové hlásenie. Dávajte si pozor, pretože tieto chyby sú viditeľné pre každého, kto navštívi webovú stránku.

To možno ľahko vykonať pridaním nasledujúceho kódu PHP v hornej časti skriptu:

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

Kód zapne zobrazenie chýb a nastaví hlásenie na najvyššiu úroveň.

Vzhľadom k tomu, ini_set() sa vykonáva pri behu, nemá žiadny vplyv na syntaktické chyby. Tieto chyby sa zobrazia v denníku. Ak ich chcete zobraziť aj vo výstupe (napr. V prehliadači), musíte nastaviť display_startup_errors smernice true, Urob to buď v php.ini alebo v a .htaccess alebo akúkoľvek inú metódu, ktorá ovplyvňuje konfiguráciu pred runtime.

Na nastavenie môžete použiť rovnaké metódy log_errors a error_log smernice, aby ste si vybrali umiestnenie vlastného súboru denníka.

Pri pohľade do denníka, alebo pomocou displeja, dostanete oveľa lepšie chybové hlásenie a riadok kódu, kde sa váš skript zastaví.

Súvisiace otázky:

Súvisiace chyby:


90 pre odpoveď № 4

Upozornenie: Nedefinovaný index

Stane sa, keď sa pokúsite pristúpiť k poľu kľúčom, ktorý v poli neexistuje.

Typický príklad pre Undefined Index oznámenie (demonštrácie)

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

oba spinach a 1 neexistujú v poli, čo spôsobuje E_NOTICE spustiť.

Riešením je zabezpečiť index alebo posunexistuje pred prístupom k tomuto indexu. To môže znamenať, že je potrebné opraviť chybu vo vašom programe, aby ste zaistili, že tieto indexy existujú, keď ich očakávate. Alebo to môže znamenať, že musíte otestovať, či existujú indexy array_key_exists alebo isset:

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

Ak máte kód ako:

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

potom $_POST["message"] sa nenastaví pri prvom načítaní tejto stránkya dostanete vyššie uvedenú chybu. Len keď je formulár odoslaný a tento kód je spustený druhýkrát, index poľa existuje. Typicky to kontrolujete pomocou:

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

Súvisiace otázky:


76 pre odpoveď № 5

Upozornenie: mysql_fetch_array () očakáva, že parameter 1 bude zdrojom, boolean daný

V prvom rade:

Prosím, nepoužívaj mysql_* funkcie v novom kóde, Už nie sú udržiavané a sú oficiálne odmietnuté, Pozrite si červené pole? Dozvedieť sa o pripravené vyhlásenia a namiesto toho PDO alebo MySQLi - tento článok vám pomôže rozhodnúť, ktoré. Ak vyberiete CHOP, tu je dobrý návod.


Toto sa stane, keď sa pokúsite načítať údaje z výsledku mysql_query ale dotaz zlyhal.

Toto je varovanie a nezastaví skript, ale urobí váš program nesprávnym.

Musíte skontrolovať výsledok vrátený mysql_query podľa

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

Súvisiace otázky:

Súvisiace chyby:

ostatné mysql* funkcie, ktoré tiež očakávajú, že výsledok mysql zdroj ako parameter bude produkovať rovnakú chybu z rovnakého dôvodu.


70 pre odpoveď № 6

Smrteľná chyba: Použitie $ this nie je v kontexte s objektom

$this je špeciálna premenná v PHP ktoré nie je možné priradiť. Ak je pristupovaný v kontexte, kde neexistuje, táto fatálna chyba je daná.

Táto chyba sa môže vyskytnúť:

  1. Ak sa statická metóda nazýva statická metóda. Príklad:

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

    Ako opraviť: znova skontrolujte svoj kód, $this možno použiť iba v kontexte objektu a nikdy by sa nemal používať v statickej metóde. Statická metóda by tiež nemala pristupovať k nestatickej vlastnosti. použitie self::$static_property prístup k statickej vlastnosti.

  2. Ak bol kód z metódy triedy skopírovaný do normálnej funkcie alebo len do globálneho rozsahu a udržiavanie $this špeciálna premenná.
    Ako opraviť: Skontrolujte kód a nahraďte ho $this s odlišnou substitučnou premennou.

Súvisiace otázky:

  1. Zavolať nestatickú metódu ako statickú: PHP Závažná chyba: Použitie $ to, keď nie je v kontexte objektu
  2. Kopírovať kód: Smrteľná chyba: Použitie $ this nie je v kontexte s objektom
  3. Všetky "Použitie $ to, keď nie je v kontexte objektu" Otázky na Stackoverflow

67 pre odpoveď № 7

Závažná chyba: Zavolajte na nedefinovanú funkciu XXX

Stane sa, keď sa pokúsite volať funkciu, ktorá jeešte nie je definovaná. Bežné príčiny zahŕňajú chýbajúce rozšírenia a zahŕňajú deklaráciu podmienenej funkcie, funkciu vo deklarácii funkcií alebo jednoduché preklepy.

Príklad 1 - Vyhlásenie o podmienenej funkcii

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

V tomto prípade, fn() nikdy nebude vyhlásená, pretože $someCondition to nie je pravda.

Príklad 2 - Funkcia vo funkčnom vyhlásení

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

V tomto prípade, fn len raz createFn() zavolá. Všimnite si, že nasledujúce volania na createFn() spôsobí chybu týkajúcu sa opätovnej deklarácie existujúcej funkcie.

Môžete to vidieť aj pre vstavanú funkciu PHP. Skúste vyhľadať funkciu v oficiálny manuál, a skontrolujte, čo "rozšírenie" (modul PHP) patrí a aké verzie PHP ho podporujú.

V prípade chýbajúceho rozšírenia ho nainštalujtea povoliť ho v php.ini. Rozšírenie, v ktorom sa vaša funkcia zobrazí, nájdete v Inštalačných pokynoch v Príručke PHP. Prípadne môžete povoliť alebo nainštalovať rozšírenie pomocou správcu balíkov (napr. apt v Debiane alebo Ubuntu, yum v Red Hat alebo CentOS), alebo ovládací panel v prostredí zdieľaného hostingu.

Ak bola funkcia zavedená v novšej verziiPHP z toho, čo používate, môžete nájsť odkazy na alternatívne implementácie v príručke alebo v jej časti s komentármi. Ak bol odstránený z PHP, vyhľadajte informácie o dôvodoch, pretože už nemusia byť potrebné.

V prípade chýbajúcich prvkov sa uistite, že ste pred volaním funkcie zahrnuli súbor deklarujúci funkciu.

V prípade preklepov opravte preklep.

Súvisiace otázky:


66 pre odpoveď № 8

Chyba analýzy: syntaktická chyba, neočakávaný T_XXX

Stáva sa, keď máte T_XXX žetón v neočakávanom mieste, nevyvážených (nadbytočných) zátvorkách, použití krátkej značky bez aktivácie v php.ini a mnohých ďalších.

Súvisiace otázky:

Ďalšie informácie nájdete v časti:


61 pre odpoveď № 9

Smrteľná chyba: Nemožno použiť návratovú hodnotu funkcie v kontexte zápisu

Zvyčajne sa to deje pri použití funkcie priamo empty.

Príklad:

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

To je preto, že empty je jazyková konštrukcia a nie funkcia, nemôže byť volaná s výrazom ako argument vo verziách PHP pred 5.5. Pred PHP 5.5, argument pre empty() musí byť a premenlivý, ale v PHP 5.5+ je prípustný ľubovoľný výraz (napríklad návratová hodnota funkcie).

emptynapriek svojmu názvu v skutočnosti nekontroluje, či je premenná "prázdna". Namiesto toho kontroluje, či neexistuje premenná, alebo == false, Výrazy (ako is_null(null) v príklade) bude vždy považovaný za existujúci, takže tu empty je len kontrola, či je rovná false. Môžete nahradiť empty() tu s !, napr. if (!is_null(null))alebo explicitne porovnať s nepravdivými, napr. if (is_null(null) == false).

Súvisiace otázky:


57 pre odpoveď № 10

MySQL: Máte chybu v syntaxe SQL; skontrolujte manuál, ktorý zodpovedá vašej verzii servera MySQL pre správnu syntax na použitie v blízkosti ... na riadku ...

Táto chyba je často spôsobená tým, že ste zabudli správne uniknúť údajom odovzdaným do dotazu MySQL.

Príklad toho, čo nie robiť („Bad Idea“):

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

Tento kód by mohol byť zahrnutý na stránke s formulárom na odoslanie s adresou URL, ako je napr http://example.com/edit.php?id=10 (upraviť príspevok č. 10)

Čo sa stane, ak odovzdaný text obsahuje jednoduché úvodzovky? $query skončí s:

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

A keď je tento dotaz odoslaný do MySQL, bude sa sťažovať, že syntax je nesprávna, pretože v strede je jedna extra cenová ponuka.

Aby ste sa vyhli takýmto chybám, vy MUSIEŤ pred použitím v dotaze vždy uniknite údajom.

Unikajúce dáta pred použitím v dotaze SQL sú tiežveľmi dôležité, pretože ak sa vám to nepodarí, váš skript bude otvorený pre injekcie SQL. Injekcia SQL môže spôsobiť zmenu, stratu alebo zmenu záznamu, tabuľky alebo celej databázy.

dokumentácia:


49 pre odpoveď № 11

Smrteľná chyba: Povolená veľkosť pamäte XXX bajtov vyčerpaná (pokúsila sa alokovať XXX bajtov)

Na spustenie skriptu nie je dostatok pamäte. PHP dosiahlo limit pamäte a zastavilo ho. Táto chyba je fatálna, skript sa zastaví. Hodnota limit pamäte možno konfigurovať buď v php.ini alebo pomocou ini_set("memory_limit", "128 M"); v skripte (ktorý prepíše hodnotu definovanú v php.ini). Účelom obmedzenia pamäte je zabrániť tomu, aby jeden skript PHP zhltol všetku dostupnú pamäť a celý webový server sa dostal dole.

Prvá vec, ktorú musíte urobiť, je minimalizovať množstvopamäte, ktorú skript potrebuje. Ak napríklad čítate veľký súbor do premennej alebo načítavate mnoho záznamov z databázy a ukladáte ich do poľa, ktoré môže používať veľa pamäte, zmeňte kód tak, aby namiesto toho čítal súbor po riadku alebo ukladať databázové záznamy jeden po druhom bez toho, aby sa ukladali do pamäte, čo si vyžaduje trochu koncepčné uvedomenie si toho, čo sa deje v zákulisí a kedy sú údaje uložené v pamäti a inde.

Ak sa táto chyba vyskytla, keď skript nerobil prácu náročnú na pamäť, musíte skontrolovať kód, aby ste zistili, či existuje únik pamäte. memory_get_usage funkcia je váš priateľ.

Súvisiace otázky:


45 pre odpoveď № 12

Chyba analýzy: syntaktická chyba, neočakávaná T_ENCAPSED_AND_WHITESPACE

Táto chyba sa najčastejšie vyskytuje pri pokuse o referenciu hodnoty poľa pomocou a kľúč pre interpoláciu v reťazci s dvojitým citátom, keď celý komplexný variabilný konštrukt nie je uzavretý {}.

Prípad chyby:

To bude mať za následok Unexpected T_ENCAPSED_AND_WHITESPACE:

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

Možné opravy:

V reťazci s dvojitým citátom PHP umožní použitie reťazcov kľúčov kľúčov necitovanýa nevydá E_NOTICE, Takže vyššie uvedené by mohlo byť napísané ako:

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

Celá komplexná premenná poľa a kľúč (y) môžu byť uzavreté {}, v takom prípade mali by aby sa predišlo E_NOTICE. Dokumentácia PHP odporúča túto syntax pre komplexné premenné.

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"]}";

Samozrejme, alternatíva k akýkoľvek z vyššie uvedeného je spojiť premennú poľa namiesto interpolácie:

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

Viac informácií nájdete v časti o Variabilná analýza v stránky manuálu PHP Strings


39 pre odpoveď № 13

Chyba analýzy: syntaktická chyba, neočakávaná T_PAAMAYIM_NEKUDOTAYIM

Operátor rozlíšenia rozsahu je tiež nazývaný "Paamayim Nekudotayim" z hebrejského פעמיים נקודתיים. čo znamená "dvojité dvojbodky" alebo "dvojité bodky dvakrát".

Táto chyba sa obyčajne stane, ak ste omylom vložili :: vo vašom kóde.

Súvisiace otázky:

dokumentácia:


37 pre odpoveď № 14

Závažná chyba: Nie je možné redeclare triedy [názov triedy]

Závažná chyba: Nedá sa prehodnotiť [názov funkcie]

Znamená to, že buď dvakrát použijete rovnaký názov funkcie / triedy a musíte jeden z nich premenovať, alebo je to preto, že ste použili require alebo include kde by ste mali používať require_once alebo include_once.

Ak je trieda alebo funkcia deklarovaná v PHP, je nemenná a neskôr nemôže byť deklarovaná s novou hodnotou.

Zvážte nasledujúci kód:

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();

Druhá výzva na do_stuff() vyššie. Zmenou require na require_once, môžeme si byť istí, že súbor, ktorý obsahuje definíciu MyClass sa načíta iba raz a chyba sa vynechá.


37 pre odpoveď № 15

Výstraha: [Funkcia]: Nepodarilo sa otvoriť stream: [dôvod]

Stáva sa to pri volaní súboru zvyčajne include, require alebo fopen a PHP nemohol "t nájsť súbor alebo nemá dostatok oprávnení na načítanie súboru.

Môže k tomu dôjsť z rôznych dôvodov:

  • cesta k súboru je nesprávna
  • cesta k súboru je relatívna
  • vrátane cesty je zlé
  • povolenia sú príliš reštriktívne
  • SELinux je v platnosti
  • a mnoho ďalších ...

Jednou z bežných chýb je nepoužívať absolútnu cestu. To sa dá ľahko vyriešiť pomocou plnej cesty alebo magické konštanty Páči sa mi to __DIR__ alebo dirname(__FILE__):

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

alebo:

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

Zaistenie správnej cesty je jedným krokomOdstraňovanie týchto problémov môže súvisieť aj s neexistujúcimi súbormi, právami súborového systému, ktoré bránia v prístupe alebo otvárajú obmedzenia založené na základe samotného PHP.

Najlepším spôsobom, ako tento problém vyriešiť rýchlo, je postupovať podľa nižšie uvedeného kontrolného zoznamu na riešenie problémov.

Súvisiace otázky:

Súvisiace chyby:


36 pre odpoveď № 16

Upozornenie: Nedefinovaná premenná

Stane sa, keď sa pokúsite použiť premennú, ktorá nebola predtým definovaná.

Typickým príkladom by bolo

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

Ak ste to neurčili $counter vyššie uvedený kód spustí oznámenie.

Správnym spôsobom by bolo nastaviť premennú pred jej použitím, aj keď je to len prázdny reťazec

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

Súvisiace otázky:


35 pre odpoveď № 17

Upozornenie: Použitie nedefinovanej konštanty XXX - predpokladaná hodnota "XXX"

alebo v PHP 7.2 alebo novšom:

Upozornenie: Použitie nedefinovanej konštanty XXX - predpokladá sa "XXX" (v budúcej verzii PHP sa zobrazí chyba)

Toto upozornenie nastane, keď je v kóde použitý token a zdá sa, že je konštantný, ale konštanta podľa tohto názvu nie je definovaná.

Jednou z najčastejších príčin tohto oznámenia je neschopnosť citovať reťazec použitý ako kľúč asociatívneho poľa.

Napríklad:

// Wrong
echo $array[key];

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

Ďalšími bežnými príčinami je chýbajúce $ (znak dolára) pred názvom premennej:

// Wrong
echo varName;

// Right
echo $varName;

Alebo možno ste nesprávne napísali inú konštantu alebo kľúčové slovo:

// Wrong
$foo = fasle;

// Right
$foo = false;

Môže to byť aj znamenie, že pri pokuse o prístup ku konštante definovanej touto knižnicou chýba potrebné rozšírenie alebo knižnica PHP.

Súvisiace otázky:


28 pre odpoveď № 18

Upozornenie: platí obmedzenie open_basedir

Toto upozornenie sa môže zobraziť s rôznymi funkciami, ktoré súvisia s prístupom k súborom a adresárom. Upozorňuje na problém s konfiguráciou.

Keď sa objaví, znamená to, že pre niektoré súbory bol prístup zakázaný.

Samotné varovanie nič neporušuje, ale najčastejšie skript nefunguje správne, ak je zabránené prístupu k súborom.

Oprava je zvyčajne zmena Konfigurácia PHP, zavolá sa príslušné nastavenie open_basedir.

Niekedy sa používa nesprávny názov súboru alebo adresára, oprava sa potom použije správne.

Súvisiace otázky:


28 pre odpoveď № 19

Upozornenie: Neinicializovaný posun reťazca: *

Ako názov napovedá, takýto typ chyby sa vyskytuje, keď sa s najväčšou pravdepodobnosťou pokúšate iterovať, alebo nájsť hodnotu z poľa s neexistujúcim kľúčom.

Zvážte, že sa snažíte ukázať každý list $string

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

Vyššie uvedený príklad vygeneruje (online demo):

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

A akonáhle skript skončí ozveny D dostanete chybu, pretože vo vnútri for() slučku, povedali ste PHP, aby vám ukázala od prvého do piateho znaku reťazca "ABCD" Ktorý existuje, ale pretože slučka začína počítať od 0 a ozveny D dovtedy, kým dosiahne 4, bude to chyba posunu.

Podobné chyby:


27 pre odpoveď № 20

Chyba analýzy: syntaktická chyba, neočakávaná T_VARIABLE

Možný scenár

Zdá sa, že sa mi nepodarilo zistiť, kde sa môj kód pokazil. Tu je moja úplná chyba:

Chyba analýzy: chyba syntaxe, neočakávané T_VARIABLE na riadku x

Čo sa snažím

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

odpoveď

Chyba analýzy: Problém so syntaxou programu, ako je napríklad ponechanie bodkočiarky mimo konca vyhlásenia alebo, ako je to v prípade uvedenom vyššie, chýba . operátor. Tlmočník prestane spúšťať váš program, keď sa stretne s chybou analýzy.

Jednoducho povedané, ide o chybu syntaxe, čo znamená, že vo vašom kóde je niečo, čo ho zastavuje, aby sa správne analyzoval, a preto je spustený.

Čo by ste mali urobiť je starostlivo kontrolovať na linkách, kde je chyba pre všetky jednoduché chyby.

Toto chybové hlásenie znamená, že v riadku x súboru, interpreter PHP očakával, že uvidí otvorenú zátvorku, ale namiesto toho sa stretol s niečím, čo sa nazýva T_VARIABLE, že T_VARIABLE vec sa nazýva token, Je to spôsob vyjadrovania interpretov PHPrôznych základných častí programov. Keď tlmočník číta v programe, prekladá to, čo ste napísali do zoznamu tokenov.T_VARIABLE token v zozname tlmočníkov.

Dobré čítanie: Zoznam parser tokenov

Uistite sa teda, že ste povolili aspoň E_PARSE vo vašom php.ini, V produkčných skriptoch by nemali existovať chyby analýzy.

Pri kódovaní som vždy odporúčal pridať nasledujúce vyhlásenie:

error_reporting(E_ALL);

Hlásenie chýb PHP

Tiež dobrý nápad použiť IDE, ktorý vám umožní vedieť chyby pri písaní. Môžeš použiť:

  1. NetBeans (jemný mier krásy, slobodný softvér) (najlepšie podľa môjho názoru)
  2. PhpStorm (strýko Gordon miluje toto: P, platený plán, obsahuje proprietárny a slobodný softvér)
  3. zatmenie (krása a šelma, slobodný softvér)

Súvisiace otázky:


25 pre odpoveď № 21

Chyba parsovania: syntaktická chyba, neočakávaná "["

Táto chyba sa vyskytuje v dvoch variantoch:

Zmena 1

$arr = [1, 2, 3];

Táto syntax inicializátora poľa bola zavedená iba v PHP 5.4; spôsobí chybu syntaktického analyzátora vo verziách pred týmto. Ak je to možné, aktualizujte svoju inštaláciu alebo použite starú syntax:

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

Pozri tiež v tomto príklade z príručky.

Variant 2

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

Výsledky funkcie dereferencovania poľa boli tiež zavedené v PHP 5.4. Ak nie je možné aktualizovať, musíte použiť (dočasnú) premennú:

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

Pozri tiež v tomto príklade z príručky.


23 pre odpoveď № 22

Poznámka: Pokúšate sa získať vlastnosť chyby bez objektov

Stane sa, keď sa pokúsite získať prístup k objektu, zatiaľ čo neexistuje žiadny objekt.

Typickým príkladom pre objektové oznámenie by bolo

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

V tomto prípade, $users je pole (teda nie objekt) a nemá žiadne vlastnosti.

Je to podobné ako prístup k neexistujúcemu indexu alebo kúču poľa (pozri Upozornenie: Nedefinovaný index).

Tento príklad je oveľa jednoduchší. Najčastejšie takéto oznámenie signalizuje nekontrolovanú návratovú hodnotu, napr. keď sa knižnica vráti NULL ak objekt neexistuje alebo lenneočakávaná objektová hodnota (napr. vo výsledku Xpath, štruktúry JSON s neočakávaným formátom, XML s neočakávaným formátom atď.), ale kód nekontroluje takúto podmienku.

Keďže tieto non-objekty sa často spracúvajú ďalej, často dochádza k fatálnej chybe pri volaní metódy objektu na non-object (pozri: Smrteľná chyba: Volanie na funkciu člena ... na ne-objekt) zastavenie skriptu.

Dá sa ľahko predísť kontrolou chybových podmienok a / alebo že premenná zodpovedá očakávaniam. Tu také oznámenie s DOMXPath príklad:

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

Problém je v prístupe k nodeValue Vlastnosť (pole) prvej položky, zatiaľ čo nebola skontrolovaná, ak existuje alebo nie je. \ t $result kolekcie. Namiesto toho sa oplatí urobiť kód explicitnejším priradením premenných k objektom, na ktorých kód pracuje:

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

Súvisiace chyby:


22 pre odpoveď № 23

Výstraha: [Funkcia] očakáva, že parameter 1 bude zdrojom, booleanom

(Všeobecnejšia variácia Upozornenie: mysql_fetch_array () očakáva, že parameter 1 bude zdrojom, boolean daný)

Zdroje sú a typ v PHP (ako sú reťazce, celé čísla alebo objekty). Zdroj je nepriehľadný blok, ktorý nemá vlastnú vlastnú hodnotu. Zdroj je špecifický a definovaný určitým súborom funkcií PHP alebo rozšírením. Napríklad rozšírenie Mysql definuje dva typy zdrojov:

V module MySQL sa používajú dva typy prostriedkov. Prvým z nich je identifikátor prepojenia pre databázové spojenie, druhý zdroj, ktorý obsahuje výsledok dotazu.

Rozšírenie cURL definuje iné dva typy zdrojov:

... rukoväť cURL a rukoväť cURL.

Kedy var_dumped, hodnoty vyzerajú takto:

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

resource(1) of type (curl)

To je všetko, čo je najviac zdrojov, číselný identifikátor ((1)) určitého typu ((curl)).

Nosíte tieto zdroje a odovzdávate ichrôzne funkcie, pre ktoré takýto prostriedok niečo znamená. Typicky tieto funkcie alokujú určité dáta na pozadí a zdroj je len odkaz, ktorý používajú na sledovanie týchto údajov interne.


Funkcia "... očakáva, že parameter 1 bude zdrojom, zadaný boolean"Chyba je zvyčajne výsledkom nekontrolovanej operácie, ktorá mala vytvoriť zdroj, ale vrátila sa." false miesto. Napríklad fopen funkcie má tento popis:

Návratové hodnoty

Vracia zdrojový ukazovateľ súboru pri úspechu alebo FALSE pri chybe.

Takže v tomto kóde $fp buď bude resource(x) of type (stream) alebo false:

$fp = fopen(...);

Ak nechcete skontrolovať, či fopen operácia úspešná alebo neúspešná, a teda či $fp je platný zdroj alebo false a prejsť $fp na inú funkciu, ktorá očakáva zdroj, môžete dostať vyššie uvedenú chybu:

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

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

Vždy je potrebné skontrolovať návratovú hodnotu funkcií, ktoré sa pokúšajú prideliť zdroj a môže zlyhať:

$fp = fopen(...);

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

$data = fread($fp, 1024);

Súvisiace chyby:


18 pre odpoveď № 24

Upozornenie: Neoprávnená kompenzácia reťazca "XXX"

Toto sa stane, keď sa pokúsite pristúpiť k elementu poľa so syntaxou hranatej zátvorky, ale "znovu to robíte na reťazci, a nie na poli, takže operácia jasne nedáva zmysel.

Príklad:

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

Ak si myslíte, že premenná by mala byť pole, pozrite sa, odkiaľ pochádza, a problém tam opravte.


17 pre odpoveď № 25

Kód nevykonáva / čo vyzerá, aké sú časti kódu môjho PHP

Ak nevidíte žiadny výsledok z vášho kódu PHPčokoľvek a / alebo vidíte časti vášho doslovného výstupu PHP zdrojového kódu na webstránke, môžete si byť istí, že vaše PHP nie je skutočne spustené. Ak vo svojom prehliadači použijete View Source, pravdepodobne sa vám bude zobrazovať celý PHP zdrojový kód súboru ako je. Vzhľadom k tomu, PHP kód je vložený do <?php ?> tagy, prehliadač sa bude snažiť interpretovať tie ako HTML tagy a výsledok môže vyzerať trochu zmätený.

Ak chcete skutočne spustiť PHP skripty, potrebujete:

  • webový server, ktorý vykoná váš skript
  • nastaviť príponu súboru na .php, inak webový server „nevykladá ho ako taký *
  • prístup k vášmu .php súboru cez webový server

* Ak ho neprekonfigurujete, môžete nakonfigurovať všetko.

Táto posledná je mimoriadne dôležitá. Dvojité kliknutie na súbor ho pravdepodobne otvorí vo vašom prehliadači pomocou adresy, napríklad:

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

To je úplne obísť akýkoľvek webový server, ktorý môže mať spustený a súbor nie je dostať interpretované. Musíte navštíviť adresu URL súboru na webovom serveri, pravdepodobne niečo ako:

http://localhost/my/file.php

Môžete tiež skontrolovať, či používate krátke otvorené značky <? namiesto <?php a vaša konfigurácia PHP vypne krátke otvorené značky.

Pozri tiež Kód PHP sa nevykonáva, namiesto toho sa na stránke zobrazuje kód


16 pre odpoveď № 26

Upozornenie: mysql_connect (): Prístup bol odmietnutý pre používateľa „name“ @ „host“

Toto upozornenie sa zobrazí, keď sa pripojíte k serveru MySQL / MariaDB s neplatnými alebo chýbajúcimi povereniami (užívateľské meno / heslo). Tak to je zvyčajne nie problém s kódom, ale problém s konfiguráciou servera.

  • Pozrite si stránku manuálu mysql_connect("localhost", "user", "pw") pre príklady.

  • Skontrolujte, či ste skutočne použili $username a $password.

    • Je to nezvyčajné, že získate prístup bez hesla - čo je to, čo sa stalo, keď Upozornenie: povedal (using password: NO).
    • Iba lokálny testovací server zvyčajne umožňuje spojenie s užívateľským menom root, žiadne heslo a test názov databázy.

    • Môžete otestovať, či "re naozaj správne pomocou klienta príkazového riadka:
      mysql --user="username" --password="password" testdb

    • Používateľské meno a heslo sú malé a veľké písmená a medzery sú nie ignorované. Ak vaše heslo obsahuje meta znaky $, uniknúť im, alebo vložiť heslo jednoduché úvodzovky.

    • Väčšina zdieľaných poskytovateľov hostingu predeclare mysqlúčty v súvislosti s unixovým užívateľským účtom (niekedy len prefixy alebo extra číselné prípony). Pozrite si dokumentáciu vzoru alebo dokumentácie a CPanel alebo akékoľvek rozhranie pre nastavenie hesla.

    • Pozrite si manuál MySQL Pridanie používateľských účtov pomocou príkazového riadka. Pri pripojení ako administrátor môžete zadať dotaz ako:
      CREATE USER "username"@"localhost" IDENTIFIED BY "newpassword";

    • Alebo použite Adminer alebo Workbench alebo akýkoľvek iný grafický nástroj na vytvorenie, kontrolu alebo opravu podrobností účtu.

    • Ak môžete "t opraviť vaše poverenia, potom požiadať internet na" prosím, pomôžte "nebude mať žiadny vplyv Iba vy a váš poskytovateľ hostingu majú povolenia a dostatočný prístup na diagnostiku a opravu vecí.

  • Skontrolujte, či ste dosiahnuť databázový server pomocou názvu hostiteľa, ktorý zadal váš poskytovateľ:
    ping dbserver.hoster.example.net

    • Skontrolujte to z konzoly SSH priamo na webovom serveri. Testovanie z vášho lokálneho vývojového klienta na váš zdieľaný hostingový server je zriedka zmysluplné.

    • Často len chcete, aby bol názov servera "localhost", ktorý normálne využíva lokálne pomenovanú zásuvku, ak je k dispozícii. Inak môžete vyskúšať "127.0.0.1" ako núdzový.

    • Mal by váš server MySQL / MariaDB počúvať na inom porte, potom použiť "servername:3306".

    • Ak sa to nepodarí, potom je tu pravdepodobne problém s firewallom. (Off-topic, nie programová otázka.

  • Pri použití konštanty ako napr. DB_USER alebo DB_PASSWORD, skontrolujte, či sú reálne definovaný.

    • Ak dostanete "Warning: Access defined for "DB_USER"@"host"" a a "Notice: use of undefined constant "DB_PASS"", potom je to váš problém.

    • Overte, či napr. xy/db-config.php bol skutočne zahrnutý a whatelse.

  • Skontrolujte správne nastavenie GRANT oprávnenie.

    • Nie je dostatočné mať username+password dvojica.

    • Každý účet MySQL / MariaDB môže mať pripojenú sadu oprávnení.

    • Tie môžu obmedziť, ku ktorým databázam sa môžete pripojiť, z ktorých môže pochádzať spojenie klient / server a ktoré dotazy sú povolené.

    • Varovanie "Prístup odmietnutý" sa môže tiež zobraziť mysql_query hovory, ak nemáte povolenie SELECT z konkrétnej tabuľky, alebo. \ t INSERT/UPDATEa častejšie DELETE čokoľvek.

    • Môžeš upraviť povolenia účtu pri pripojení na klienta príkazového riadka pomocou. \ t účet administrátora s dotazom ako:
      GRANT ALL ON yourdb.* TO "username"@"localhost";

  • Ak sa najskôr zobrazí upozornenie Warning: mysql_query(): Access denied for user ""@"localhost" potom môžete mať php.ini-predkonfigurovaný pár účtov / hesiel.

    • Skontrolujte, či mysql.default_user= a mysql.default_password= majú zmysluplné hodnoty.

    • Často sa jedná o konfiguráciu poskytovateľa. Tak kontaktujte ich podporu pre nesúlady.

  • Nájdite dokumentáciu poskytovateľa zdieľaného hostiteľa:

  • Všimnite si, že môžete mať aj vyčerpané dostupné združenie pripojení, Dostanete prístup zamietnutý varovania pre príliš veľa súbežných pripojení. (Musíte prešetriť nastavenie. Je to problém s konfiguráciou servera mimo témy, nie programová otázka.)

  • Váš klient libmysql verzia nemusí byť kompatibilná s databázovým serverom. Bežne sú servery MySQL a MariaDB dostupné pomocou PHP kompilovaného v ovládači. Ak máte vlastné nastavenie, alebo zastaralú verziu PHP, a oveľa novší databázový server, alebo výrazne zastaraný - potom môže nesúlad verzií zabrániť pripojeniam. (Nie, musíte sa vyšetriť sami. Nikto nemôže uhádnuť vaše nastavenie).

Ďalšie referencie:

Btw, pravdepodobne nebudete chcieť používať mysql_* funkcie, Noví migranti často migrujú na mysqli, ktorý je však rovnako zdĺhavý. Namiesto toho čítajte ďalej CHOP a pripravené vyhlásenia.
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


14 pre odpoveď № 27

Upozornenie: Prevod poľa na reťazec

Toto sa jednoducho stane, ak sa pokúsite zaobchádzať s poľom ako s reťazcom:

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

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

Pole nemôže byť jednoducho echo"d alebo spojené s reťazcom, pretože. \ tvýsledok nie je dobre definovaný. PHP použije reťazec "Array" namiesto poľa a spustí upozornenie, aby poukázalo na to, že "to pravdepodobne nie je to, čo bolo zamýšľané, a že by ste tu mali kontrolovať svoj kód. Pravdepodobne budete chcieť niečo podobné."

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

Alebo slučky poľa:

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

Ak sa toto upozornenie objaví niekde, nevzdávajte saočakávajú, že to znamená, že premenná, o ktorej si myslíte, že je reťazec, je vlastne pole. To znamená, že máte v kóde chybu, ktorá robí túto premennú pole namiesto reťazca, ktorý očakávate.


11 pre odpoveď № 28

Upozornenie: Rozdeľte sa o nulu

Výstražné hlásenie "Rozdelenie nulou" je jedným znajčastejšie kladené otázky medzi novými vývojármi PHP. Táto chyba nespôsobí výnimku, preto niektorí vývojári občas upozornenie zrušia pridaním operátora potlačenia chýb @ pred výrazom. Napríklad:

$value = @(2 / 0);

Ale ako pri každom varovaní, najlepší prístupby bolo zistiť príčinu varovania a vyriešiť ho. Príčina varovania bude pochádzať z akejkoľvek inštancie, v ktorej sa pokúsite rozdeliť hodnotou 0, premennou rovnou 0 alebo premennou, ktorá nebola priradená (pretože NULL == 0), pretože výsledok bude "nedefinovaný".

Ak chcete toto upozornenie opraviť, mali by ste ho prepísaťvýraz, aby zistil, či hodnota nie je 0, ak je, urobte niečo iné. Ak je hodnota nula, nemali by ste sa deliť, ani meniť hodnotu na 1 a potom deliť tak, aby rozdelenie malo za následok ekvivalent rozdelenia iba prídavnou premennou.

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
}

Súvisiace otázky:


8 pre odpoveď № 29

Prísne normy: Nestatická metóda [<Class> :: <metóda>] by nemali byť nazývané staticky

Vyskytne sa, keď sa pokúsite zavolať neštatickú metódu v triede, pretože bola statická a máte aj E_STRICT vlajka vo vašom error_reporting() nastavenie.

Príklad:

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

HTML::br() alebo $html::br()

Táto chyba sa môže vlastne vyhnúť pridaním E_STRICT na error_reporting(), napr

error_reporting(E_ALL & ~E_STRICT);

od verzie 5.4.0 a vyššie, E_STRICT je zahrnutý v E_ALL [ref]. Ale to nie je prospešné. Riešením je definovať zamýšľanú statickú funkciu ako skutočnú static :

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

alebo volať funkciu konvenčne:

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

Súvisiace otázky:


2 pre odpoveď № 30

Fatálna chyba: [TraitA] a [TraitB] definujú rovnakú vlastnosť ([$ x]) v zložení [ClassC]

Vyskytne sa, keď sa trieda pokúsi use viacerých znakov, ak majú dve alebo viac týchto vlastností definovaná vlastnosť s rovnakým menom as vlastnosťou, ktorá má odlišné počiatočné hodnoty.

Príklad:

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

problematické: Hoci je možné vyriešiť konflikty medzi konkurenčných metódV súčasnosti neexistuje žiadna syntax, ktorá by vyriešila konflikt medzi dvoma konkurenčnými vlastnosťami. Jediným riešením v tomto čase je Refactor; vyhnúť sa konfliktu medzi názvami vlastností, ktoré spôsobujú fatálnu chybu.


Súvisiace otázky: