Jquery search en table met php als backend
Ik ben op dit moment een search script aan maken voor mijn video site. De criteria waar op gezocht moet worden is title, description en poster.
Nu heb ik met Jquery alles gemaakt en werkend maar ben niet blij met het backend script dat de query uitvoert.
Het kan bijvoorbeeld zijn dat iemand op title zoekt en dat stuurt $_GET['stitle'] naar het php bestand. Maar als iemand op description en title zoekt krijg je $_GET['stitle'] en $_GET['sdesc']
Hoe kan ik onderstaande code beter maken?
Quote:
if($_GET['stitle'] != '') {
$output .= 'title<br>';
$db->query("SELECT * FROM media WHERE title LIKE '%".$_GET['stitle']."%'") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE title LIKE '%".$_GET['stitle']."%' LIMIT ".$startpage.",".$numpages."") ;
}
if($_GET['sdesc'] != '') {
$output .= 'description<br>';
$db->query("SELECT * FROM media WHERE description LIKE '%".$_GET['sdesc']."%'") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE description LIKE '%".$_GET['sdesc']."%' LIMIT ".$startpage.",".$numpages."") ;
}
if($_GET['spos'] != '') {
$output .= 'poster<br>';
$db->query("SELECT * FROM media WHERE poster LIKE '%".$_GET['spos']."%'") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE poster LIKE '%".$_GET['spos']."%' LIMIT ".$startpage.",".$numpages."") ;
}
if(($_GET['sdesc'] != '') && ($_GET['stitle'] != '')) {
$output .= 'description en title<br>';
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (description LIKE '%".$_GET['sdesc']."%') ") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (description LIKE '%".$_GET['sdesc']."%') LIMIT ".$startpage.",".$numpages."") ;
}
if(($_GET['stitle'] != '') && ($_GET['spos'] != '')) {
$output .= 'title en poster<br>';
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (poster LIKE '%".$_GET['spos']."%') ") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (poster LIKE '%".$_GET['spos']."%') LIMIT ".$startpage.",".$numpages."") ;
}
if(($_GET['sdesc'] != '') && ($_GET['spos'] != '')) {
$output .= 'description en poster<br>';
$db->query("SELECT * FROM media WHERE (description LIKE '%".$_GET['sdesc']."%') AND (poster LIKE '%".$_GET['spos']."%') ") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE (description LIKE '%".$_GET['sdesc']."%') AND (poster LIKE '%".$_GET['spos']."%') LIMIT ".$startpage.",".$numpages."") ;
}
if(($_GET['sdesc'] != '') && ($_GET['stitle'] != '') && ($_GET['spos'] != '')) {
$output .= 'alle drie<br>';
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (description LIKE '%".$_GET['sdesc']."%') AND (poster LIKE '%".$_GET['spos']."%') ") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (description LIKE '%".$_GET['sdesc']."%') AND (poster LIKE '%".$_GET['spos']."%') LIMIT ".$startpage.",".$numpages."") ;
}
if(($_GET['sdesc'] == '') && ($_GET['stitle'] == '') && ($_GET['spos'] == '')) {
$output .= 'geen<br>';
$db->query("SELECT * FROM media LIMIT ".$startpage.",".$numpages."") ;
}
$output .= 'title<br>';
$db->query("SELECT * FROM media WHERE title LIKE '%".$_GET['stitle']."%'") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE title LIKE '%".$_GET['stitle']."%' LIMIT ".$startpage.",".$numpages."") ;
}
if($_GET['sdesc'] != '') {
$output .= 'description<br>';
$db->query("SELECT * FROM media WHERE description LIKE '%".$_GET['sdesc']."%'") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE description LIKE '%".$_GET['sdesc']."%' LIMIT ".$startpage.",".$numpages."") ;
}
if($_GET['spos'] != '') {
$output .= 'poster<br>';
$db->query("SELECT * FROM media WHERE poster LIKE '%".$_GET['spos']."%'") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE poster LIKE '%".$_GET['spos']."%' LIMIT ".$startpage.",".$numpages."") ;
}
if(($_GET['sdesc'] != '') && ($_GET['stitle'] != '')) {
$output .= 'description en title<br>';
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (description LIKE '%".$_GET['sdesc']."%') ") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (description LIKE '%".$_GET['sdesc']."%') LIMIT ".$startpage.",".$numpages."") ;
}
if(($_GET['stitle'] != '') && ($_GET['spos'] != '')) {
$output .= 'title en poster<br>';
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (poster LIKE '%".$_GET['spos']."%') ") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (poster LIKE '%".$_GET['spos']."%') LIMIT ".$startpage.",".$numpages."") ;
}
if(($_GET['sdesc'] != '') && ($_GET['spos'] != '')) {
$output .= 'description en poster<br>';
$db->query("SELECT * FROM media WHERE (description LIKE '%".$_GET['sdesc']."%') AND (poster LIKE '%".$_GET['spos']."%') ") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE (description LIKE '%".$_GET['sdesc']."%') AND (poster LIKE '%".$_GET['spos']."%') LIMIT ".$startpage.",".$numpages."") ;
}
if(($_GET['sdesc'] != '') && ($_GET['stitle'] != '') && ($_GET['spos'] != '')) {
$output .= 'alle drie<br>';
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (description LIKE '%".$_GET['sdesc']."%') AND (poster LIKE '%".$_GET['spos']."%') ") ;
$maxpages = $db->numRows();
$db->query("SELECT * FROM media WHERE (title LIKE '%".$_GET['stitle']."%') AND (description LIKE '%".$_GET['sdesc']."%') AND (poster LIKE '%".$_GET['spos']."%') LIMIT ".$startpage.",".$numpages."") ;
}
if(($_GET['sdesc'] == '') && ($_GET['stitle'] == '') && ($_GET['spos'] == '')) {
$output .= 'geen<br>';
$db->query("SELECT * FROM media LIMIT ".$startpage.",".$numpages."") ;
}
screenshot van de front-end:
Groet Karel
2. check WAT de waardes zijn in de $_GET array, nu is het erg makkelijk om er iets leuks mee te doen en je DB op te blazen (leuk voor een hacker in elk geval).
3. doe bovenstaande checks eerst, bepaal dan welke waardes goed zijn (1, 2 of allen) en bouw op basis daarvan je query op.
4. maar dit is een persoonlijke, plaats niet je variabelen direct in de SQL string, maar werk met parameters. Heb je nog een veiligheidsmarge ingebouwd tegen hackers.
5. voeg altijd een LIMIT statement toe als de kans aanwezig is dat je een groot aantal rows terugkrijgt. Dus niet eerst een query uitvoeren, daarvan de rows tellen en dan nog een query uitvoeren met een LIMIT. Dat is zonde van de tijd en processor capaciteit.
PS. ik zie nu waarom je twee queries uitvoert, maar nog steeds onnodig. Met de functie SQL_CALC_FOUND_ROWS kan je MySQL laten uitrekenen hoeveel rows er gevonden zouden zijn als je geen LIMIT gebruikt. Check de help hoe dit precies werkt.
Gewijzigd op 23/11/2011 17:03:08 door Erwin H
Het is trouwens beveiligd met een login voor admin dus dat is defense nummer 1.
Functie SQL_CALC_FOUND_ROWS lijkt me handig ja en ga ik zeker even bekijken.
Probleem met isset() is dat een leeg veld nog steeds gezet kan zijn vandaar de ==''
Query opbouw is probleem omdat je dan makkelijker een UNION ofzo kan toevoegen?
Karel hertens op 23/11/2011 17:11:19:
Probleem met isset() is dat een leeg veld nog steeds gezet kan zijn vandaar de ==''
OP de eerste regel staat
if ($_GET['stitle'] != '')
Als stitle niet in de query string zit gaat hier je script al onderuit. Zit het er wel kan je altijd nog contoleren op de waarde (en dus op een lege variabele).
Karel hertens op 23/11/2011 17:11:19:
Query opbouw is probleem omdat je dan makkelijker een UNION ofzo kan toevoegen?
Wat ik altijd doe is eerste zorgen dat ik precies weet welke waardes ik wel op moet zoeken en welke niet. Dus, zoals gezegd, eerst alle checks op de input, welke bestaan, welke zijn leeg etc etc.
Als je dat allemaal hebt kan je de query opbouwen, waarbij je eventueel meerdere selecties in een query kan uitvoeren waardoor je ook nog eens veel tijd bespaart. Dat zou eventueel in een Union kunnen, ligt uiteraard aan wat je nodig hebt. Misschien ook wel simpel in een where statement.
$sort .= " AND (title LIKE '%".$_GET['stitle']."%')" ;
$sort .= " AND (title LIKE '%".$_GET['sdesc']."%')" ;
Waar ik aan zat te denken is te controleren welke $_GET er zijn en hierdoor een waarde te maken.
- stitle en sdesc gezet is dan is waarde 3
- stitle en sdesc en sposter gezet is dan is waarde 4
en dan een switch($waarde) te gebruiken om de query uit te voeren.
Let wel op dat uiteraard de eerste een WHERE krijgt en de rest een AND, dus:
"WHERE param1 = ...
AND param2 = ....
AND param3 = ...."
Als je nu de optie hebt dat param1 niet zal worden meegenomen zal je dus ook moeten kijken of je WHERE of AND gebruikt.
Mijn truc daarbij is altijd om het volgende te doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$str = "";
//check welke params je nodig hebt
//dit is een voorbeeld en zou zo natuurlijk niet werken
if ($param1 != "") $str .= "param1 = ... AND ";
if ($param2 != "") $str .= "param2 = ... AND ";
etc etc
//Als je alle hebt gedaan:
if ($str != ""){
//haal de laatste AND weg
$str = substr( $str, 0, strlen($str)-4 );
//plak de where vooraan
$str = "WHERE ".$str;
}
//check welke params je nodig hebt
//dit is een voorbeeld en zou zo natuurlijk niet werken
if ($param1 != "") $str .= "param1 = ... AND ";
if ($param2 != "") $str .= "param2 = ... AND ";
etc etc
//Als je alle hebt gedaan:
if ($str != ""){
//haal de laatste AND weg
$str = substr( $str, 0, strlen($str)-4 );
//plak de where vooraan
$str = "WHERE ".$str;
}
Zo hoef je dus niet elke keer te checken of je nu WHERE of AND nodig hebt.
WHERE (title LIKE '%test%') AND (Description LIKE '%testdesc%') AND (poster LIKE '%test%') ORder by id DESC)
Dus jou opbouw is prima, mijn voordeel is dat de eerst WHERE altijd:
WHERE status = 'true'
Dit gebruikte ik ook in vorige versie maar was benieuwd naar andere manieren.
Uiteindelijk had ik dan $db->query($query.$sort.$orderby.$order) ;
Ik begrijp je regel "mijn voordeel is dat de eerst WHERE altijd: WHERE status = 'true'" niet om eerlijk te zijn. Wat bedoel je daarmee?
Ik wil alleen videos kunnen kijken die status true hebben dus hoef ik niet de eerste AND te veranderen in WHERE.
Ah, ok, dat begreep ik er niet uit, maar maakt het opbouwen van de SQL query inderdaad eenvoudiger. Dan heb je altijd al een begin van je where clause.