| 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: 6 let
|
|||
0