Slevový týden - Srpen
30 % bodů zdarma na online výuku díky naší Slevové akci!
Pouze tento týden sleva až 80 % na e-learning týkající se Javy.

Diskusia: cisla radku kodu k sql dotazu

Aktivity (2)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30. júla 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

Skúsil som:

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

Chcem docieliť: 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.

 
Odpovedať
30. júla 16:02
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30. júla 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 :)

 
Hore Odpovedať
30. júla 16:04
Avatar
Daniel Vítek
Redaktor
Avatar
Odpovedá na Peter Mlich
Daniel Vítek:2. augusta 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.

Hore Odpovedať
2. augusta 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. augusta 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.

 
Hore Odpovedať
3. augusta 8:05
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Daniel Vítek
Redaktor
Avatar
Odpovedá na Peter Mlich
Daniel Vítek:3. augusta 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}
Hore Odpovedať
3. augusta 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 :)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3. augusta 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 :)

 
Hore Odpovedať
3. augusta 12:05
Avatar
Daniel Vítek
Redaktor
Avatar
Odpovedá na Peter Mlich
Daniel Vítek:3. augusta 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.

Editované 3. augusta 12:25
Hore Odpovedať
3. augusta 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 :)
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 7 správy z 7.