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