Autor Zpráva
danny98
Profil
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
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
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
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";
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/u311461713/public_html/stations.php on line 162

řá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
6ádná položka,bez genre tam není pošlu screen
https://yadi.sk/i/q_QEKETwex9oY
mimochodec
Profil
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
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
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
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
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
Dotaz více podmínkami vypadá takto:
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
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
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' ";

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: