Autor Zpráva
gardener
Profil
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
  $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
$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
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
$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
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
Ale samozřejmě že jde, stejné operátory i 100x zasebou :-)
gardener
Profil
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 *
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
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 *
Chybí Vám tam něco jako

$id_vysledku=mysql_query($sql);
gardener
Profil
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
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
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
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
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
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
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'

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: