Diskuze: cisla radku kodu k sql dotazu
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 9 zpráv z 9.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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 
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_handler si odchytávej jen DotazException, tam si ho zaloguj někam do souboru a nech aplikaci dál běžet.
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.
Tak super, já právě totiž zjistil, že ten globální exception handler
ti stejně nedovolí pokračovat 
<?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}
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 
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.
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
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 
Zobrazeno 9 zpráv z 9.
