[php] zoeken met multiselectbox

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,
ik ben bezig met een zoekfunctie voor een profielpagina. Eerst heb ik gebruik gemaakt van checkboxen, maar dit lukte mij uiteindelijk niet.
Ik ben overgestapt naar een multi-selectbox en dit werkt erg goed.
Dit is mijn code voor de selectbox:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<select name="zoeken[]" multiple size="10" style="width:150px">
    <option value="voornaam" name ="voornaam">Voornaam</option> 
    <option value="nickname" name="nickname">Nickname</option> 
    <option value="achternaam" name="achternaam">Achternaam</option> 
    <option value="plaats" name="plaats">Woonplaats</option> 
    <option value="hobbies" name="hobbies">Hobbies</option> 
    <option value="specialismen" name="specialismen">Specialismen</option> 
    <option value="beschrijf_jezelf" name="beschrijf_jezelf">Beschrijf jezelf</option> 
    <option value="eerste_singel" name="eerste_singel">Eerste Single</option> 
    <option value="beroep_opleiding" name="beroep_opleiding">Beroep/Opleiding</option>
    <option value="muziek" name="muziek">Muzikale Voorkeur</option>
</select>

Met behulp van de volgende code zoek ik daadwerkelijk:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(isset($_POST['zoeken'])) 
  { 
  $zoekstring = "(";
  foreach($_POST['zoeken'] as $key=>$value) 
    { 
    if ($zoekstring != "(") $zoekstring.=" OR ";
    $zoekstring .= $value." like '%$details%' ";
    } 
  $zoekstring .= ")";
  $query_getNum = "select user_id from profiel where ".$myDatum.$zoekstring.(($telefoon_mobiel)?" and telefoon_mobiel<>''":"").(($telefoon)?" and telefoon<>''":"")." and actief=1";
  $query_getNewest = "select *, from_unixtime(unix_timestamp(aanmeld_datum), '%d %M %Y @ %H:%i') as datum, geboorte_datum, ((YEAR(CURRENT_DATE)-YEAR(geboorte_datum)) - (RIGHT(CURRENT_DATE,5)<RIGHT(geboorte_datum,5))) AS age from profiel where ".$myDatum.$zoekstring.(($telefoon_mobiel)?" and telefoon_mobiel<>''":"").(($telefoon)?" and telefoon<>''":"")." and actief=1 order by $sort desc limit $offset, $limit";
  $getNum = mysql_query($query_getNum) or die (mysql_error());
  $getNewest = mysql_query($query_getNewest) or die(mysql_error());
  }

Dit script werkt erg goed en krijg er de goede resultaten mee. Ik heb nu alleen een probleem. Op een pagina mogen er maar 20 resultaten weergegeven worden.
Wanneer dit aantal meer is, moet je op een knop 'volgende' klikken.
Deze knop is een link met daarin variabelen die moeten worden meegestuurd.
Deze link is tot nu toe:
code:
1
<a href=\"?offset=$next".(($telefoon_mobiel)?"&telefoon_mobiel=$telefoon_mobiel":"").(($telefoon)?"&telefoon=$telefoon":"")."&maandselect=$maandselect&dagselect=$dagselect&jaarselect=$jaarselect&sort=$sort\">volgende</a>

Dagselect is bijvoorbeeld een selectbox met daarin de dagen van de maand. Door middel van deze selectie wordt de geboortedag meegenomen waarop je kan zoeken.
Nu is mijn probleem dat de multiselectbox niet wordt meegenomen. Ik weet niet hoe je deze variabelen mee kan nemen in de link.
Heeft er iemand een idee? Ik heb al veel gezocht, maar kan het echt niet vinden!
Ik hoop dat jullie me kunnen helpen!

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Tip: gebruik voor zoekopdrachten GET ipv POST

Kun je eenvoudig dezelfde zoekopdracht nog een keer meesturen, maar dan met een ander pagina nummer.

