Jquery search en table met php als backend

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Karel hertens

karel hertens

23/11/2011 16:38:10
Quote Anchor link
Hallo allemaal,

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."") ;
}


screenshot van de front-end: Afbeelding
Groet Karel
 
PHP hulp

PHP hulp

25/12/2024 19:41:28
 
Erwin H

Erwin H

23/11/2011 17:00:32
Quote Anchor link
1. check of de waardes in de $_GET array wel zijn gezet (met isset($_GET['stitle'])), anders kan je een foutmelding krijgen.
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
 
Karel hertens

karel hertens

23/11/2011 17:11:19
Quote Anchor link
Dit is puur het basis test script, injecties enzo doe ik later als alles werkt, dan refactor ik script nog enzo. Gaat nu puur om opbouw van query.
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?
 
Erwin H

Erwin H

23/11/2011 17:21:53
Quote Anchor link
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.
 
Karel hertens

karel hertens

23/11/2011 17:27:54
Quote Anchor link
Bouw je dan op:

$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.
 
Erwin H

Erwin H

23/11/2011 17:41:43
Quote Anchor link
Bijvoorbeeld. Het is voor mij een beetje onduidelijk om te zien welke combinaties er mogelijk zijn en hoe die dan verwerkt moeten worden. Maar als het puur "en-en" is, dan kan je voor elke parameter een extra stukje SQL toevoegen.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

Zo hoef je dus niet elke keer te checken of je nu WHERE of AND nodig hebt.
 
Karel hertens

karel hertens

23/11/2011 18:03:59
Quote Anchor link
Een voorbeeld:
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) ;
 
Erwin H

Erwin H

23/11/2011 18:09:26
Quote Anchor link
Ik begrijp je regel "mijn voordeel is dat de eerst WHERE altijd: WHERE status = 'true'" niet om eerlijk te zijn. Wat bedoel je daarmee?
 
Karel hertens

karel hertens

23/11/2011 18:11:33
Quote Anchor link
Ik heb in database een paar opties voor status zoals true, false, encode, progressencode, enz

Ik wil alleen videos kunnen kijken die status true hebben dus hoef ik niet de eerste AND te veranderen in WHERE.
 
Erwin H

Erwin H

23/11/2011 18:15:00
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.