Autor | Zpráva | ||
---|---|---|---|
danny98 Profil |
#1 · Zasláno: 1. 3. 2015, 10:30:15
Poradíte mi prosím, jak udělat filtr, který vyfiltruje data z mysql a vypíše je?
zkoušel jsem nějakej udělat, ale jak do selectu dosadit data z formuláře? tady je pokus: $mgenre = $_POST['mgenre']; $mcountry = $_POST['mcountry']; $sql = "SELECT * FROM `stations` WHERE `country`=$mcountry `id`=$mgenre"; |
||
lionel messi Profil |
#2 · Zasláno: 1. 3. 2015, 10:36:54
danny98:
1. Užívateľský vstup nevkladaj do databázového dotazu priamo, ale escapuj. 2. Predpokladám, že stĺpec country je reťazec, tie sa v SQL ohraničujú apostrofmi a v podmienke WHERE ti chýba logický operátor (buď AND alebo OR): $sql = "SELECT * FROM `stations` WHERE `country`= '$mcountry' AND `id`=$mgenre"; |
||
danny98 Profil |
myslel si to takto?
$mgenre = mysql_real_escape_string($_POST['mgenre']); $mcountry = mysql_real_escape_string($_POST['mcountry']); $sql = "SELECT * FROM `stations` WHERE `country`= '$mcountry' AND `id`='$mgenre'"; |
||
mimochodec Profil |
#4 · Zasláno: 1. 3. 2015, 11:08:34
danny98:
Jak genre, tak country bych čekal nikoliv v textové formě, ale jako ID odkazující do jiné tabulky. Syntakticky to máš správně, ale z pohledu návrhu databáze pravděpodobně ne. |
||
lionel messi Profil |
danny98:
„myslel si to takto?“ Áno, ale id je určite číslo, takže bez apostrofov okolo $mgenre v dotaze. Taktiež by som riešil mimochodcovu pripomienku. |
||
danny98 Profil |
děkuju vám, změnil jsem to takto:
$conn=mysql_connect($server,$user,$password); $db=mysql_select_db($database, $conn); $mgenre = mysql_real_escape_string($_POST['mgenre']); $mcountry = mysql_real_escape_string($_POST['mcountry']); $sql = "SELECT * FROM `stations` WHERE `country`= '$mcountry' AND `genre`='$mgenre'"; $result = mysql_query($sql, $conn); echo "<table><tr><td>Name</td><td>Country</td><td>Genre</td><td>Link</td></tr>"; while ($p = mysql_fetch_assoc($result)) { echo "<tr><td>".$p['station']."</td><td>".$p['country']."</td><td>".$p['genre']."</td><td><a href=\"details.php?id=".$p['id']."\">Details</a></td></tr>"; } echo "</table>"; a funguje ale když není v selectu žánru tak to nic nevypíše ukázka tady: http://yourradio.tk/stations.php |
||
mimochodec Profil |
#7 · Zasláno: 1. 3. 2015, 11:34:52
danny98:
„ale když není v selectu žánru tak to nic nevypíše“ Jak vypadá dotaz, když není v selectu žánru? |
||
danny98 Profil |
nwm, jak to myslíš?
$sql = "SELECT * FROM `stations` WHERE `country`= '$mcountry'"; zkoušel jsem tento, ale ten hlásí chyby: $where = ''; if (!empty($_POST['doc']) && $_POST['doc'] !== 'vse') { $where .= ' WHERE `doktor` = "'.mysql_real_escape_string($_POST['doc']).'"'; } if (!empty($_POST['rok']) && $_POST['rok'] !== 'vse') { $where .= (!empty($where) ? ' AND ' : ' WHERE '); $where .= '`rok` = '.intval($_POST['rok']); } $sql = "SELECT * FROM tabulka $where"; řádek 162: while ($p = mysql_fetch_assoc($result)) { |
||
mimochodec Profil |
danny98:
Jde mi o to, jestli náhodou v tom dotazu při nevybraném žánru nemáš něco jako ... AND `genre`='' . Je v té tabulce nějaká položka, která by ve sloupci genre měla prázdný řetězec?
Snažím se tě navést k tomu, abys ten dotaz sestavil podle odeslaných hodnot a v případě, že jeden nebo druhý <select> nebude mít vybranou položku, resp. bude vybraná výchozí položka s prázdnou value, ty prázdné hodnoty do dotazu vůbec nepřidal. |
||
danny98 Profil |
#10 · Zasláno: 1. 3. 2015, 12:03:33
6ádná položka,bez genre tam není pošlu screen
https://yadi.sk/i/q_QEKETwex9oY |
||
mimochodec Profil |
#11 · Zasláno: 1. 3. 2015, 12:06:24
danny98:
Takže když vybereš <option value="">Country...</option> nebo obdobně "žádný" žánr, nic se ti nevypíše. Vysvětlení viz v [#9].
|
||
danny98 Profil |
#12 · Zasláno: 1. 3. 2015, 12:08:09
mimochodec:
„resp. bude vybraná výchozí položka s prázdnou value, ty prázdné hodnoty do dotazu vůbec nepřidal.“ a to se prosím tě dělá jak? promiň jsem začátečník. |
||
mimochodec Profil |
#13 · Zasláno: 1. 3. 2015, 12:11:40
danny98:
Použij to, cos dodatečně připsal v [#8]. Dotaz seskládáš z toho, co je odesláno. Jen samozřejmě musíš pracovat s patřičnými indexy, ne s "doc" nebo "rok". |
||
danny98 Profil |
#14 · Zasláno: 1. 3. 2015, 12:19:33
Mám to takto, ale stále error
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/u311461713/public_html/stations.php on line 163 $where = ''; if (!empty($_POST['mgenre']) && $_POST['mgenre'] !== 'vse') { $where .= 'WHERE `genre` = "'.mysql_real_escape_string($_POST['mgenre']).'"'; } if (!empty($_POST['mcountry']) && $_POST['mcountry'] !== 'vse') { $where .= (!empty($where) ? ' AND ' : ' WHERE '); $where .= '`country` = '.intval($_POST['mcountry']); } $sql = "SELECT * FROM tabulka $where"; |
||
mimochodec Profil |
#15 · Zasláno: 1. 3. 2015, 12:39:56 · Upravil/a: mimochodec
danny98:
Za tím desátým řádkem si vypiš, co je v tom $sql. A zkus nad tím i trochu přemýšlet. Jestli si sám neporadíš s tímhle, web nepostavíš. Tušíš aspoň trochu, co ten kód dělá? Trochu naznačím. Dotaz s jednou podmínkou vypadá takto: SELECT * FROM table WHERE neco = 10 SELECT * FROM table WHERE neco = 10 AND jine = 3 AND dalsi = "a" Ty když odešleš formulář, musíš zjistit, jestli v těch selectech je nějaká platná hodnota, kterou chceš jako podmínku do WHERE zařadit, nebo tam platná hodnota není a v tom případě ji nezařadíš. Takže jednou věcí je ověření, jestli tam není prázdný řetězec. Druhou věcí je pak to, že v dotazu před první podmínkou je WHERE, před každou další pak AND. Je to jen hraní s textem a podmínkami, nic víc. |
||
danny98 Profil |
#16 · Zasláno: 1. 3. 2015, 13:08:50
Pokud je mgenre prázdný a zároveň, pokud mgenre je 'vse' vykoná se podmínka kde se do selectu dosadí WHERE genres a hodnota
|
||
mimochodec Profil |
danny98:
„Pokud je mgenre prázdný a zároveň, pokud mgenre je 'vse' vykoná se podmínka“ To by nebyl správný postup, už proto, že ty podmínky obě zároveň splnit nelze. Jsou tam ale ty vykřičníky, které ty podmínky negují, takže konkrétně toto funguje jak má. if (!empty($_POST['mgenre']) && $_POST['mgenre'] !== 'vse') { |
||
danny98 Profil |
#18 · Zasláno: 1. 3. 2015, 13:30:53
ok děkuju filtr funguje bez problémů
$mgenre = mysql_real_escape_string($_POST['mgenre']); $mcountry = mysql_real_escape_string($_POST['mcountry']); $sql = "SELECT * FROM `stations` WHERE `country`= '$mcountry' OR `genre`= '$mgenre' "; |
||
Časová prodleva: 10 let
|
0