Autor | Zpráva | ||
---|---|---|---|
Ikki Profil |
Ahoj,
přemýšlím jak porovnat podmínku s získanými daty. Je mi jasné, že se jedná o banalitu, ale nějak mi to nemyslí. // Získání dat $data = $mysqli->query("SELECT * FROM tabulka ORDER BY id")->fetch_all(); // Porovnání if($data['nazev'] == 'hodnota' && $data['aktivni'] == 1){ echo "Položka je aktivní"; } Nicméně tento kód (napsán na rychlovku jako ukázka) porovnává pouze jeden řádek s podmínkou, nikoli všechny. Napadlo mě to řešit prostřednictvím cyklu foreach/while, ale přijde mi to zbytečně složité a funkce navíc. Díky za tipy a pěknej večer. |
||
mckay Profil |
#2 · Zasláno: 20. 7. 2020, 21:06:33
Ikki:
Pokud ta podmínka je vždycky stejná pro všechny data, tak asi přes WHERE část dotazu a zkontrolovat, že počet vybraných řádků odpovídá počtu řádků v tabulce.
Pokud ta podmínka je pro každý řádek jiná a má to kontrolovat např. nějakou konzistenci, tak pak buď foreach a kontrolovat na vrstvě PHP, nebo přes for(each) všech těch podmínek poskládat dohromady kravskej SQL dotaz, opět přes WHERE část.
|
||
Ikki Profil |
#3 · Zasláno: 21. 7. 2020, 08:46:19
mckay:
Děkuji za odpověď. Jedná se o x různorodých dotazů, kdy prostřednictvím PHP chci prohledat databázi a v případě, že se některý záznam shoduje s podmínkou (název + aktiv), vypíše se obsah. Jaké by podle tebe bylo nejidealnejsi, nejkratší a nejjednodušší řešení? Přijde mi jako blbost na to dělat x dotazů a zároveň si nejsem jistý, zda to jde zpracovat i bez použití cyklu. |
||
Kajman Profil |
#4 · Zasláno: 21. 7. 2020, 09:25:58
Pokud je X rozumně malé číslo, použil bych X dotazů.
Také to můžete zkombinovat. Tedy vrátit řádky splňující alespoň jednu podmínku a takto cyklem z [#1] je upřesňovat, ale nemělo by to být rychlejší. Zkuste si to změřit. |
||
Ikki Profil |
Kajman:
Odhadovaný počet je přibližně 10-15 záznamů, což není nikterak tragické, ale může se stát, že ve výsledku se přidá další záznam a to znamená, že by se musel udělat další dotaz, tedy 15+1x opsaný totožný dotaz ale s jinou hodnotou a následně bude nutné přidat další záznam, což mi přijde do budoucna strašně komické. Každopádně ten nápad s kombinací vypadá jako ideální řešení, to mě nenapadlo. Vyzkouším, zatím díky. |
||
Časová prodleva: 3 dny
|
|||
Ikki Profil |
#6 · Zasláno: 24. 7. 2020, 19:02:36
Odzkoušeno.
SQL dotaz jsem pozměnil tak, aby vypisoval pouze aktivní položky. Zkoušel jsem využít funkce fetch_all , která mi je sice vypíše, ale neporovná. Následně jsem se pokusil vypsat prostřednictvím foreach název, no chybně. Když vložím získanou hodnotu do podmínky, vypíše se pouze jedna položka a tedy se neporovnají ostatní.
Děkuji. |
||
Kajman Profil |
#7 · Zasláno: 24. 7. 2020, 22:40:13
Ukažte kód a popište, co vlastně chcete.
|
||
Ikki Profil |
#8 · Zasláno: 25. 7. 2020, 13:03:18
// Varianta 1 $module = $mysqli->query("SELECT * FROM modules WHERE `active` = 1 ORDER BY id")->fetch_all(); //Získá všechna data z tabulky modulů if($module['name'] == 'Users') { // Podmínka kontrolující zda existuje aktivní záznam s názvem "Users" echo "Modul je aktivní"; } // Varianta 2 $moduleListing = $mysqli->query("SELECT * FROM modules WHERE `active` = 1 ORDER BY id"); $moduleName = NULL; foreach($moduleListing as $moduler){ $moduleName = $moduler['name']; } if($moduleName = 'Users'){ echo "Modul je aktivní"; } Výsledek by měl podmínkou porovnat zda je modul aktivní. Nepředávají se žádné hodnoty, není tedy s čím jinak porovnat. |
||
Kajman Profil |
V první variantě si dáte do $module pole řádků, ale pole neprocházíte. V druhé variantě v cyklu stále přepisujete proměnnou $moduleName, takže po cyklu kde testuje ifem, bude v proměnné jen hodnota posledního řádku. Podmínka musí být uvnitř cyklu. Něco jako
$moduleListing = $mysqli->query("SELECT * FROM modules WHERE `active` = 1 ORDER BY id")->fetch_all(); foreach($moduleListing as $moduler){ $moduleName = $moduler['name']; if($moduleName = 'Users'){ echo "Modul Users je aktivní"; } } Ale v cyklu si můžete i udělat nové asociativní pole, kde je klíčem název modulu a po cyklu už můžete testovat, zda je nastavená položka pole s chtěným klíčem. $moduleListing = $mysqli->query("SELECT * FROM modules WHERE `active` = 1 ORDER BY id")->fetch_all(); $activeModules=[]; foreach($moduleListing as $moduler){ $activeModules[$moduler['name']] = true; //nebo si tam uložíte $moduler pro pozdější použití } if(isset($activeModules['Users']){ echo "Modul Users je aktivní"; } |
||
Ikki Profil |
Kajman:
Děkuji za tip. Podmínky potřebuji mít kdekoliv, tedy je dávat do foreach nemohu, jinak by to řešilo celý problém. //EDIT: Banalita vyřešena. Nevšiml jsem si fetch_all navazující na foreach, které předá hodnotu NULL. Děkuji. |
||
Časová prodleva: 4 roky
|
0