Autor | Zpráva | ||
---|---|---|---|
gorilla Profil |
#1 · Zasláno: 31. 10. 2022, 22:40:50
Ahoj,
řeším teď na jednom ze svých webů menší upgrade a popravdě moc nevím, jak bych měl postupovat dál. Mám php stránku, která mi z databáze načte seznam stránek a zobrazí ho v tabulce. Tabulku filtruji přes parametr s, který určuje stav, zda je stránka zveřejněná nebo nezveřejněná a podle toho filtruji obsah tabulky. Tabulku mám ve třech variantách - s = 1 - zveřejněné stránky, s = 0 nezveřejněné stránky, pokud není nastaven parametr s, zobrazí se všechny stránky najednou. Parametr s je součástí URL, mám tam tlačítka, která odkazují na URL?s=1 a URL?s=0 V tuhle chvíli už mám počet záznamů v tabulce zhruba 70 a tak bych chtěl přidat vyhledávání, abych nemusel pracně v tabulce hledat, případně zbytečně používat ctrl + f. V budoucnu stejně možná přejdu na stránkování a tak by byla blbost používat ctrl + f na každé stránce zvlášť. Vyhledávání řeším takto: V horní části stránky je formulář, který mi po odeslání přidá do URL parametr q = hledaný výraz. echo "<form action='projekty.php' method='GET'> <input type='text' name='q' /> <input type='submit' value='hledat' /> </form>"; Dále definuji proměnnou q $q = $_GET['q']; a tuto proměnnou využiju při selekci dat z databáze:
$sql = "SELECT * FROM obsah WHERE stav = ".(int)$_GET['s']." AND (`nazev` LIKE '%".$q."%') ORDER BY od DESC, pid DESC"; Při použití tohoto řešení ale narážím na několik problémů. 1) Nevím, jak pracovat s parametrem s při hledání. Když odešlu vyhledávácí formulář, parametr s je nahrazen parametrem q a tím přicházím o filtrování stavu. Napadá mě v nějaké fázi přidat podmínku - pokud je definováno s, zkopíruj hodnotu s a vlož do url společně s q. Je toto správný postup? V jaké části by měla být tato podmínka a jak by měla vypadat? 2) V momentě, kdy vynechám parametr s, je automaticky s považováno s = 0 a zobrazují se mi v hledání pouze neaktivní stránky. Předtím jsem používal $sql = "SELECT * FROM obsah".(isset($_GET['s']) ? " WHERE stav = ".(int)$_GET['s'] : "")." ORDER BY od DESC, pid DESC" , což funguje pro filtrování parametru s, ale toto se mi nedaří zkombinovat s parametrem q. Zkusil jsem tenhle hybrid $sql = "SELECT * FROM obsah".(isset($_GET['s']) ? " WHERE stav = ".(int)$_GET['s']." AND (`nazev` LIKE '%".$q."%') ORDER BY od DESC, pid DESC"; , ale to mi hlásí chybu Parse error: syntax error, unexpected ';'. Předpokládám, že mi tam něco chybí, ale nějak jsme nepřišel na to, co.
3) Je v tomto případě AND správný? Díval jsem se na pravdivostní tabulky pro jednotlivé logické funkce a podle mě to přesně definuje, co potřebuji, ale nejsem si úplně jistý. Můžu někoho poprosit o pomoc? |
||
Kajman Profil |
#2 · Zasláno: 31. 10. 2022, 22:56:16
Nemáte v php část za dvojtečkou (else). A nezapomeňte string escapovat
|
||
juriad Profil |
1)
Obyčejně se to dělá tak, že si do formuláře přidáš (nebo nepřidáš, pokud je s prázdné):
<input type='hidden' name='s' value='1' /> 2) Je si to lepší rozepsat na víc řádků. Ternární operátor může být zrádný. Také můžeš využít triku s podmínkou 1=1 , abys nemusel řešik, kdy použít WHERE a kdy AND.
$sql = "SELECT * FROM obsah WHERE 1=1"; if (isset($_GET['s'])) { $sql .= " AND stav = " . (int) $_GET['s']; } if (isset($_GET['q'])) { $q = $_GET['q']; $sql .= " AND `nazev` LIKE '%" . $q . "%'"; # tady přidej něco jako mysqli_real_escape_string } $sql .= " ORDER BY od DESC, pid DESC"; 3) Ano, chceš AND . Jak vidíš na mém příkladu, můžeš klidně filtrování použít jen, když je podle čeho filtrovat.
|
||
Andrej.B Profil |
#4 · Zasláno: 2. 11. 2022, 10:27:55
Inak, ak to mate zobrazene v tabulke, skuste si zakomponovat priamo vyhladavanie tam. Vynikajuci nastroj a hotove riesenie je Bootstrap SELECT. Nemusite riesit nic na strane servera.
developer.snapappointments.com/bootstrap-select/examples/#live-search_1 |
||
Časová prodleva: 3 dny
|
|||
gorilla Profil |
#5 · Zasláno: 4. 11. 2022, 23:06:32
Děkuji moc. Koukám, že už je tu chybka od juriada opravená. Zkusill jsem to aplikovat hned ráno, kdy jsem ještě nebyl úplně nastartovaný a v tu chvíli mě ta jedna chybějící mezera vcelku natrápila :)
Andrej.B : Děkuji, podívám se na to, ale asi to v nejbližší době nevyužiju. Tohle mi v tuhle chvíli funguje a mám teď co se týče upgradu trochu jiné priority.. Prozatím ten web využívám jen já, tak nemám takové vytížení serveru. |
||
Časová prodleva: 1 rok
|
0