Variabelen worden niet goed gepakt, $_POST

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mauricedb
  • Registratie: Maart 2007
  • Laatst online: 22:10
Ik heb op mijn site als proef een 'pagination' balk i.c.m. javascript en ajax zodat je makkelijk en snel door verschillende pagina's van content kunt bladeren. Omdat ik nog niet heel bekend ben met javascript en ajax heb ik dit script van het internet geplukt (werkt goed) en dit script probeer ik nu aan te passen zodat ik o.a. de content die hij laat zien kan filteren op bepaalde dingen (zonder dat daarvoor de pagina vernieuwd hoeft te worden). Ik ben er al een hele tijd mee aan het stoeien, maar ik denk dat ik er bijna ben, misschien dat jullie net dat laatste stukje voor kunnen zeggen 8)7

Om maar even compleet te zijn met de codes:

Recensies.js
JavaScript:
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
$(document).ready(function(){
    function loading_show(){
        $('#loading').html("<img src='/theme/default/images/loading.gif'/>").fadeIn('fast');
    }
    function loading_hide(){
        $('#loading').fadeOut('slow');
    }                
    function loadData(page,platform){
        loading_show();                    
        $.ajax
        ({
            type: "POST",
            url: "/theme/default/recensies_laden.php",
            data:   "page=" + page + "&platform=" + platform,
            success: function(msg)
            {
                $("#container").ajaxComplete(function(event, request, settings)
                {
                    loading_hide();
                    $("#container").html(msg);
                });
            }
        });
    }
    loadData(1);  // For first time page load default results
    $('#container .pagination li.active').live('click',function(){
        var page = $(this).attr('p');
        loadData(page);
    });
    $('#container .pagination li.active').live('touchend',function(){
        var page = $(this).attr('p');
        loadData(page);
    });
    $('#container .platform li').live('click',function(){
        var platform = $(this).attr('platform');
        loadData(platform);
    });
});


Recensies_laden.php
SQL:
1
2
3
4
5
6
7
8
9
10
11
if(isset($_POST['platform']))
{
    $platform = $_POST['platform'];
    $platform = "AND gespeeld.gespeeldopverkort = '".$platform."'";
}
else
{
    $platform = "";
}

$query_pag_data = "SELECT * FROM items WHERE code... $platform";


Het probleem is nu dat hij één van de twee pakt, dus of hij pakt het pagina nummer of hij pakt platform. Even als verduidelijking:

Links als ik een pagina aanklik en rechts als ik een platform aanklik:
Afbeeldingslocatie: http://mauricedb.nl/data/uploads/images/201208/17082012154616.jpg

Iemand enig idee? Vast wel toch!

Acties:
  • 0 Henk 'm!

  • Zoefff
  • Registratie: September 2001
  • Laatst online: 13-09 22:13

Zoefff

❤ 

Je pakt binnen de PHP code de page variable überhaupt nergens aan? Of heb je die code voor het gemak achterwege gelaten?

Daarnaast weet ik niet of je nog ergens iets aan escaping doet, maar als dit de volledige query constructor is dan is het een MySQL injection-fest waiting to happen :P


FotoblogWerkaandemuur.nlMoestuincursus.nlTwitter


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Waarom roep je loadData() maar met 1 parameter aan?

Edit: Lees jezelf ook eens goed in over SQL Injection (uitleg).

[ Voor 60% gewijzigd door OkkE op 17-08-2012 16:20 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

W00t, injection feest !

Enne check je JS code:

loadData(page);
.
.
.
loadData(platform);

Dat moet natuurlijk iets als: loadData(page, platform); zijn ...

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Acties:
  • 0 Henk 'm!

  • Zoefff
  • Registratie: September 2001
  • Laatst online: 13-09 22:13

Zoefff

❤ 

Oh en bij nader inzicht roep je loadData() op regel 32 correct aan (met page als eerste parameter) maar stuur je op regel 36 stiekem platform als page mee.

^ Wat zij zeggen dus ;)

[ Voor 8% gewijzigd door Zoefff op 17-08-2012 16:15 ]


FotoblogWerkaandemuur.nlMoestuincursus.nlTwitter


Acties:
  • 0 Henk 'm!

  • mauricedb
  • Registratie: Maart 2007
  • Laatst online: 22:10
Ik moet nog inderdaad een paar regeltjes beveiligen en het aanroepen van page heb ik even weggelaten ja.

Ik heb het geprobeerd met loadData(page,platform);, maar dat pakt ie niet. Dan komt Firebug met de melding:

ReferenceError: page is not defined, loadData(page, platform);

Jullie bedoelen dan toch dat loadData(page, platform); op de regels 28, 32 en 36 moet staan he?

Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

mauricedb schreef op vrijdag 17 augustus 2012 @ 16:36:
ReferenceError: page is not defined, loadData(page, platform);

Jullie bedoelen dan toch dat loadData(page, platform); op de regels 28, 32 en 36 moet staan he?
Ja, het gaat om de functie-aanroep op die regels. Die error is logisch, simpel debug werk... Binnen de scoop definieer je steeds maar één van de twee...

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • Zoefff
  • Registratie: September 2001
  • Laatst online: 13-09 22:13

Zoefff

❤ 

mauricedb schreef op vrijdag 17 augustus 2012 @ 16:36:
Ik moet nog inderdaad een paar regeltjes beveiligen en het aanroepen van page heb ik even weggelaten ja.

Ik heb het geprobeerd met loadData(page,platform);, maar dat pakt ie niet. Dan komt Firebug met de melding:

ReferenceError: page is not defined, loadData(page, platform);

