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
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
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
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.
Ikki
Profil
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
Ukažte kód a popište, co vlastně chcete.
Ikki
Profil
 
 // 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.

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