BF Summer sales
Pouze tento týden sleva až 80 % na HTML & CSS a JavaScript
80 % bodů zdarma na online výuku díky naší Letní akci!

Diskuze: cisla radku kodu k sql dotazu

Aktivity (2)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30. července 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. července 16:02
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30. července 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. července 16:04
Avatar
Daniel Vítek
Redaktor
Avatar
Odpovídá na Peter Mlich
Daniel Vítek:2. srpna 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. srpna 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. srpna 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. srpna 8:05
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Daniel Vítek
Redaktor
Avatar
Odpovídá na Peter Mlich
Daniel Vítek:3. srpna 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. srpna 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. srpna 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. srpna 12:05
Avatar
Daniel Vítek
Redaktor
Avatar
Odpovídá na Peter Mlich
Daniel Vítek:3. srpna 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. srpna 12:25
Nahoru Odpovědět
3. srpna 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 :)
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 7 zpráv z 7.