Jullie bedoelen dan toch dat loadData(page, platform); op de regels 28, 32 en 36 moet staan he?
Volgens mij heeft dit topic weinig te maken met "het laatste stukje voorzeggen" maar meer met het ontbreken van basiskennis. Lees dit stuk over functions bijvoorbeeld eens, en probeer eens regel voor regel aan jezelf uit te leggen wat de code die je geschreven of gebruikt hebt nou precies doet. Grote kans dat je dan al zelf kan bepalen wat er mis gaat en hoe je dat moet oplossen :)


FotoblogWerkaandemuur.nlMoestuincursus.nlTwitter


Acties:
  • 0 Henk 'm!

  • mauricedb
  • Registratie: Maart 2007
  • Laatst online: 22:10
Ok, ik denk dat ik nu wel weet waar het mis gaat, even kijken of het mij lukt om 't te verhelpen.

Ik heb 'm :D

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$('#container .pagination li.active').live('click',function(){
        var page = $(this).attr('p');
        var platform = $(this).attr('platform');
        loadData(page, platform);
    });
    $('#container .pagination li.active').live('touchend',function(){
        var page = $(this).attr('p');
        var platform = $(this).attr('platform');
        loadData(page, platform);
    });
    $('#container .platform li').live('click',function(){
        var page = $(this).attr('p');
        var platform = $(this).attr('platform');
        loadData(page, platform);
    });


Edit: Alhoewel.. hij doet het iets beter.. :P Nog niet helemaal

[ Voor 78% gewijzigd door mauricedb op 17-08-2012 17:23 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nu nog even wat lezen over DRY ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • mauricedb
  • Registratie: Maart 2007
  • Laatst online: 22:10
Ik zit nog eigenlijk met hetzelfde probleem. Ik heb er weer de nodige tijd ingestoken maar ik krijg het niet voor elkaar. Ik kan prima de query sorteren op platform en pagina. Afzonderlijk welteverstaan, niet samen tegelijk. Oftewel als de pagina geladen wordt, dan wordt pagina 1 automatisch geladen. Zodra ik dan op een andere pagina klik ga ik ook gewoon naar die pagina maar als ik dan op een platform klik, zie ik wel alleen de resultaten gesorteerd op dat platform (op de 1e pagina), maar als ik dan naar de volgende pagina ga dan pakt ie 't platform niet meer.

Oftewel de $_POST['platform'] blijft niet behouden. Ik heb 't geprobeerd met cookies opslaan, maar dit is ook niet wat want de pagina moet eerst vernieuwd worden voordat de cookie echt van kracht is. Dus mijn vraag is (als jullie bovenstaand verhaal begrijpen) hoe ik het beste een eerdere POST variabele opsla zodat deze waarde behouden blijft als ik naar een andere pagina ga.

Ik heb zitten kijken naar $_SESSION, maar dit is zover ik begrijp ook niet hetgeen ik zoek, aangezien de javascript op de client draait en php op de server. Heb 't alsnog wel geprobeerd maar hier kwam verder niks uit. Ik heb zitten denken maar omdat mijn kennis van javascript en ajax niet al te groot is (weet wel de basis, heb daar ook meerdere tut's voor bekeken maar daar leggen ze dus ook echt puur de basis uit) heb ik geen idee hoe ik dit het beste aan kan pakken.

Acties:
  • 0 Henk 'm!

  • azerty
  • Registratie: Maart 2009
  • Laatst online: 08:32
Maak misschien eens een jsfiddle (of gelijkaardig) aan met je uitgeklede code, zodat we kunnen zien hoe het op dit moment in elkaar zit...

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 08:23

Onbekend

...

mauricedb schreef op zaterdag 25 augustus 2012 @ 14:36:
Oftewel de $_POST['platform'] blijft niet behouden. Ik heb 't geprobeerd met cookies opslaan, maar dit is ook niet wat want de pagina moet eerst vernieuwd worden voordat de cookie echt van kracht is. Dus mijn vraag is (als jullie bovenstaand verhaal begrijpen) hoe ik het beste een eerdere POST variabele opsla zodat deze waarde behouden blijft als ik naar een andere pagina ga.
Je moet dus eerst kijken of $_POST['platform'] bestaat. Als deze bestaat zet je deze waarde in een variabele én in een cookie. Als deze niet bestaat ga je kijken of de cookie bestaat, en zet je die waarde in de variabele.
Uiteindelijk ga je altijd met de waarde in die variabele werken, en niet (nooit) direct uit de $_POST['platform'] of cookie de data gebruiken.

Of is dat het probleem niet?

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • mauricedb
  • Registratie: Maart 2007
  • Laatst online: 22:10
Ik heb 't voor elkaar :D Heb 't opgelost door eigenlijk heel simpel platform te verwerken in de pagina 'linkjes'. Voorheen had ik bijv.

code:
1
<li p='$nex' class='active' style='width:auto;'>Volgende</li>


En nu:

code:
1
<li p='$nex' platform='$platform' class='active' style='width:auto;'>Volgende</li>


Als er (nog) niet op een platform geklikt is, dan laat ie platform leeg en ander vult ie 'm dus in en het werkt geloof ik goed! :D

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 12-09 14:10
Wat RobIII zegt, maak het DRY (gooi het in een functie bijvoorbeeld) in plaats van 3x dezelfde code neerzetten.
En 'platform' is dus geen geldig html-attribuut, maar 'data-platform' wel. Werkt op dezelfde manier, maar dan is het gewoon geldig html5. En met jQuery heb je in plaats van attr() dan data().

Acties:
  • 0 Henk 'm!

  • mauricedb
  • Registratie: Maart 2007
  • Laatst online: 22:10
Thanks Barry, heb 't direct aangepast wat betreft data() :)
Pagina: 1