Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Swiftu. Zároveň využij výhodnou slevovou akci až 30 % zdarma při nákupu e-learningu - více informací.
swift week + discount 30
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.7.2020 16:02

Mam vytvorenou funkci, ktera vola sql dotaz.
Bylo by mozne pridat tam nekde pri selhani dotazu, aby vypsal cislo radku, pripadne class, odkud to volam? Ted jsem nasel, ze cislo radku je mozne, ale zajimalo by mne, zda by to slo automaticky

Zkusil jsem:

// drive
function myQuery($query='')
{
$sql->query($query);
if (error) {...}
}

myQuery("SELECT ...");

// ted
function myQuery($query='', $line_number='')
{
$sql->query($query);
if (error) {echo $line_number;}
}

myQuery("SELECT ...", __LINE__); // potrebuji vedet cislo tohoto radku, pripadne class nebo lepe jmeno souboru

Chci docílit: Potreboval bychm it jednoduchy dotaz a pri debugovani vypdat informaci, kdyz dotaz selze, tak

sql chybu + text dotazu + jmeno souboru + cislo radku.

Podobne, jak se vypisuji php chyby. Az na to, ze bych potreboval do moji sql class dostat cislo radku, ze ktereho tu funkci volam v jinem souboru.

 
Odpovědět
30.7.2020 16:02
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.7.2020 16:04

Jde o to, ze mam treba v hlavni class nejake funkce, ktere jsou podobne funkcim jinde. Trochu binec v kodu. A kdyz mi to vypise sql chybu, treba 'sloupec neexistuje' a dotaz, tak podle toho dotazu nejsem schopen odhadnou, ve kterem souboru ten dotaz je. Tak ve 30% pripadu, kdyz se na program podivam po pul roce. Ale dost mne to brzdi pri opravach, protoze pak musim hledat jednotliva slova nebo jmena tabulek ve vsech php souborech programu :)

 
Nahoru Odpovědět
30.7.2020 16:04
Avatar
Daniel Vítek
Tvůrce
Avatar
Odpovídá na Peter Mlich
Daniel Vítek:2.8.2020 20:36

Pokud tě správně chápu, tak bys měl místo echa vyhodit exception. Potom na něm můžeš zavolat ->getTrace (případně ->getTraceAsString) a dojít k místu odkud se dotaz volá.

Pokud nechceš při chybě v SQL shodit celou aplikaci, tak si vytvoř vlastní DotazException, přes set_exception_han­dler si odchytávej jen DotazException, tam si ho zaloguj někam do souboru a nech aplikaci dál běžet.

Nahoru Odpovědět
2.8.2020 20:36
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.8.2020 8:05

Shozeni app nevadi. Vlastni exception uz jsem videl. Jen jsem netusil, ze to php dela samo, uklada si cestu chyby. Jde mi o to vypsat sql dotaz a vedet, na kterem radku kodu a v souboru ho mam najit :) Coz je sikovne, kdyz mas jako ja, nekolik podobnych dotazu v ruznych souborech.

 
Nahoru Odpovědět
3.8.2020 8:05
Avatar
Daniel Vítek
Tvůrce
Avatar
Odpovídá na Peter Mlich
Daniel Vítek:3.8.2020 9:53

Tak super, já právě totiž zjistil, že ten globální exception handler ti stejně nedovolí pokračovat :D

<?php

ini_set('display_errors', 1);

class DotazException extends \Exception {  }

set_exception_handler(function (Throwable $exception) {
    if ($exception instanceof DotazException) {
        file_put_contents("error_" . md5($exception->getTraceAsString()), "Wrong SQL:\n{$exception->getMessage()}\n\nTrace:\n{$exception->getTraceAsString()}");
    }
    else {
        throw $exception;
    }
});

function myQuery($query)
{
    //$sql->query($query);

    if (true) {
        throw new DotazException($query);
    }
}

function anotherFunction() {
    myQuery('SELECT Hello FROM World');
}

anotherFunction();

Log:

Wrong SQL:
SELECT Hello FROM World