[ Voor 54% gewijzigd door Bosmonster op 22-12-2004 13:35 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Een paar dingetjes. Ik zie in je for loopje een variabel $details staan terwijl je $value bedoelt (waarschijnlijk). Verder zorgt multiple er niet voor dat er meerdere items worden meegestuurd als ik me niet heel erg vergis. Volgens mij is de laatst geselecteerde waarde, degene die meegestuurd wordt. Je zou dus bij een onclick of onchange event even alle options moeten nalopen om te controleren of ze geselecteerd zijn en aan de hand daarvan de waarde voor de zoekstring bepalen. Dit gebeurt dus client side, je zou de die waarde bijvoorbeeld in een aparte hidden input kunnen zetten. Ik hoop dat je er uit komt zo, als je het nog niet snapt wil ik ook nog wel een stukje code voor je typen :)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ehm ik snap eigenlijk niet zo goed wat je bedoelt.. sorry!
Die variabele $details is een tekstveldje, waar je een zoekwoord in kan vullen en dan met behulp van die selectbox in de geselecteerde velden kan zoeken.
De zoekfunctie zelf doet het namelijk wel gewoon en werkt goed, behalve dus het meenemen naar de volgende pagina.
Ik hoop dat je me nog even kan helpen!

[ Voor 19% gewijzigd door Verwijderd op 22-12-2004 13:52 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Bosmonster schreef op woensdag 22 december 2004 @ 13:35:
Tip: gebruik voor zoekopdrachten GET ipv POST

Kun je eenvoudig dezelfde zoekopdracht nog een keer meesturen, maar dan met een ander pagina nummer.
In dit verband is het ook erg handig om FireFox met de webdevelopment plugin te gebruiken. Daarin kun je o.a. eenmalig alle POST's in GET's veranderen. Handig om te zien hoe en welke variabelen worden doorgegeven.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok dan, goede tip! Maar als ik dus die POST in GET omzet, overal dus, dan werkt het dus hetzelfde? Het enige verschil is toch dat bij een GET method de variabelen die worden meegegeven in de adresbalk komen te staan?

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 22 december 2004 @ 14:09:
ok dan, goede tip! Maar als ik dus die POST in GET omzet, overal dus, dan werkt het dus hetzelfde? Het enige verschil is toch dat bij een GET method de variabelen die worden meegegeven in de adresbalk komen te staan?
Ja, dan kun je goed zien *hoe* de variabelen worden doorgegeven en dat wilde je toch weten?

Overigens heb ik me al een paar keer in de vingers gesneden door GET te gebruiken i.p.v. POST en te vergeten dat in de productieomgeving weer in POST te veranderen. Dat gaat lang goed, totdat de URL een bepaalde maximumlengte overschrijdt (ca 2048).

Kun je lang zoeken naar de reden dat een form dat eerst prima werkte ineens 'raar' gaat doen...

Acties:
  • 0 Henk 'm!

Verwijderd

Post is zowieso riskant. Als ik op jouw site in de url een paar woorden verander kan iemand in sommige gevallen een hele tabel uit je database droppen als je daar in je code niet voor uitkijkt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik dacht serieus altijd dat het juist andersom was, dat de beste methode POST was, als ik mij niet vergis, werd dit tijdens PHP-lessen altijd verteld...
Maar goed, ik denk dan dat het inderdaad het verstandigste is om GET te gebruiken, maar het klinkt een beetje stom, maar bestaat er ook zoiets als if(isset($_GET['zoeken'])) en foreach($_GET['zoeken'] as $key=>$value).
Maakt dat helemaal niets uit in vergelijking met de POST-methode?

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-09 08:50

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op woensdag 22 december 2004 @ 16:50:
Ik dacht serieus altijd dat het juist andersom was, dat de beste methode POST was, als ik mij niet vergis, werd dit tijdens PHP-lessen altijd verteld...
Maar goed, ik denk dan dat het inderdaad het verstandigste is om GET te gebruiken, maar het klinkt een beetje stom, maar bestaat er ook zoiets als if(isset($_GET['zoeken'])) en foreach($_GET['zoeken'] as $key=>$value).
Maakt dat helemaal niets uit in vergelijking met de POST-methode?
Nee, je blijft in beide gevallen een gruwelijke lek houden in je SQL Statement, hoewel de GET iets makkelijker te exploiten is dan de POST.

[ Voor 5% gewijzigd door gorgi_19 op 22-12-2004 16:52 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
ok, ik heb nu gekeken naar welke variabelen er door worden gegeven.
De variabelen die mee worden genomen naar de volgende pagina zijn als volgt:

code:
1
http://localhost/test.php?offset=10&maandselect=&dagselect=&jaarselect=&value=plaats&details=den haag&sort=aanmeld_datum


Deze link in het php-script zelf is:

code:
1
<a href=\"?offset=$next".(($telefoon_mobiel)?"&telefoon_mobiel=$telefoon_mobiel":"").(($telefoon)?"&telefoon=$telefoon":"")."&maandselect=$maandselect&dagselect=$dagselect&jaarselect=$jaarselect&value=$value&details=$details&sort=$sort\">volgende</a>


Deze variabelen krijg je als je in een invoerveld Den Haag invult en in de selectbox woonplaats aanvinkt.

Toch krijg ik niet de goede resultaten als ik op Volgende klik. Het item dat geselecteerd is, wordt niet meegenomen en in dit geval krijg ik alle resultaten in plaats van resultaten met daarin woonplaats Den Haag.
Of is het de bedoeling dat ik in de selectbox ook ergens aangeef welke geselecteerd is, dat deze ook wordt meegenomen naar de volgende pagina?
Ik kom er echt even niet meer uit, ik hoop dat jullie nog goede ideeen hebben!!

[ Voor 17% gewijzigd door Verwijderd op 23-12-2004 13:20 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op woensdag 22 december 2004 @ 16:27:
Post is zowieso riskant. Als ik op jouw site in de url een paar woorden verander kan iemand in sommige gevallen een hele tabel uit je database droppen als je daar in je code niet voor uitkijkt.
Waarom is post riskanter dan get? Volgens mij haal je de twee een beetje door elkaar. GET is namelijk via de url.

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
Dat dacht ik ook al inderdaad... :)
Maar om te kijken welke variabelen er mee worden genomen, toch maar even GET gebruikt...
Zo kan je wel gemakkelijk zien welke er mee worden genomen, hoewel het nog steeds niet werkt, ik ben nog druk verder aan het zoeken overal, maar ik kan het echt niet vinden :/

Verwijderd

Verwijderd schreef op woensdag 22 december 2004 @ 16:50:
Ik dacht serieus altijd dat het juist andersom was, dat de beste methode POST was, als ik mij niet vergis, werd dit tijdens PHP-lessen altijd verteld...
Maar goed, ik denk dan dat het inderdaad het verstandigste is om GET te gebruiken, maar het klinkt een beetje stom, maar bestaat er ook zoiets als if(isset($_GET['zoeken'])) en foreach($_GET['zoeken'] as $key=>$value).
Maakt dat helemaal niets uit in vergelijking met de POST-methode?
POST is i.h.a. ook beter. Het werkt altijd, hoe groot je form ook wordt en het zorgt ervoor dat de gebruiker niet lastig gevallen wordt met vreemde codes in URL's.

Dat laatste kan ook een bezwaar zijn. Soms wil je dat de gebruiker een URL kan kopieren en met een bookmark een directe GET kan uitvoeren. Dat gaat met POST niet. Ook kan het handig zijn voor jezelf om even snel te zien wat er doorgegeven wordt (debugging).

Dus, mijn stelling: gebruik POST, tenzij:
- Je wilt dat gebruikers query URL's kunnen bookmarken
- Je je scripts aan het debuggen bent

Qua veiligheid maakt POST of GET niets uit. Dat is alleen een cosmetisch verschil. Als je fouten in je scripts hebt die met GET te exploiteren zijn, kan dat met POST ook.

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
GET gebruiken en met QUERY_STRING de zoekcriteria doorsturen naar de volgende pagina:

Bijvoorbeeld:
PHP:
1
echo 'resultaat.php?'.ereg_replace ('pagina=[0-9]{0,}\&', '', $_SERVER['QUERY_STRING']);


Ow ja, die ereg is om de pagina var er uit te halen... deze komt anders een paar keer voor...

Ow ja 2: GET gebruik je niet bij het versturen van passwords e.d. anders kan ik niet echt een reden bedenken (behalve dat je met POST een hele wallijst met variablen kunt voorkomen in je adres balk) waarom POST beter is dan GET of andersom.

[ Voor 63% gewijzigd door Slagroom op 23-12-2004 13:04 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Zoals Xenna al zei is POST niet fundamenteel veiliger dan GET. (Al is een fout in het gebruik van query arguments misschien een fractie makkelijker te exploiteren.)

Het onderscheid tussen het gebruik van POST en GET zit in de vraag of een request idempotent is; dat wil zeggen: gebeurt er elke keer dat je de request uitvoert precies hetzelfde en krijg je hetzelfde resultaat? Traditioneel levert een GET request een statische pagina op en voert een POST request een bepaalde actie op de server uit, zoals het versturen van een mailtje. Het technische onderscheid wordt in PHP niet gemaakt, maar het is verstandig om dat ook aan te houden in PHP omdat goede browsers bijvoorbeeld weigeren om POST requests te herhalen of het resultaat te cachen.

Wat je je dus moet afvragen, is: als ik tien keer achter elkaar de request uitvoer, is het effect dan hetzelfde als wanneer ik de request een keer had uitgevoerd? Zo ja, dan gebruik je een GET request, zo nee, dan gebruik je een POST request. Zoekopdrachten kunnen zo met GET, omdat er geen blijvend effect is op de server, maar het toevoegen van informatie via een formulier (gebruiker registreren, bericht toevoegen aan gastenboek, mail versturen, enzovoorts) moet altijd met POST.

Ben je iets stricter ingesteld, dan gebruik je POST ook voor alle acties die iets op de server wijzigen, dus ook als die actie herhaald kan worden zonder verder effect. Dan stel je je de vraag: als ik deze request uitvoer, is het effect dan hetzelfde als wanneer ik de request niet had uitgevoerd?)

Je kunt trouwens stellen dat GET requests niet altijd hetzelfde effect opleveren omdat de achterliggende data kan veranderen; een document kan bijvoorbeeld van de server verwijderd worden. Zo'n request is dus niet strict genomen idempotent, maar je kunt je wel voorstellen dat je 10 GET requests tegelijkertijd of direct na elkaar doet en dat de onderliggende gegevens dan niet veranderd zijn.

[ Voor 12% gewijzigd door Soultaker op 23-12-2004 13:29 ]


Verwijderd

Topicstarter
Ik heb nu weer alles met POST gedaan, in de link kan ik ook zien welke variabelen worden doorgegeven.
En het leek mij verstandig dat de gegevens niet in de adresbalk te zien waren.

Maar hoe kan je gegevens uit een multiple selectbox als variabelen meenemen? Met een normale selectbox weet ik het wel, maar als ik hetzelfde doe met de multiple selectbox krijg ik Array als waarde van de variabele. Ik moet dan waarschijnlijk iets doen als $_POST[$zoeken][0], maar ik weet niet hoe dit officieel moet. Het is misschien een stomme vraag, maar ik kom er echt even niet meer uit!

Verwijderd

Ik zou deze documentatie eerst eens goed doornemen.
Met dit scriptje -test het eens- kun je precies zien wat je resultaat is.

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
<?php

    if($_SERVER['REQUEST_METHOD'] != "POST")
    {

?>

        <form method="POST">

        <p>
        <select name="zoeken[]" multiple size="10" style="width:150px">
        <option value="voornaam" name ="voornaam">Voornaam</option> 
        <option value="nickname" name="nickname">Nickname</option> 
        <option value="achternaam" name="achternaam">Achternaam</option> 
        <option value="plaats" name="plaats">Woonplaats</option> 
        <option value="hobbies" name="hobbies">Hobbies</option> 
        <option value="specialismen" name="specialismen">Specialismen</option> 
        <option value="beschrijf_jezelf" name="beschrijf_jezelf">Beschrijf jezelf</option> 
        <option value="eerste_singel" name="eerste_singel">Eerste Single</option> 
        <option value="beroep_opleiding" name="beroep_opleiding">Beroep/Opleiding</option>
        <option value="muziek" name="muziek">Muzikale Voorkeur</option>
        </select>
        </p>

        <p>
        <input type="submit">
        </p>

        </form>

<?php

    } else
    {

        echo "<pre>";
        print_r($_POST);
        echo "</pre>";

    }

?>


Experimenteer daar eens mee zou ik zeggen, in samenwerking met de array functies lijst.
Pagina: 1