PHP és AJAX kommunikáció saját error függvény

PHP és AJAX kommunikáció saját error függvény
2013-06-22T21:16:03+02:00
2013-06-23T09:55:48+02:00
2022-11-29T06:50:38+01:00
die.laszlo
Sziasztok!
A következő problémával fordulok hozzátok:

Szeretnék készíteni, egy olyan error függvényt, amivel képes vagyok fájlba, böngészőbe kiíratni a hibákat. Akár ha nem létezik a változó név a függvény vagy hiányzik egy pontos vessző. Ez azért lenne szükséges számomra, mert ajax kommunikációban szeretném azt meg írni, hogy kapjon vissza egy json tömböt a javascript, amibe ha error: 1 szerepel, akkor valamilyen hiba van a php fájlba és azt ki tudom íni console.log()-al.

Remélem sikerült le írnom a problémám. Előre is köszönöm a választ.
Mutasd a teljes hozzászólást!
A szintaktikai hibábak már a fejlesztés idején el kell kapni (különben úgysem fog működni), ezért php hibajezét be kell kapcsolni

a php.ini-ben:

... error_reporting = E_ALL & ~E_NOTICE ... display_errors = On ...

Ezt a beállítást persze éles környzetben nem szabad használni

az ajax alertezze azt ki, hogy melyik fájlba milyen típúsú hiba történt, ezzel meg tudom keresni a probléma okát



Ilyet a js csak akkor tud csinálni, ha a php-ból pontos adatot adsz át.


Én csináltam egy rövid függvényt, ami a php-ban elkapott hibákat (szemantikai) naplózza.

error.php

<?php function error_kiir($uzenet){ $file = fopen("error.log", "a") or exit("Unable to open file!"); fwrite($file, date('Ymd His'). " : " . $uzenet . "\n"); fclose($file); } ?>

hívása pedig (egy PHP PDO lekérdezés, amely tárolt eljárást hív meg):