Trace:
#0 /mnt/c/Users/vitek/TEMP/www/temp/index.php(26): myQuery('SELECT Hello FR...')
#1 /mnt/c/Users/vitek/TEMP/www/temp/index.php(29): anotherFunction()
#2 {main}
Nahoru Odpovědět
3.8.2020 9:53
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3.8.2020 12:05

Ja mam pocit, ze jsem resil nekde v nastaveni jednoho serveru, ze mi zobrazoval 1 radek chyb misto takove te tabulky, co vypisuje php na localhostu.
Mne prave desne stvalo, ze u sql dotazu nic takoveho nevypisuje a tak jsem hledal jine reseni, s tim line. Uz mne nebavilo to dohledavat.
V podstate by mi stacilo, kdyby uzivateli vypsal chybu ve tvaru 1/230, jakoze soubor 1, radek 230. A potom nejakou funkci zobrazil seznam souboru *.php pro admina :) Ale zatim to resim tak, ze tam mam moznost zapnout debug mod a vypise mi aspon cislo radku. Nekdy v pristi uprave tam doplnim zbytek :)

 
Nahoru Odpovědět
3.8.2020 12:05
Avatar
Daniel Vítek
Tvůrce
Avatar
Odpovídá na Peter Mlich
Daniel Vítek:3.8.2020 12:24

Taková ta tabulka bude nejspíš html_errors https://www.php.net/…guration.php#…

U toho jednořádkového erroru bude problém, že ti to vypíše přímo tu funkci myQuery, a ne místo odkud byla volaná - k tomu potřebuješ tu trace.

Editováno 3.8.2020 12:25
Nahoru Odpovědět
3.8.2020 12:24
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.8.2020 9:29

Jeste mne napadl jeden, celkem elegantni, zpusob. V debug modu totiz vypisuji i sql dotaz. Takze by stacilo pridat komentar do sql dotazu

$query = "
-- ".__LINE__."
SELECT * FROM tabulka
";
$sql->query($query);

A pri chybe mi to vypise sql->error + query. a kdyz je to ok, tak ten komentar mi sql driver odfiltruje. Ale samozrejme je to prace navic, nez kdyz to vraci automatika, bez nutnosti to psat

-- 123
SELECT * FROM tabulka
 
Nahoru Odpovědět
20.8.2020 9:29
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.8.2020 12:34

Hele, to reseni s exception mi tak uplne nefunguje. Zpusobuje mi to asi pad programu. Zatim to zkoumam. Ale chvili to fungovalo dobre. Nejak se app zacyklila na tehle chybe v podmince. A misto, aby ukazal chybu, bila stranka. A pritom to bez pridani me_data bez problemu fungovalo, tahal snad i data z sql :)

$user_id = $app->getUser('nick');
$me_data = $ws->getPersonListFull(array('userid'=>$user_id, 'remove_list_sql'=>true, 'remove_list_phone'=>true));

$user_id  = $app->getUser('id');
$sql_data = $ws->getPersonListFull(array('remove_list_ldap'=>true, 'remove_list_phone'=>true));
if (!(is_array($me_data) && count($me_data)>0 || is_array($sql_data) count($sql_data)>0))
//if (!(is_array($me_data) && count($me_data)>0 || is_array($sql_data) && count($sql_data)>0)) // opraveno pak

class classSqlException extends Exception {  }

set_exception_handler(function (Throwable $exception) {
    if ($exception instanceof classSqlException) {
//    if ($exception instanceof classSql) { // ted si nejsem jisty, zda tam nebylo tohle
//        var_dump($exception->getTraceAsString());
        echo '<pre>'.$exception->getTraceAsString();
//      echo $text;
    }
    else {
//        throw $exception;
    }
});

Ale asi jsem to spatne pouzil, mel jsem to navazat asi jako extend na sql. Kazdopadne, kdyz se mi to zacyklilo, tak jsem neprisel na to, proc a ani presun do sql po F5 nereagoval. Musel jsem zhodit server php-stop :) A kdyz to nic neukazovalo, tak jsem prave zpanikaril a cely kod s tim poprepisovat a predchozi verzi uz asi ani nemam :)

 
Nahoru Odpovědět
24.8.2020 12:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.