Získání jedné hodnoty z tabulky

Školení, která pořádám

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, diskuse: 11 (nové: 0)

Diskuse

eMVe:

na to snad nepotrebujes ani list, ne?

anode:

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

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");

ikona Jakub Vrána OpenID:

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í.

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.

ikona Jakub Vrána OpenID:

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.

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).

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.

ikona Jakub Vrána OpenID:

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

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á.

ikona MiSHAK:

Zase ten list :)

Diskuse je zrušena z důvodu spamu.

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.