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("...");
V prvním cyklu se spočítají položky, ale v druhém se už nic nevypíše.
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
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++;
}
, musí být označená část ve foreach, když ji vůbec nepoužiju? Po smazání téhle "zbytečné" části se zobrazuje jen chyba, proč?
smitka
Profil
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
smitka:
Díky, dal jsem tam while.
Dan Charousek
Profil
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í.

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: