Autor Zpráva
gorilla
Profil
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
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
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
gorilla
Profil
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.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0