Probleem met zoekfunctie
Laat ik eerst maar zeggen dat ik nieuw ben op dit forum, dus misschien is alles nog niet helemaal goed wat ik zeg/ en doe, ik hoop dat je daar even doorheen kunt kijken.
Ik ben voor mezelf bezig met een (test)zoekfunctie voor mijn website. Ik heb 5 zoekvakken(naam, datum(van), datum tot), vereniging, en categorie).
Nu is mijn bedoeling dat als ik op zoek klik, dat er dan wordt gezocht op de gegeven criteria(in de zoekvakken). Het probleem is dat hij helaas niet naar behoren werkt.
Dit is mijn code( dus vanaf dat ik op zoek klik):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
if(isset($_POST['Zoek'])){
$naam = $_POST['naam'];
$datumbegin = $_POST['van'];
$datumeind = $_POST['tot'];
$vereniging = $_POST['$vereniging'];
$categorie = $_POST['categorie'];
if (empty($naam) && empty($datumbegin) && empty($datumeind) && empty($vereninging) && empty($categorie)) {
$q=mysql_query("SELECT * FROM evenement");
}
if (empty($datumbegin) && empty($datumeind) && empty($vereninging) && empty ($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE naam LIKE '%$naam%'");
}
if (empty($naam) && empty ($vereninging) && empty ($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE begindatum BETWEEN '$datumbegin' AND '$datumeind'");
}
if (empty($naam) && empty($datumbegin) && empty($datumeind) && empty($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE vereniging LIKE '%$vereniging%'");
}
if (empty($naam) && empty($datumbegin) && empty($datumeind) && empty($vereninging)) {
$q=mysql_query("SELECT * FROM evenement WHERE categorie LIKE '%$categorie%'");
}
if (empty($$vereniging) && empty($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE begindatum BETWEEN '$datumbegin' AND '$datumeind' AND naam LIKE '%$naam%'");
}
if (empty($datumbegin) && empty($datumeind) && empty($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE naam LIKE '%$naam%' AND vereniging LIKE '%$vereniging%'");
}
if (empty($datumbegin) && empty($datumeind) && empty($vereniging)) {
$q=mysql_query("SELECT * FROM evenement WHERE naam LIKE '%$naam%' AND categorie LIKE '%$categorie%'");
}
if (empty($naam) && empty($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE begindatum BETWEEN '$datumbegin' AND '$datumeind' AND naam vereniging LIKE '%$vereniging%'");
}
if (empty($naam) && empty($vereniging)) {
$q=mysql_query("SELECT * FROM evenement WHERE begindatum BETWEEN '$datumbegin' AND '$datumeind' AND naam categorie LIKE '%$categorie%'");
}
if (empty($naam) && ($datumbegin) && empty($datumeind)){
$q=mysql_query("SELECT * FROM evenement WHERE categorie LIKE '%$categorie%'AND naam vereniging LIKE '%$vereniging%'");
}
?>
if(isset($_POST['Zoek'])){
$naam = $_POST['naam'];
$datumbegin = $_POST['van'];
$datumeind = $_POST['tot'];
$vereniging = $_POST['$vereniging'];
$categorie = $_POST['categorie'];
if (empty($naam) && empty($datumbegin) && empty($datumeind) && empty($vereninging) && empty($categorie)) {
$q=mysql_query("SELECT * FROM evenement");
}
if (empty($datumbegin) && empty($datumeind) && empty($vereninging) && empty ($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE naam LIKE '%$naam%'");
}
if (empty($naam) && empty ($vereninging) && empty ($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE begindatum BETWEEN '$datumbegin' AND '$datumeind'");
}
if (empty($naam) && empty($datumbegin) && empty($datumeind) && empty($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE vereniging LIKE '%$vereniging%'");
}
if (empty($naam) && empty($datumbegin) && empty($datumeind) && empty($vereninging)) {
$q=mysql_query("SELECT * FROM evenement WHERE categorie LIKE '%$categorie%'");
}
if (empty($$vereniging) && empty($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE begindatum BETWEEN '$datumbegin' AND '$datumeind' AND naam LIKE '%$naam%'");
}
if (empty($datumbegin) && empty($datumeind) && empty($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE naam LIKE '%$naam%' AND vereniging LIKE '%$vereniging%'");
}
if (empty($datumbegin) && empty($datumeind) && empty($vereniging)) {
$q=mysql_query("SELECT * FROM evenement WHERE naam LIKE '%$naam%' AND categorie LIKE '%$categorie%'");
}
if (empty($naam) && empty($categorie)) {
$q=mysql_query("SELECT * FROM evenement WHERE begindatum BETWEEN '$datumbegin' AND '$datumeind' AND naam vereniging LIKE '%$vereniging%'");
}
if (empty($naam) && empty($vereniging)) {
$q=mysql_query("SELECT * FROM evenement WHERE begindatum BETWEEN '$datumbegin' AND '$datumeind' AND naam categorie LIKE '%$categorie%'");
}
if (empty($naam) && ($datumbegin) && empty($datumeind)){
$q=mysql_query("SELECT * FROM evenement WHERE categorie LIKE '%$categorie%'AND naam vereniging LIKE '%$vereniging%'");
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
while($f = mysql_fetch_assoc($q)){
echo'
<tr>
<td width="15"><input name="checkbox[]" type="checkbox" value="<? echo f.$rows['evenementid']; ?>"></td>
<td width="85"><? echo f.$rows['naam']; ?></td>
<td width="130"><? echo f.$rows['begindatum']; ?></td>
<td width="175"><? echo f.$rows['einddatum']; ?></td>
<td width="100"><? echo f.$rows['organiserendeVerenigingid']; ?></td>
<td width="100"><? echo f.$rows['categorieid'];?></td>
<td width="100"><?$aanmeldingverplicht= f.$rows['isAanmeldingVerplicht'];if ($aanmeldingverplicht == 0){print("nee"); }if ($aanmeldingverplicht == 1){print("ja"); }?></td>
</tr>
';
}
}
?>
while($f = mysql_fetch_assoc($q)){
echo'
<tr>
<td width="15"><input name="checkbox[]" type="checkbox" value="<? echo f.$rows['evenementid']; ?>"></td>
<td width="85"><? echo f.$rows['naam']; ?></td>
<td width="130"><? echo f.$rows['begindatum']; ?></td>
<td width="175"><? echo f.$rows['einddatum']; ?></td>
<td width="100"><? echo f.$rows['organiserendeVerenigingid']; ?></td>
<td width="100"><? echo f.$rows['categorieid'];?></td>
<td width="100"><?$aanmeldingverplicht= f.$rows['isAanmeldingVerplicht'];if ($aanmeldingverplicht == 0){print("nee"); }if ($aanmeldingverplicht == 1){print("ja"); }?></td>
</tr>
';
}
}
?>
Ik hoor het wel!
Gewijzigd op 09/10/2010 14:21:00 door Gert Leersema
je script is zeer sql-injection gevoelig. ook moeten de vats mijten de quotes (" en ')
Hij geeft nu trouwens wel een foutmelding:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource i
Wat bedoel je precies met de vats mijten?( en vooral waar?)
Vincent Huisman op 09/10/2010 14:22:15:
.. moeten de vats mijten de quotes (" en ')
Jaja, en nu in begrijpelijke taal .....
@Gert Leersema: Bouw nette foutafhandeling in en de fout zal snel en duidelijk op het scherm verschijnen. Nu moeten we gaan gokken.
okeej, maar het principe klopt wel?( met wat ik wil doen). Want als dat goed is, ben ik in ieder geval al een stap verder;)
haha, sorry, het moest zijn "vars buiten de quotes", hoe ik dat voor elkaar heb gekregen xD
ik schrijf niets over empty maar geheid dat het een keer fout gaat.
Ik dacht dat dit de beste manier was, maar weet jij nog een betere dan?( ipv empty)
Of eventueel met de functie strlen()...
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
// rest
?>
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
// rest
?>
en de volgende indien van toepassing
-------------------------------------------------
checkdate
ctype functies
preg functies
trim en de ordinaire string vergelijking: == '' != ''
en het opbouwen van je query kan ook veel dynamischer dan al die if-jes die je nu hebt.
Gewijzigd op 09/10/2010 16:04:02 door Noppes Homeland
Gewijzigd op 09/10/2010 15:55:56 door Gert Leersema
Probeer nu eens een keer duidelijk en rustig uit te leggen waarom isset zo goed is, en empty zo slecht, en geef een voorbeeld.
Je maakt het jezelf alleen maar moeilijker zo.
Op regel 26. dubbele dollarteken, heeft een hele andere uitwerking dan hier waarschijnlijk gewenst is.
1. isset is er voor om te controleren of een variabele bestaat, empty is daar simperlweg niet voor bedoeld
2. empty is zinloos omdat het gewoon niet exact evealueert. Let wel, dat het meerendeel deze functie beschouwd als "Is de variabele leeg"
En nee ik ga geen voorbeelden geven, dat is totaal zinloos. Je begrijpt het of je begrijpt het niet.
En je zult tezijner tijd er zelf wel tegen aanlopen dat je
1. isset moet gebruiken om te controleren of een variabele bestaat
2. dat empty toch niet zo zinvol is om te gebruiken
strstr is toch ook niet bedoeld om te kijken of een variabele bestaat?
2. zodra je empty niet voor voor gedefinieerde variablen gebruikt, levert empty altijd leeg op als je er niks hard-coded heb ingezet. dus tenzij je hem zelf heb gevuld, levert hij altijd het goede resultaat op. (Alle browser based variablen, en mysql results zijn altijd strings).
op deel 2 van je opsomming,
1. daarom het het ook isset, om te kijken of een variable is geset (voor zover dat goed werkt, want ook die kan een gezette variable als niet gezet zien.).
2. empty is gewoon zinvol, tenzij je zelf langzamere en andere methodes gaat gebruiken. Eigenlijk is empty vrijwel een stuk beveiliging voor user input.
Maar ik begrijp je prima, ik ben het alleen niet met je eens.
En ik vind jou nogal erg opdringerig met jou mening, en wederom is het een enorm slappe onderbouwing.
Maar ik vind het prima, denk wat je wilt denken, we leven in een gemiddeld vrij land.
Een dollarteken in je post?
@ Noppes:
Bij formuliertjes die verzonden worden, zijn textvelden altijd gezet, ook als ze leeg zijn. Een goede manier om te controleren, of ze dus niet leeg zijn, met emtpy, en eventueel trim() om als alleen een spatie ongewenst is.
Verder zou ik de code als volgt aanpakken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?
$naam = mysql_real_escape_string($_POST['naam']);
$datumbegin = mysql_real_escape_string($_POST['van']);
$datumeind = mysql_real_escape_string($_POST['tot']);
$vereniging = mysql_real_escape_string($_POST['vereniging']);
$categorie = mysql_real_escape_string($_POST['categorie']);
$where = array();
if(!empty($naam)){
$where[] = "naam LIKE '%".$naam%."'";
}
if(!empty($datumbegin) && !empty($datumeind){
$where[] = "begindatum BETWEEN '".$datumbegin."' AND '".$datumeind."'";
}
if(!empty($vereniging )){
$where[] = "vereniging LIKE '%$vereniging%'";
}
if(!empty($category)){
$where[] = "categorie LIKE '%".$categorie."%'";
}
$query = "SELECT * FROM evenement".(count($where)>0?" WHERE ".implode(" AND ",$where):'');
?>
$naam = mysql_real_escape_string($_POST['naam']);
$datumbegin = mysql_real_escape_string($_POST['van']);
$datumeind = mysql_real_escape_string($_POST['tot']);
$vereniging = mysql_real_escape_string($_POST['vereniging']);
$categorie = mysql_real_escape_string($_POST['categorie']);
$where = array();
if(!empty($naam)){
$where[] = "naam LIKE '%".$naam%."'";
}
if(!empty($datumbegin) && !empty($datumeind){
$where[] = "begindatum BETWEEN '".$datumbegin."' AND '".$datumeind."'";
}
if(!empty($vereniging )){
$where[] = "vereniging LIKE '%$vereniging%'";
}
if(!empty($category)){
$where[] = "categorie LIKE '%".$categorie."%'";
}
$query = "SELECT * FROM evenement".(count($where)>0?" WHERE ".implode(" AND ",$where):'');
?>
Gewijzigd op 09/10/2010 19:33:34 door Pieter van Linschoten
empty staat niet gelijk aan `is leeg`!! Dus je kunt empty niet gebruiken om dat te bepalen!!
Nou ik weet niet hoe jij controleerd of het form wel hetgeen bevat wat jij verwacht.
En je gaat ook geen overbodige variabelen aanmaken. De `overbodige variabelen` die jij nu aanmaakt kan je alleen maar gebruiken bij je SQL statements.
Daarnaast vergeet je ook nog eens te valideren of de datums wel datums zijn, het heeft namenlijk geen zin om een query af te vuren met onzinnige waarden in de where-clause
Ik zeg het nog 1 keer,
Bij Form data, doet de empty functie EXACT wat je verwacht, dus je kan hier empty prima gebruiken om te kijken of een waarde leeg is.
Denk nu eerst eens na over hetgeen er gepost wordt, alvorens er met een non argument te komen dat empty de betekenis draagt van `is leeg`, want dat is gladhard wat je hier dus probeert te beweren.
Blijkbaar is het nog steeds heel moeilijk om te begrijpen dat emtpy niet gelijk staat aan `is leeg`
En dat is dus nu ook waarom ik steeds iets schrijf over het zinlose gebruik van deze functie!
@Noppes: Empty checked niet op 'leeg' of 'niet leeg'. Dat heb jij nu reeds vaak genoeg verteld. Maar vertel mij dan eens welke waarde er dan wél of niet door de empty heen komt die je niet zou willen hebben. Als je de vier if-jes van Pieter neemt dan voldoet empty prima.