Autor Zpráva
Karolína
Profil *
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
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 *
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
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
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 *
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
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 *
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
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
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ší).

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:

0