Probleem met zoekfunctie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Gert  Leersema

Gert Leersema

09/10/2010 14:14:11
Quote Anchor link
Beste mensen,

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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%'");
}

?>

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
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>
'
;


    }
}

?>


Ik hoor het wel!
Gewijzigd op 09/10/2010 14:21:00 door Gert Leersema
 
PHP hulp

PHP hulp

28/03/2024 16:09:14
 
Vincent Huisman

Vincent Huisman

09/10/2010 14:22:15
Quote Anchor link
je script is zeer sql-injection gevoelig. ook moeten de vats mijten de quotes (" en ')
 
Gert  Leersema

Gert Leersema

09/10/2010 14:24:06
Quote Anchor link
klopt, maar eerst wil ik het graag werkend hebben, en vervolgens ga ik daarna kijken.
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?)
 
- SanThe -

- SanThe -

09/10/2010 14:44:20
Quote Anchor link
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.
 
Gert  Leersema

Gert Leersema

09/10/2010 15:16:23
Quote Anchor link
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;)
 
Vincent Huisman

Vincent Huisman

09/10/2010 15:24:10
Quote Anchor link
haha, sorry, het moest zijn "vars buiten de quotes", hoe ik dat voor elkaar heb gekregen xD
 
Noppes Homeland

Noppes Homeland

09/10/2010 15:36:22
Quote Anchor link
ik schrijf niets over empty maar geheid dat het een keer fout gaat.
 
Gert  Leersema

Gert Leersema

09/10/2010 15:37:26
Quote Anchor link
Ik dacht dat dit de beste manier was, maar weet jij nog een betere dan?( ipv empty)
 
Joren de Wit

Joren de Wit

09/10/2010 15:41:13
Quote Anchor link
De functie empty() geeft ook true als er bijvoorbeeld 0 ingevuld is. Als je wilt controleren op een lege string is dit de beste manier:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if($string == '') {
  // $string is leeg
}
?>

Of eventueel met de functie strlen()...
 
- SanThe -

- SanThe -

09/10/2010 15:42:36
Quote Anchor link
Zet dit bovenin je script
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

// rest
?>
 
Noppes Homeland

Noppes Homeland

09/10/2010 15:42:52
Quote Anchor link
isset

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
 
Gert  Leersema

Gert Leersema

09/10/2010 15:55:45
Quote Anchor link
Bedankt voor de tips, ik ga ermee aan de slag!
Gewijzigd op 09/10/2010 15:55:56 door Gert Leersema
 
Nicoow Unknown

Nicoow Unknown

09/10/2010 18:49:45
Quote Anchor link
Nou Noppes, omdat je er om vraagt, ben ik maar weer zo aardig.
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.
 
Pieter van Linschoten

Pieter van Linschoten

09/10/2010 19:18:33
Quote Anchor link
Dit is het eerste wat mij binnen een seconde opviel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
if (empty($$vereniging) && empty($categorie)) {
?>

Op regel 26. dubbele dollarteken, heeft een hele andere uitwerking dan hier waarschijnlijk gewenst is.
 
Noppes Homeland

Noppes Homeland

09/10/2010 19:21:04
Quote Anchor link
@Nico,
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
 
Nicoow Unknown

Nicoow Unknown

09/10/2010 19:30:09
Quote Anchor link
1. dat klopt, anders had empty namelijk wel isset geheten.
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.
 
Pieter van Linschoten

Pieter van Linschoten

09/10/2010 19:31:55
Quote Anchor link
Nog een foutje ontdekt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
$vereniging
= $_POST['$vereniging'];
?>

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)
PHP script in nieuw venster Selecteer het PHP script
1
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):'');
?>
Gewijzigd op 09/10/2010 19:33:34 door Pieter van Linschoten
 
Noppes Homeland

Noppes Homeland

09/10/2010 19:45:16
Quote Anchor link
@Pieter
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
 
Nicoow Unknown

Nicoow Unknown

09/10/2010 19:56:33
Quote Anchor link
@noppes,
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.
 
Noppes Homeland

Noppes Homeland

09/10/2010 20:08:13
Quote Anchor link
@Nico, ook jij begrijpt niet wat een lege string 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!
 
- SanThe -

- SanThe -

09/10/2010 20:15:07
Quote Anchor link
@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.
 

Pagina: 1 2 volgende »



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.