Autor Zpráva
Neas
Profil
Ahoj.
vytvořil jsem si tuto funkci pro zjištění, zda sql dotaz proběhl úspěšně a zda máme nějaké výsledky:
function sql_check($result)
{
  if(!$result)
  {
    echo "<div class='error'>chyba dotazu</div>";
    return false;
  }elseif($result->num_rows == 0)
  {
    echo "<div class='error'>Žádný záznam nenalezen.</div>";
    return false;
  }else
    return true;
}

avšak chtěl bych tuto funkci přidat do nějaké třídy. Kvůli přehlednosti však nechci vytvářet úplně novou třídu, místo toho mě totiž napadlo odvodit třídu od třídy mysqli. Narazil jsem však na problém, nejedná se o nic vážného a vlastně by to fungovalo tak jako tak, ale jsem prostě od přírody perfekcionalista:
když například použiju
$mysqli = new mysqli('bla','bla','bla','bla');
$result = $mysqli->query($dotaz);
if(sql_check($result))
  $result->fetch_array();


Pro uložení výsledků dotazu do pole je třeba vzít výsledky ($result) a použít metodu fetch_array. Něčeho podobného bych chtěl dosáhnout taky, tj. chtěl bych, abych při volání metody sql_check() mohl místo:
sql_check($result)

psát:
$result->sql_check()

Jak bych měl definici funkce napsat, abych toho docílil?
Děkuji.
AM_
Profil
Neas:

avšak chtěl bych tuto funkci přidat do nějaké třídy
máš k tomu nějaký důvod? mě to moc užitečné nepřijde a je to zbytečně složité. Nejdřív bys musel rozšířit třídu mysqli, aby query vracel nějaké rozšíření mysqli_result, a pak vytvořit to rozšíření mysqli_result, které by obsahovalo tvojí metodu.

Pár poznámek k sql_check:
-je opravdu šťastné funkcí sql_check něco echovat? nejhorlivěji se člověk většinou dotazuje do databáze ještě než začne něco vypisovat, a aby ti plandal <div> ještě před hlavičkou dokumentu... no fuj.

-někdy prázdný výsledek (0 řádků) neznamená, že došlo k nějaké chybě. Představ si, že budeš třeba chtít zjistit, zda daný uživatel je spřátelený s jiným uživatelem z nějaké cross_tabulky. Asi není adekvátní v případě, že není, vypisovat "žádný záznam nenalezen".

-pokud píšeš SQL dotazy správně a máš správně udělanou strukturu databáze, result nikdy nebude false. Takže lepší, než vypisovat na výstup "chyba dotazu", je někam do nějakého logu zaznamenat, že ti nějaký dotaz nefunguje; uživatel se to vůbec nemusí dozvědět.

Moje osobní rada zní vykašlat se na funkci sql_check protože není celkem k ničemu. Já jsem si třeba ve svém programu rozšířil třídu mysqli, a přepsal jsem query() tak, že v případě selhání dotazu mi to někam zaloguje, jaký dotaz selhal a s jakou chybou (jak jsem psal výše). Nulový počet řádků výsledku není vždy nežádoucí a pokaždé může znamenat něco jiného, proto je ho vhodné řešit až na konkrétním místě programu, nikoli ve funkcích databáze.
Neas
Profil
"máš k tomu nějaký důvod?"
Jen přehlednost.

"Pár poznámek k sql_check:"
-funkci používám až v <body>, takže mi žádný <div> před hlavičkou neplandá. Nicméně máš pravdu s dalšími dvěma odrážkami.
Díky za rady

což mě přivádí k dalšímu problému. dokud jsem nepoužíval třídu mysqli, případnou chybu jsem zobrazoval funkcí mysql_error(). Jak se toto dělá přes mysqli?
__construct
Profil
Neas:
Skúsil si hľadať?
AM_
Profil
Neas:
-funkci používám až v <body>, takže mi žádný <div> před hlavičkou neplandá.
a jak to řešíš, když třeba něco ukládáš do databáze, a předtím potřebuješ něco z DB přečíst? pak se většinou přesměrovává pomocí header() třeba i na stejnou stránku, aby při refreshi nevznikaly double-posty. A to určitě nemůžeš dělat po výpisu něčeho do dokumentu.

Jak se toto dělá přes mysqli
procedurálně mysqli_error(), objektově $mysqli->error.
Neas
Profil
AM_:
AJAXem
AM_
Profil
Neas:
AJAXem
no to potěš koště, jestli vysíláš ajaxové požadavky na server, tam obslužná rutina použije sql_check() a vyplivne ti do výstupu tu chybu. A stavět pouze na AJAXu bez alternativy pro případ, že ho klient nepodporuje, taky není zrovna dobré.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: