Získání jedné hodnoty z tabulky

Většina databázových rozhraní nabízí funkci pro jednorázové položení dotazu databázi a vrácení prvního sloupce z prvního řádku výsledku (obvykle jediného). Rozšíření MySQL takovou funkci nenabízí a místo ní nabízí mysql_result, které se jako parametr předává výsledek funkce mysql_query, číslo požadovaného řádku a volitelně číslo nebo název sloupce. Tato funkce funguje bez problémů do té doby, kdy výsledek neobsahuje ani jeden řádek, potom skončí chybou Unable to jump to row 0. Místo zdlouhavého zjišťování, zda se alespoň jeden výsledek vrátil a následného uvolňování paměti, se dá použít funkce mysql_fetch_row spolu s konstrukcí list.

<?php
list($url) = mysql_fetch_row(mysql_query("SELECT url FROM tabulka WHERE id = $id"));
?>

Pokud dotaz nevrátí žádný výsledek, bude proměnná $url obsahovat null.

Jakub Vrána, Dobře míněné rady, 27.12.2006, on-line

Diskuse

eMVe:

na to snad nepotrebujes ani list, ne?
27.12.2006 01:37:44

anode:

Ale jistěže ano. Bez listu by v $url bylo jednoprvkové pole, pro obsah by se muselo přistoupit přes $url[0]...
27.12.2006 02:53:07

Tomas:

v tom mysql_result ale nula nevadi, ne? Co tento zapis?

$rs = MySQL_Query("SELECT url FROM tabulka WHERE id = $id");
if (@$url = MySQL_Result($rs, 0)) {
  echo("URL je: ".$url);
} else echo("Tabulka je prazdna\n");
27.12.2006 10:59:00

ikona Jakub Vrána:

Problém je právě s tím zavináčem. mysql_result() nemusí neuspět jenom kvůli tomu, že je tabulka prázdná, ale může dojít i k jiné chybě, o které se nedozvíme.

U dlouhoběžících skriptů by se navíc proměnná $rs měla uvolnit funkcí mysql_free_result(), pokud výsledek mysql_query() nepřiřazuji do proměnné, tak to potřeba není.
27.12.2006 11:02:49

Tomas:

Pokud dojde k jine chybe tak je to stejne nezadouci.

Mozna by tedy hlasku "Tabulka je prazdna" bylo lepsi nahradit jinou hlaskou (dle toho k cemu data z tabulky potrebuju vydolovat *), kazdopadne ale mam jasne urcenou (nejakou **) chybu pri nacitani dat z DB, nebo ne?

Diky za poznanku k MySQL_Free_Result() je samo dobre ji pouzit, nechtel jsem ale priklad nijak dramatizovat, aby byl co nejjednodussi a bylo jasne o co mi jde.

*) jsou li "zivotne dulezita" pro dalsi chod skriptu, tak neco ve smyslu jako ze problem s dolovanim dat z DB, pripadne pokud jsou jen pro to zobrazeni URL, tak staci, dle meho, misto chyby dat "-", "neuvedeno" nebo nic

**) pokud bych chtel vedet jakou musel bych se pidit dal a nejak ji osetrit, stejne ale jako ve Vasem prispevku.

Pokud placam nesmysly tak sorry, jen me zajima jestli je muj postup taky spravnej.
27.12.2006 16:28:08

ikona Jakub Vrána:

Problém se zavináčem je v tom, že skryje všechny chyby, tedy i ty, o kterých bych se rád dozvěděl třeba z logu.
27.12.2006 18:09:39

ikona dgx:

No, ono "zdlouhavého zjišťování" je jedno volání

$url = $rec ? $rec[0] : NULL;

nebo něco podobného, což mi nepřípadá jako zdlouhavé, ale spíš jako srozumitelné, narozdíl od list($url).

27.12.2006 13:01:55

Tomas:

trochu mimo misu:

Nedavno (no, nejakej ten patek to bude) sem nekde cetl nejaky "benchmarky" a tahle konstrukce je prej daleko pomalejsi nez pouziti klasickyho if. Ale bylo tam uvedeno ze pripad od pripadu, uz si nepamatuju kde to bylo, myslim ze nejhorsi pripad pouziti byl pri vypisu dat z promenny pres echo, pri prirazeni hodnoty uz nevim.
27.12.2006 16:33:04

ikona Jakub Vrána:

Psal o tom sám David: http://www.dgx.cz/trine/item/php-puvab-optimalizace-rychlosti :-).
27.12.2006 18:08:46

footcha:

Vzhledem k případu, v jakém by ternární operátor byl použit (vždyť se jedá o jedno jeho volání, protože neprocházíme cyklus), tak je optimalizace na rychlost zbytečná.
28.12.2006 23:41:56

ikona MiSHAK:

Zase ten list :)
2.1.2007 02:24:28
avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.