Autor | Zpráva | ||
---|---|---|---|
Milan1236000 Profil |
Zdravím,
mám následující skript: $v = $p->query("SELECT * FROM `i` WHERE I LIKE '%$hledanytext%'"); while($z = $v->fetch_object()) $pocitadlo++; ?> ... html ... <?php while($z = $v->fetch_object()) printf("..."); Mezi těmito dvěma cykly se vypisuje počet položek, proto počítadlo nemůžu dát jen do druhého cyklu a ten první smazat (proměnná $pocitadlo by byla použita ještě dříve, než by se spočetla).
|
||
Radek9 Profil |
Milan1236000:
Funkce mysqli_query vrací objekt typu mysqli_result . Pokud ho pomocí té metody fetch_object vyprázdníš (a tedy ta metoda už vrací jen null, kvůli čemuž skončí první cyklus), tak už logicky ty stejné hodnoty nemůžeš číst znovu, protože tam prostě a jednoduše už nejsou. Pokud chceš ten dotaz používat víckrát, použij mysqli_prepare a mysqli_stmt_execute .
Nebo, možná jednodušeji, si ty hodnoty v prvním cyklu ulož do pole a pak procházej to pole. |
||
Dan Charousek Profil |
#3 · Zasláno: 16. 1. 2016, 16:24:16
Jednoduše řečeno
$v->fetch_object() vytáhne jeden záznam, a z pomyslné fronty všech záznamů, které dotaz vybral jej odstraní. Takže po prvním provedení cyklu je "fronta záznamů" $v prázdná. Procházet všechny záznamy kvůli jejich počtu je značně neefektivní. Dál bych doporučil oddělit aplikační logiku od šablony/vykreslování. Nemluvím tu o nějakých komplexních systémech, ale aspoň v rámci toho souboru. Toho docílíš třeba tak, že si získávání dat z DB dáš úplně na začátek souboru:
<?php function najdiNeco($hledanyText, $db) { $ht = $db->real_escape_string($hledanyText); // ošetříme vstup $query = $db->query("SELECT * FROM `i` WHERE I LIKE '%$ht%'"); $result = []; while($row = $query->fetch_object()) { $result[] = $row; } return $result; } $vysledky = najdiNeco("Můj text", $p); ?> <!DOCTYPE html> <html> <body> Počet záznamů: <?=count($vysledky)?> ... něco něco Výpis záznamů: <?php foreach($vysledky as $radek) { echo $radek->id; // výpis... } ?> </body> </html> |
||
Milan1236000 Profil |
Radek9, Dan Charousek:
Skvěle, díky. :) ___ Ještě dotaz. Mám 2 pole, do jednoho ukládám URL a do druhého název interpreta. Proč když vypisuji pole příkazem $i=0; foreach ($i_Interpret as $nejakanesmyslnazbytevnapromenna) { printf("<li><a href=\"/neco?neco=%s\">%s</a></li>", $i_Url[$i], $i_Interpret[$i]); $i++; } foreach , když ji vůbec nepoužiju? Po smazání téhle "zbytečné" části se zobrazuje jen chyba, proč?
|
||
smitka Profil |
#5 · Zasláno: 17. 1. 2016, 11:07:13
Milan1236000:
Protože používáš nevhodný typ cyklu. Lepší bys měl cyklus for. Foreach ti do tvé nesmyslné proměnné ukládá hodnotu v daném průběhu, tedy $i_Interpret[$i]. Když ji vypustíš tak zápis neodpovídá syntaxi foreach, proto dostaneš chybu. Podobného výsledku v tvém případě dosáhneš i cyklem while: while(isset($i_Interpret[$i])){ ... } Foreach oceníš především při iterování přes asociativní pole (kde indexy nejdou popořadě a nemusí být ani číselné) |
||
Milan1236000 Profil |
#6 · Zasláno: 17. 1. 2016, 12:56:44
smitka:
Díky, dal jsem tam while .
|
||
Dan Charousek Profil |
#7 · Zasláno: 17. 1. 2016, 14:19:41
Milan1236000:
Osobně bych použil for cyklus vzhledem k tomu, že znáš počet iterací.
for($i = 0; $i < count($i_Interpret); $i++) { printf('<li><a href="/neco?neco=%s">%s</a></li>', $i_Url[$i], $i_Interpret[$i]); } Nebo můžeš použít ten foreach, protože tam tu hodnotu můžeš použít: foreach ($i_Interpret as $key => $value) { printf('<li><a href="/neco?neco=%s">%s</a></li>', $i_Url[$key], $value); } Formátovací řetězec jsem obalil jednoduchými uvozovkami pro zpřehlednění. |
||
Časová prodleva: 9 let
|
0