Autor | Zpráva | ||
---|---|---|---|
gardener Profil |
#1 · Zasláno: 30. 7. 2008, 00:23:32
Zdravím
Vytvořil jsem si aplikaci seznam cd, ukládám do ní asi 10 sloupců (interpret,album atd..) Teď ale pracuji na vyhledávání a jelikož jsme zjistil, že to není tak přímočaře lehké jak se mi zdálo zajímal by mne Váš názor jak co nejlépe zefektivnit vyhledávací dotazy a formulář.. Moje vize je zatím taková, že by na vyhledávací stránce byl jeden input box (alá google) a pod ním několik check boxů, kde hledat (např v interpretech,názvech alb, zemích původu apod.. to si ještě tak nějak dokáži představit, s tím že bych použil logický operátor AND,OR při dotazu na databázi.. Zajímalo by mne ale jak třeba udělat abych mohl jako podmínku vložit i například rok vydání alba..jak to udělat aby se vložili např jenom dotazy, které budou vyplněny přes input formuláře... Zkrátka jak na co nejefektivnější vyhledávání.. Děkuji za vaše rady.. |
||
Paja Profil |
#2 · Zasláno: 30. 7. 2008, 01:16:28 · Upravil/a: Paja
$dotaz = "select * from cd where "; if ( zaskrtnut rok ) $dotaz .= "rok='".$input."' "; if ( zaskrtnut nazev ) $dotaz .= "and nazev like '%".$input."%'"; .. provest $dotaz + ošetřit mysql inkluzi |
||
joe Profil |
#3 · Zasláno: 30. 7. 2008, 04:09:52
$dotaz .= "rok='".$input."' ";
Fuj. <?php $sql = "SELECT * FROM table WHERE ..."; if(isset($_POST['year'])) { $sql .= " AND year = " . intval($_POST['year']); } ?> Pokud necháš na uživatelovi napsat rok, tak ošetři jestli se jedná skutečně o čísla a jestli je to rok, aby třeba nezadal 100000. Pokud máš rok od a do, tak můžeš v sql použít BETWEEN. A nezapomeň na indexy v tabulce. |
||
gardener Profil |
#4 · Zasláno: 30. 7. 2008, 07:36:53
Inkluzi ošetřím, zadání data je ošetřeno pomocí JS.
Co je pro mne ale novinkou je tečka za "$sql ." to tam kvůli spojování řetězců? A ještě mi trochu vrtá hlavou Pajův příspěvek, na konci jak je 'provest $dotaz' není to už zbytečné? Když načtu hodnoty předávané formem, mohl bych pak vložit v závislosti na podmínce rovnou do SQL dotazu rovnou na konci toho skriptu..nebo ne? |
||
Paja Profil |
#5 · Zasláno: 30. 7. 2008, 08:40:15
$sql = "dobrý"; $sql .= " den"; echo $sql; // vypise "dobrý den" => spojení řetězců provedeš sql dotaz který si tímto způsobem "skládáš" "select * from table where " "select * from table where year = 2008 " jak ho máš poskládaný v řetězci celý, tak ho provedeš .. a to jestli ho provedeš nebo neprovedeš už je na tobě mysql_query( $sql ); |
||
gardener Profil |
#6 · Zasláno: 30. 7. 2008, 16:24:28
Teď mne napadá, co když budu chtít použít v dotazu třeba 3 krát operátor AND?..jak se to pak dělá?Jelikož normálně to asi nepůjde...dávat za sebe 3 krát AND.
|
||
somebody Profil |
#7 · Zasláno: 30. 7. 2008, 16:51:24 · Upravil/a: somebody
Ale samozřejmě že jde, stejné operátory i 100x zasebou :-)
|
||
gardener Profil |
#8 · Zasláno: 30. 7. 2008, 17:14:45 · Upravil/a: gardener
Tak to opravdu funguje:), předtím to nešlo, jelikož se tam nacházeli kombinace AND a OR, které se vzájemně negovali..
Došel jsme ale k dalšímu problému: Pokud uživatel vyplní jenom vyhledávací políčko a nezadá žádné upřešnující volby kde hledat..tak aby byl řetězec hledán ve všech záznamech(sloupcích).. "SELECT * FROM seznam 'a zde by byla předána ta proměnná s hledaným slovem' " Jenže takto by to nefungovalo, šlo by to jedině, že bych vyjmenoval všechny sloupce které se mají prohledat..což mi příjde složité, určitě existuje i jiný způsob ale říkám si že asi to nepůjde jako v případě výběru sloupců nahradit symbolem *.. |
||
Kajman_ Profil * |
#9 · Zasláno: 31. 7. 2008, 06:35:41
Jenže takto by to nefungovalo, šlo by to jedině, že bych vyjmenoval všechny sloupce které se mají prohledat..což mi příjde složité, určitě existuje i jiný způsob ale říkám si že asi to nepůjde jako v případě výběru sloupců nahradit symbolem *
Vyjmenujte všechny sloupce, jiný způsob asi neexistuje. |
||
gardener Profil |
#10 · Zasláno: 31. 7. 2008, 18:34:44
Tak jsme zjistil, že by bylo lepší vynechat ty checkboxy a vypisovat to klasicky do text inputu s tím, že když nebude prázdný splní se podmínka a vloží se dotaz..nicméně jsem to ale nakonec ponechal ze zvědavosti s check boxy a výsledek který je níže mi hlásí chybu se zpracováním MySQL FETCH ROW..nevím ale proč, jestli bych spíše neměl provést dotaz až poté(nyní ho provádím hned po přijmutí dat z proměnných)
Netuší někdo, kde by mohla býti chyba? <?php include("db_connect.php"); //including db_connect $hledane_slovo = $_POST['hledane_slovo']; $album = $_POST['album']; $interpret = $_POST['interpret']; $styl = $_POST['styl']; $rok_vydani = $_POST['rok_vydani']; $sql = "SELECT * FROM `seznam` WHERE' "; if(isset($_POST['interpret'])) { $sql .= "intepret LIKE = " . intval($_POST['hledane_slovo']); } if(isset($_POST['album'])) { $sql .= "AND album LIKE = " . intval($_POST['hledane_slovo']); } if(isset($_POST['styl'])) { $sql .= "AND styl LIKE = " . intval($_POST['styl']); } if(isset($_POST['rok_vydani'])) { $sql .= "AND rok_vydani LIKE = " . intval($_POST['rok_vydani']); } if (!$sql) die('Nepodaøilo se nám poslat SQL dotaz do databáze.'); //If results get back a false,then will be written fail massage ?> <table border="1"> <tr> <th>id</th> <th>interpret</th> <th>album</th> <th>styl</th> <th>rok_vydani</th> <th>zeme_puvodu</th> <th>kdy_zaloha</th> <th>kde_najdu</th> </tr> <?php while($radek = mysql_fetch_row($id_vysledku)) { echo '<tr>'; for ($i=0; $i<8; ++$i) echo '<td>', $radek[$i], '</td>'; echo '</tr>'; } ?> </table> <?php mysql_close($id_spojeni); //end connection with MySQL ?> |
||
Kajman_ Profil * |
#11 · Zasláno: 31. 7. 2008, 18:42:11
Chybí Vám tam něco jako
$id_vysledku=mysql_query($sql); |
||
gardener Profil |
#12 · Zasláno: 31. 7. 2008, 20:01:10
Pravda,to jsem zapoměl bohužel to ale stále nepomohlo, nemůže to být tím že jsou tam ty checkboxy(tj.problém s předáváním hodnoty check boxu?) a nebo místo fetch row použít fetch array?
jelkož chyba zní: Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource |
||
nightfish Profil |
#13 · Zasláno: 31. 7. 2008, 20:28:35
jelkož chyba zní: Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource
což poukazuje na to, že je chyba v dotazu... čemuž není třeba se divit, protože... $sql = "SELECT * FROM `seznam` WHERE' "; if(isset($_POST['interpret'])) { $sql .= "intepret LIKE = " . intval($_POST['hledane_slovo']); } if(isset($_POST['album'])) { $sql .= "AND album LIKE = " . intval($_POST['hledane_slovo']); } 1) proč je za WHERE ten apostrof? 2) co se stane, když $_POST['interpret'] nebude nastavené a $_POST['album'] nastavené bude? ... WHERE' AND album LIKE = ".... 3) intval($_POST['album']) získá z hodnoty $_POST['album'] celočíselnou hodnotu, což pro název alba, který může zcela jistě být řetězcem, neobsahujícím pouze čísla, docela k ničemu |
||
gardener Profil |
#14 · Zasláno: 31. 7. 2008, 20:40:04 · Upravil/a: gardener
2)Když nebude nastavené $_POST['album'] a $_POST['interpret'], tak se album nevloží ne?
3) To jsem opoměl ten intval musím u album a intepret odstranit.. Takže to po úpravě vypadá takto: Ale říkám si, jestli tam raději nepoužít podmínku else if? if(isset($_POST['interpret'])) { $sql .= "intepret LIKE = " .($_POST['hledane_slovo']); } if(isset($_POST['album'])) { $sql .= "AND album LIKE = " . ($_POST['hledane_slovo']); } if(isset($_POST['styl'])) { $sql .= "AND styl LIKE = " .($_POST['styl']); } if(isset($_POST['rok_vydani'])) { $sql .= "AND rok_vydani LIKE = " . intval($_POST['rok_vydani']); } |
||
nightfish Profil |
#15 · Zasláno: 31. 7. 2008, 20:44:28
2)Když nebude nastavené $_POST['album'] a $_POST['interpret'], tak se album nevloží ne?
psal jsem něco trochu jiného... každopádně před while ($radek = mysql...) si dej if (!$id_vysledku) echo "došlo k chybě: ".mysql_error()."<br>v dotazu: ".$sql."<br>"; ten ti vypíše jak chybu, ke které došlo, tak i podobu dotazu tak, jak jde do databáze... |
||
nightfish Profil |
#16 · Zasláno: 31. 7. 2008, 20:48:24
volil bych asi trochu jinou cestu: (samozřejmě je ještě vhodné mysql_real_escape_stringovat() všechny hodnoty $_POST použité v dotazu)
$podminky = array(); if(isset($_POST['interpret']) && !empty($_POST['interpret'])) { $podminky[] = "intepret LIKE '%" .($_POST['hledane_slovo'])."%'"; } if(isset($_POST['album']) && !empty($_POST['album'])) { $podminky[] = "album LIKE '%" . ($_POST['hledane_slovo'])."%'"; } if(isset($_POST['styl']) && !empty($_POST['styl'])) { $podminky[] = "styl LIKE '%" .($_POST['styl'])."%'"; } if(isset($_POST['rok_vydani'])) { $podminky[] = "rok_vydani = " . intval($_POST['rok_vydani']); } if (count($podminky) > 0) $sql .= implode(" and ", $podminky); |
||
gardener Profil |
#17 · Zasláno: 31. 7. 2008, 20:58:19
To vypadá jako nejlepší řešení, osobně by mne to ale nanapadlo, je to můj téměř první kontakt s databází, říkám si jestli by nebylo lepší z hlediska pochopení principu dát všechny inputy jako text. pole a pokud nebude prázdé, vloží se přiřazená hodnota do MySQL dotazu...
Toto řešení každopádně vyzkouším. |
||
gardener Profil |
#18 · Zasláno: 31. 7. 2008, 21:13:37
Tak teď po vyzkoušení a podrobném prostudování skriptu tomu principu rozumím, co mne ale udivuje, je pokud zaškrtnu vyhledávat např v interpretech, tak mi to vypíše že je neznámý sloupec s názvem intepret, i když tam je a dotaz vypadá taktéž v pořádku.
Unknown column 'intepret' in 'where clause' |
||
Časová prodleva: 17 let
|
0