Autor | Zpráva | ||
---|---|---|---|
Karolína Profil * |
#1 · Zasláno: 20. 9. 2011, 14:46:28
Ahoj,
chtěla jsem se zeptat zkušených. Když potřebuji načíst z mysql přes php jeden jediný řádek z mysql a přitom mít celý script pod absolutní kontrolou, musím to opravdu dělat tak složitě? $sql = "SELECT * FROM `ovoce` WHERE id = '5' "; $mysql_query = mysql_query($sql); if($mysql_query) { echo "Úspěch! Dotaz na mysql proběhl v pořádku"; } else { echo "Chyba! Dotaz na mysql neproběhl vůbec"; } $row = mysql_fetch_assoc($mysql_query); if($row) { echo $row['kosik']; // Vypíše se "Jablko" ale toho kódu, to je strašný ;) } else { echo "Požadovaná data neexistují"; } Díky za info... K. |
||
Joker Profil |
#2 · Zasláno: 20. 9. 2011, 14:55:38 · Upravil/a: Joker
Karolína:
V první řadě úspěch databázového dotazu snad není třeba uživateli slavnostně oznamovat :-) Dále, pokud je potřeba jen jediný sloupec, je zbytečné dělat SELECT *. A konečně, pro vrácení jediné hodnoty se dá dobře použít mysql_result. Tedy: $sql = "SELECT kosik FROM `ovoce` WHERE id = '5' "; $result = mysql_query($sql) or die("Chyba v DB dotazu!"); // poznámka, výsledkem mysql_query není „query“, ale „result set“ $data = mysql_result($result, 0); if($data === false) echo "Požadovaná data neexistují"; else echo $data; edit: Jo a ještě otázka, skutečně je sloupec ID řetězec (tj. CHAR/VARCHAR/TEXT/…)? |
||
Karolína Profil * |
#3 · Zasláno: 20. 9. 2011, 15:07:13
Joker:
„edit: Jo a ještě otázka, skutečně je sloupec ID řetězec (tj. CHAR/VARCHAR/TEXT/…)?“ Ne, je to init(5) AUTO_INCREMENT ale nechápu otázku :( Děkuji |
||
Tori Profil |
#4 · Zasláno: 20. 9. 2011, 15:07:30 · Upravil/a: Tori
Karolína:
Doplním k Jokerovu příspěvku: mezi mysql_result a mysql_fetch_array je rozdíl v tom, že když je dotaz syntakticky správně, ale nevrátí žádná data (např. kvůli neexistujícímu ID ve WHERE), tak obě funkce sice vrátí false, ale mysql_result navíc vygeneruje varování („Warning: mysql_result(): Unable to jump to row 0 on MySQL result index 1 in ... “). Jinak můžete si udělat vlastní funkce pro mysql_query, vrácení jedné hodnoty, všech řádků, a párů id=>text (ty budou asi nejčastěji potřebné), a do nich schovat ty kontroly + reakce na chybu. Sice to asi není správné řešení dělat alias pro funkci + jeden příkaz navíc, ale výsledek by byl o něco přehlednější. Další možnost je použít některou DB vrstvu, např. dibi, PDO apod., které zahrnují jak tyhle kontroly, tak třeba automatické escapování / přeformátování vstupu. |
||
Joker Profil |
#5 · Zasláno: 20. 9. 2011, 15:15:56
Karolína:
„Ne, je to init(5) AUTO_INCREMENT ale nechápu otázku :(“ V tom případě to má v SQL dotazu být jako číslo a ne jako řetězec (žádné apostrofy kolem): $sql = "SELECT * FROM `ovoce` WHERE id = 5 "; Tori: „mysql_result navíc vygeneruje varování (‚Warning: mysql_result(): Unable to jump to row 0 on MySQL result index 1“ Aha, pravda, přitom v manuálu o tom není ani slovo (resp. je, ale až v komentářích). V tom případě by bylo nejdřív ještě přes mysql_num_rows dobré zjistit, jestli ten dotaz něco vrátil. |
||
Karolína Profil * |
#6 · Zasláno: 20. 9. 2011, 15:27:29
Joker:
„V tom případě to má v SQL dotazu být jako číslo a ne jako řetězec (žádné apostrofy kolem):“ Aha, tak to jsem zase moudřejší ;) BTW k tomu Vašemu SQL dotazu. Já se v úvodu ptala na: Když potřebuji načíst z mysql přes php jeden jediný řádek ne jediný sloupec v jednom řádku ;) Jak tedy bude celý dotaz vypadat, můžete mi to ještě napsat ať vidím rozdíl. Děkuji Tori: „ale mysql_result navíc vygeneruje varování“ Naznačujete mi tím, že když se data nenačtou z důvodu neexistence, tak se podmínka splní jako by se načetla data z důvodu toho, že se načte to varování? Pokud je to tak, tak to je ovšem hodně nemilé :( A nějaký lék? |
||
Tori Profil |
#7 · Zasláno: 20. 9. 2011, 15:43:31
Karolína:
„Naznačujete mi tím...“ Ne. Jak jsem psala, obě funkce v tom případě vrací false, to se tím nijak nezmění. "Varování" = PHP chyba typu E_WARNING, nikam se nenačítá, ale rovnou se zobrazí (pokud není pomocí funkce error_reporting a/nebo nastavení display_errors zakázané vypisování chyb na obrazovku). „A nějaký lék?“ Buď před mysql_result ověřit počet vrácených záznamů funkcí mysql_num_rows, jak radí Joker, anebo místo toho použít některou z funkcí mysql_fetch_*. |
||
Karolína Profil * |
#8 · Zasláno: 20. 9. 2011, 15:54:51
Tori:
Aha, tak to není můj případ. S radostí bych klidně mohla používat mysql_result(); kdybych přes ni mohla ovšem získat dataz celého řádku, což SQL dotaz od Jokera bohužel neumožňuje a sama to asi nedám :( |
||
Michel Profil |
#9 · Zasláno: 21. 9. 2011, 09:50:45
já bych to řešil následovně:
$sql = "SELECT kosik, pocet FROM Ovoce WHERE id=5"; //Vyberu sloupečky, které potřebuji za podmínky určitého id $result = mysql_query($sql); if (mysql_num_rows($result)==1) { //Zkontroluji zda to vrátilo jeden záznam, mělo by pokud existuje dané id $row = mysql_fetch_array($result); //Přiřadím do $row echo $row['kosik'] . " " . $row['pocet']; //Vypíšu nebo udělám něco jiného } else echo "chyba"; //Pokud není vrácen právě 1 záznam, tak vypíšu chybové hlášení |
||
Joker Profil |
#10 · Zasláno: 21. 9. 2011, 10:12:14
Karolína:
„S radostí bych klidně mohla používat mysql_result(); kdybych přes ni mohla ovšem získat dataz celého řádku“ Ono to technicky jde, funkce mysql_result má ještě třetí parametr, který určuje sloupec. Akorát že v tomhle případě je mysql_fetch_* rychlejší (slespoň podle manuálu) než vícenásobné volání mysql_result. „což SQL dotaz od Jokera bohužel neumožňuje“ Část dotazu hned za SELECT udává sloupce které chcete vrátit, takže je tam stačí vyjmenovat (oddělené čárkami). Viz příklad v [#9] Michel. Nebo SELECT * vrátí všechny sloupce v tabulce, ale často to není optimální řešení, protože to může vracet i sloupce které k ničemu nepotřebujete (připomínám, že tabulka se může rozšiřovat i po napsání skriptu, takže i když teď skript vybírá všechny sloupce, mohou později přibýt nějaké další).
|
||
Časová prodleva: 13 let
|
0