[sql] Select statement met x aantal voorwaarden

Pagina: 1
Acties:

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 18-05 10:39

Schonhose

Retro Icoon

Topicstarter
Ik ben bezig met een database in MySQL om daar in mijn dvd collectie in op te slaan.

Nu heb ik een tabel movies met daarin onder meer de veldnamen title en year.

Nu kan ik met een simpele select query heel makkelijk gaan zoeken op titel:

PHP:
1
2
$query = "select * from movies where title like '%$title%'";
$result = mysql_query($query) or die(mysql_error());


zoals je ziet heb ik het zo aangepast dat er ook op delen van de titel wordt gezocht. Dit vind ik makkelijk omdat ik zo alles kan opzoeken met bijvoorbeeld 'jack' (welke mij bijvoorbeeld zowel 'jackass the movie' als 'kangaroo jack' zouden opleveren.)

Zover nog geen problemen. Met behulp van een form kan ik op de website ingeven waarop er gezocht moet worden.

HTML:
1
2
3
4
5
6
7
<div>
      <form method="post" action="">
      Title of movie: 
      <input type="text" name="title" size="14"  /><br />
      <input type="hidden" name="dosearch" value="yes"  />
      </form>
</div>


de hidden input type met de naam dosearch gebruik ik om in het PHP scriptje wat onder deze form hangt te beslissen of ik moet zoeken ja of nee. (met behulp van een IF statement)

Dit loopt allemaal als een trein, de output wordt netjes in een tabel weggeschreven op het scherm.

Alleen dan nu het probleem:

Ik zou graag ook willen zoeken op jaar. In mijn oneindige onnozelheid heb ik vervolgens het form aangepast tot:

HTML:
1
2
3
4
5
6
7
8
9
<div>
      <form method="post" action="">
      Title of movie: 
      <input type="text" name="title" size="14"  /><br />
      Year of movie: 
      <input type="text" name="year" size="14"  /><br />
      <input type="hidden" name="dosearch" value="yes"  />
      </form>
</div>


maar toen begonnen de problemen. Want ik heb nu geen idee hoe ik mijn select query hierop moet aanpassen. Ik zou graag met 1 query willen werken, maar ik weet niet of dat haalbaar is.

Er zijn nu nog maar drie mogelijkheden
• Alleen de titel of een gedeelte daarvan is ingevuld
PHP:
1
2
$query = "select * from movies where title like '%$title%'";
$result = mysql_query($query) or die(mysql_error());


• Alleen een jaar is ingevuld
PHP:
1
2
$query = "select * from movies where year = 'year'";
$result = mysql_query($query) or die(mysql_error());


• Beide velden worden in zijn geheel of gedeeltelijk ingevuld
PHP:
1
2
$query = "select * from movies where title like '%$title%' and year = 'year'";
$result = mysql_query($query) or die(mysql_error());


En hier loopt het even stuk.

Ik ga liever niet uitzoeken welke variabelen wel en welke niet gevuld zijn om zo verschillende SQL's aan te bieden.

Nu hebben we er nog maar 3, maar wanneer ik ook op genre wil zoeken worden dit wel heel veel SQL statements.

Naar mijn idee moet dit makkelijker kunnen, probleem is dat ik niet weet hoe.

Net bedacht: wanneer een variabele leeg is vul daar een % voor in. Dit is een wildcard, dus alle records moeten hier in voorkomen. Geen idee of het werkt, maar even testen.

offtopic:
pff, wat een lap tekst

[ Voor 10% gewijzigd door Schonhose op 22-04-2004 13:56 ]

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:50

gorgi_19

Kruimeltjes zijn weer op :9

Visual Basic .NET:
1
2
3
4
5
6
7
Dim sqlString as String = "Select * FROM Movies WHERE 1=1 "
If Not Request.Form("year") = ""
    sqlString &= "AND year = " & Request.Form("year") & " "
End if
If Not Request.Form("title") =""
    sqlString &= "AND TITLE LIKE '%" & Request.Form("Title") & "%' "
End if


iets in deze trant. 't is pseudo code, principe werkt hetzelfde; geen rekening gehouden met SQL Injection + XSS-attacks, maar dat kan je zelf wel. :)

Als je het echt heel netjes wil doen, kan je die 1=1 ook nog wegwerken, maar moet je wel opletten dat je te allen tijde een geldige SQL syntax houdt.

[ Voor 83% gewijzigd door gorgi_19 op 22-04-2004 14:03 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Schonhose
  • Registratie: April 2000
  • Laatst online: 18-05 10:39

Schonhose

Retro Icoon

Topicstarter
Ok thanks, maar na nader onderzoek blijkt dus dat wanneer dit stukje:

HTML:
1
2
3
4
5
6
7
<div>
      <form method="post" action="">
      Title of movie: 
      <input type="text" name="title" size="14"  /><br />
      <input type="hidden" name="dosearch" value="yes"  />
      </form>
</div>


wordt uitgebreid met het input box voor jaar tot:

HTML:
1
2
3
4
5
6
7
8
9
<div>
      <form method="post" action="">
      Title of movie: 
      <input type="text" name="title" size="14"  /><br />
      Year of movie: 
      <input type="text" name="year" size="14"  /><br />
      <input type="hidden" name="dosearch" value="yes"  />
      </form>
</div>


de hidden variable dosearch niet meer gevuld wordt. Dus in voorbeeld 1 werkt het wel, na het toevoegen van een extra input type wordt deze variabele niet meer gezet, zodat het PHP gedeelte niet wordt uitgevoerd.

:?

Vaag probleem....

@gorgi_19: hmmm, das wel een elegante oplossing.... maar helaas heb ik er niets aan omdat er geen sql statment wordt uitgevoerd. :+

[ Voor 19% gewijzigd door Schonhose op 22-04-2004 14:09 ]

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


  • Schonhose
  • Registratie: April 2000
  • Laatst online: 18-05 10:39

Schonhose

Retro Icoon

Topicstarter
Ok, de oplossing:

het toevoegen van: <input type="submit"> zodat de HTML code nu wordt:

HTML:
1
2
3
4
5
6
7
8
9
10
<div>
      <form method="post" action="">
      Title of movie: 
      <input type="text" name="title" size="14"  /><br />
      Year of movie: 
      <input type="text" name="year" size="14"  /><br />
      <input type="hidden" name="dosearch" value="yes"  />
      <input type="submit">
      </form>
</div>


en de SQL statement als volgt:

PHP:
1
2
$query = "select * from movies where title like '%$title%' and year like '%$year%'";
$sql = mysql_query($query) or die(mysql_error());


dit werkt wel en ook wanneer 1 veld niet wordt ingevuld.

* Schonhose snapt er niets van, maar gaat nu maar eens kijken of het netter kan.

[ Voor 20% gewijzigd door Schonhose op 22-04-2004 14:48 ]

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Verwijderd

Zou dit niet werken ?
code:
1
2
3
4
5
6
7
<?
$query = "select * from movies where title like '%$title%'";
if ($_POST['year'] != "") {
  $query .= ' AND year == "'.$_POST['year'].'"';
}
$result = mysql_query($query) or die(mysql_error());
?>

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 18-05 10:39

Schonhose

Retro Icoon

Topicstarter
Die code van jou werkt ook, evenals die code van mij. Vind de code van jou wel logischer, dus ga zoiets maar eens implementeren. Het werkt, dus nu moet ik de code nog opschonen :D

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005

Pagina: 1