<?php /* lekérdezés feldolgozása server felé, adat visszaadása kliens felé MySQL */ function lekerdez($lek_nev=null, $paramok=array(null)) { include('avir_conn.php'); $stmt = array(); if(!empty($lek_nev)){ $eljaras_neve=$lek_nev; } for($i=0; $i<count($paramok); $i++){ if($i==0){ $param_helyett="?"; } else{ $param_helyett.=",?"; } } if($i==0) { $sql="call ".$eljaras_neve."()" ; } else { $sql="call ".$eljaras_neve ." (".$param_helyett . ")"; } if($sql) { // echo "sql: ".$sql. "<br>"; try{ $rs=$dbh->prepare($sql); for($c=0;$c<count($paramok);$c++){ // echo "paramok $c:".$paramok[$c]."<br>"; $rs->bindParam($c+1,$paramok[$c],PDO::PARAM_STR); } $rs->execute(); while ($row=$rs->fetchAll(PDO::FETCH_ASSOC)){ $result=$row; // print_r($row); } // var_dump($result); unset($dbh); return $result; } catch(PDOException $e){ unset($dbh); require_once('error.php'); error_kiir(" try-ág: $sql " . $e->getMessage()); while ($row=$rs->fetchAll(PDO::FETCH_ASSOC)){ $result=$row; error_kiir(" foreach: " . $row); // print_r($row); } // var_dump($result); if (count($stmt)>0){ foreach($result as $sor){ error_kiir(" foreach: " . $sor); } } $result="hiba"; return $result; } } else{ unset($dbh); require_once('error.php'); error_kiir(" sql-ág: " . $e->getMessage()); $result="hiba"; return $result; } } ?>

Ebben a második függvényben láthatod a tesztelés közbeni kiírásokat is (persze kikommentezve), ami nagyon jól használható hiba kereséshez.

Az elkapott hibák bekerülnek egy error.log nevű fájlba, amiben csak a saját hibáid vannak.
Mutasd a teljes hozzászólást!

  • set_error_handler() függvény?
    Mutasd a teljes hozzászólást!
  • Nem sikerül úgy be állítani, valamiért a kettőspontot és lezáratlan függvényeket és egyéb súlyos hibákat nem akarja kezelni. :(
    Mutasd a teljes hozzászólást!
  • Error log van? Abba bekerül az ilyen.
    Vagy ha kijelzi a php, akkor közvetlenül meghívva a php-t, szintén kiírja.
    Vagy php -l kapcsolóval detektálható hogy van-e benne szintaktikai hiba.
    Mutasd a teljes hozzászólást!
  • A lényeg az, hogy az teljesen ki éget, amikor csinálok egy ajax kommunikációt és ha bármilyen apró kis php hiba van, adatbázis kapcsolódás stb. Amit a normális php kiírna a böngészőbe, azonban mivel ajax kommunikáció van, ezért az egész oldal lehal és elég lassúcska a munka, error log-ból élni. Ezért gondoltam, hogy írnék egy olyan javascriptben, ha az error nem nulla hanem egy, akkor át irányítom egy függvényre, amit dob a php ezáltal csak consolo.log-ot kell néznem, amit fejlesztés közben amúgy is kell. :)
    Mutasd a teljes hozzászólást!
  • Én nem szoktam console.logot használni.

    Ha kíváncsi vagyok mi jött, akkor a Network fülön megnézem az ajaxos kérést. Abból lehet látni, hol lehetett a hiba, ha meg kijelzi ott a hibát, akkor az is látszik egyből.

    A sql kapcsolatra, programhibára jó lehet a handler, de ilyen szintaktikai hibára nem. Máshogy ezt nem tudod, vagy log fájl vagy kiíratás és Network fül.
    Mutasd a teljes hozzászólást!
  • Akár ha nem létezik a változó név a függvény vagy hiányzik egy pontos vessző.


    Szerinten a szintaktikai hibát (pl. pontos vessző hiányzik) ezzel a módszerrel nem tudud megfogni, a programod elszáll.

    A szemantikai hibákat tudod kezelni igy, tehát ,ha nem tudsz kapcsolódni az adatbázishoz, netén hibás az sql utasításod, azt le tudod kezelni.

    pl.
    feladat:ki kell lolvasni egy sort a táblából, amit attól függően, hogy a felhasználó milyen adatot ad meg.
    megoldás:
    1. a felhasználótól beekéred az adatot
    2. ajax-szal átküldöd a php-nek
    3. a php létrehoz egy sql utasítást a felhasználótól kapott adattal
    4.létrehozza az adatbázis kapcsolatot,
    5.lekérdezi az adtot
    6. lezárja az adatbázis kapcsolatot
    ha minden tökéletesen lefut visszadja az adatot a felhasználónak, ott a böngészőben megjelenik.
    Azonban, ha az adatlekérésnél bármi történik, ezt le tudud kezelni, és ilyenkor az adatok helyett egy hibakódót adsz vissza a kliensnek, és az ajax success ágában figyeled az visszatérő adatot.


    ... success: function(data) { if(data=!0){$("#kontener").html(data);} else{ alert("hiba történt!");} } ...
    Mutasd a teljes hozzászólást!
  • Ez kifejezetten tetszik, de számomra debugolásra kellene, nem a felhasználó miatt. Ugyanis nem magam dolgozom egy elég nagy rendszerben, ami ajaxal kommunikál. Ha elírok valamit php-ben akkor ha használja azt a részt valamelyik menüpontnál, akkor elszáll ezáltal teljesen véletlenül jövünk rá, hogy ott probléma van. Ezért gondoltam valami olyasmire ha nem is teljesen, de legalább segíti a munkámat, hogy ne kelljen mindig error_log-ba turkálni, így az ajax alertezze azt ki, hogy melyik fájlba milyen típúsú hiba történt, ezzel meg tudom keresni a probléma okát. De azzal, hogy csak hiba történt a rendszerbe, nem jutottam előrébb. :)
    Mutasd a teljes hozzászólást!
  • A szintaktikai hibábak már a fejlesztés idején el kell kapni (különben úgysem fog működni), ezért php hibajezét be kell kapcsolni

    a php.ini-ben:

    ... error_reporting = E_ALL & ~E_NOTICE ... display_errors = On ...

    Ezt a beállítást persze éles környzetben nem szabad használni

    az ajax alertezze azt ki, hogy melyik fájlba milyen típúsú hiba történt, ezzel meg tudom keresni a probléma okát



    Ilyet a js csak akkor tud csinálni, ha a php-ból pontos adatot adsz át.


    Én csináltam egy rövid függvényt, ami a php-ban elkapott hibákat (szemantikai) naplózza.

    error.php

    <?php function error_kiir($uzenet){ $file = fopen("error.log", "a") or exit("Unable to open file!"); fwrite($file, date('Ymd His'). " : " . $uzenet . "\n"); fclose($file); } ?>

    hívása pedig (egy PHP PDO lekérdezés, amely tárolt eljárást hív meg):

    <?php /* lekérdezés feldolgozása server felé, adat visszaadása kliens felé MySQL */ function lekerdez($lek_nev=null, $paramok=array(null)) { include('avir_conn.php'); $stmt = array(); if(!empty($lek_nev)){ $eljaras_neve=$lek_nev; } for($i=0; $i<count($paramok); $i++){ if($i==0){ $param_helyett="?"; } else{ $param_helyett.=",?"; } } if($i==0) { $sql="call ".$eljaras_neve."()" ; } else { $sql="call ".$eljaras_neve ." (".$param_helyett . ")"; } if($sql) { // echo "sql: ".$sql. "<br>"; try{ $rs=$dbh->prepare($sql); for($c=0;$c<count($paramok);$c++){ // echo "paramok $c:".$paramok[$c]."<br>"; $rs->bindParam($c+1,$paramok[$c],PDO::PARAM_STR); } $rs->execute(); while ($row=$rs->fetchAll(PDO::FETCH_ASSOC)){ $result=$row; // print_r($row); } // var_dump($result); unset($dbh); return $result; } catch(PDOException $e){ unset($dbh); require_once('error.php'); error_kiir(" try-ág: $sql " . $e->getMessage()); while ($row=$rs->fetchAll(PDO::FETCH_ASSOC)){ $result=$row; error_kiir(" foreach: " . $row); // print_r($row); } // var_dump($result); if (count($stmt)>0){ foreach($result as $sor){ error_kiir(" foreach: " . $sor); } } $result="hiba"; return $result; } } else{ unset($dbh); require_once('error.php'); error_kiir(" sql-ág: " . $e->getMessage()); $result="hiba"; return $result; } } ?>

    Ebben a második függvényben láthatod a tesztelés közbeni kiírásokat is (persze kikommentezve), ami nagyon jól használható hiba kereséshez.

    Az elkapott hibák bekerülnek egy error.log nevű fájlba, amiben csak a saját hibáid vannak.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd