[PHP] Winkelwagentje update

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
Momenteel ben ik bezig met een klein project wat inhoud: een webshop bouwen. Dit om even weer in de PHP te komen :+ .

Nu blijf ik een beetje haken bij het winkelwagentje, hieronder even een PSD'tje hoe dit zou moeten verlopen;
  • Item wordt besteld
  • Item wordt in SESSION ARRAY weggezet
  • Controle of item al bestaat, zo ja tel het totale aantal ervan, zo nee ga verder
  • Zet het item in de winkelwagen
Hieronder de code tot nu toe;

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
45
46
47
48
49
    $delaant=$_GET[delaant];
    $delid=$_GET[delid];
    if($delaant && $delid){
        unset($_SESSION[$delaant]);
        unset($_SESSION[$delid]);
        session_destroy('wwtellerart');
    }
        
if (!isset($_SESSION['ingelogd'])
    || $_SESSION['ingelogd'] !== true){
    print '';
    }
    else{
if($_SESSION['wwtellerart']){
echo '<h3 class="titel">&nbsp;&nbsp;&nbsp;&nbsp;Winkelwagen</h3><br>';
}
$teller2=0;
$totaal = "";
$domain = $_SERVER['HTTP_HOST'];
  $path = $_SERVER['SCRIPT_NAME'];
  $queryString = $_SERVER['QUERY_STRING'];
  $url = "http://" . $domain . $path . "?" . $queryString;

for($teller1=0; $teller1<$_SESSION['wwtellerart']; $teller1++){

    $telaantal='aantal'.$teller1;
    $telid='id'.$teller1;
        
    $aantal=$_SESSION[$telaantal];
    $idart=$_SESSION[$telid];
    $sql=mysql_query("SELECT * FROM producten WHERE p_id='$idart'");
    $rij=mysql_fetch_array($sql);
    if($rij>0){
    print '<p class="gewonetekst">';
    print $aantal.' '.'x&nbsp;';
    print $rij[1].'<br>';
    print 'Subtotaal: &euro;&nbsp;'.$tot1 = $rij[p_prijs] *= $aantal;
    print '<br><a href="'.$url.'&delaant='.$telaantal.'&delid='.$telid.'" target="_self" class="leesmeer">VERWIJDER</a><br>';
    $tyr = $totaal += $tot1;
    }
    }

    if($tyr == 0){
        print ' ';
    }
    else{
        print '<br><p class="gewonetekst"><b>Totaalprijs: &euro;&nbsp;'.$tyr.'</b></p>';
    }
    }


Dus even kort samengevat ben ik op zoek hoe ik moet controleren of een item in de winkelwagen bestaat en zo ja ik het aantal van deze moet gaan ophogen.

Als je eenmaal in de PHP zit, kom je er amper meer uit :+

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • dev10
  • Registratie: April 2005
  • Laatst online: 18-09 19:18
Eehm. Ga je deze webshop ook online zetten? (No offence)

Wat je het kunt doen, is een array maken in je $_SESSION variabele met als naam 'rows'. Daar kun je dan inzetten welk artikel en het aantal. Dan kun je met de array_* functions in PHP wel uitzoeken of een artikel zich al in de winkelwagen bevindt.

Voorbeeldje:
PHP:
1
2
3
4
$_SESSION['rows'] = array(
 array('artikel_id', 'aantal'),
 array('artikel2_id', 'aantal')
);


Verder is het beter om je orders en order_rows direct in de database weg te schrijven. Dan kun je door middel van een back-end zien welke orders er zijn blijven hangen en kun je, als de klant zijn NAW-gegevens al heeft ingevuld, contact opnemen met de klant. Als je het persé op bovenstaande manier wilt doen, kun je nooit zien hoeveel mensen daadwerkelijk een bestelling hebben geprobeerd te plaatsen.

Verder kan ik je aanraden om alle idempotente acties via een POST request te doen. (Wikipedia: Create, read, update and delete)

Iets anders wat ik je serieus wil aanraden: ga meer PHP leren en besteed de webshop uit als het geen leersysteempje is wat niet online komt. ;)

Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
het komt alleen online voor mijzelf en andere mensen die het gaan testen;)

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
Ik zou er een databank achter hangen, zodat je later ook mooie statistiekjes kunt maken van hoeveel mensen er effectief op je site komen, iets in het winkelmandje stoppen en die afrekenen. Zo kun je het proces volgen en zien waar het eventueel spaak loopt. Als je geen info hebt kan je de site ook niet verbeteren...

Ik zou de bezoeker een random cookie geven en daaraan gekoppeld éénmalig wat info ivm browser enzo ( ivm webshop verbeteren )
bezoeker
----------
bezoeker_id, cookie, browser, ... ( gewenste info )

winkelmand_producten
----------
id, bezoeker_id, aantal, product_id, status, datum

waarbij status gwn aangeeft wat er mee gebeurt is, verwijdert, toegevoegd, afgerekend, ...

[ Voor 37% gewijzigd door Precision op 03-06-2009 19:41 ]

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?


Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
flanderssoft schreef op woensdag 03 juni 2009 @ 19:33:
Ik zou de bezoeker een random cookie geven en daaraan gekoppeld éénmalig wat info ivm browser enzo ( ivm webshop verbeteren )
bezoeker
----------
bezoeker_id, cookie, browser, ... ( gewenste info )

winkelmand_producten
----------
id, bezoeker_id, aantal, product_id, status, datum

waarbij status gwn aangeeft wat er mee gebeurt is, verwijdert, toegevoegd, afgerekend, ...
In principe staat de webshop al, inderdaad zijn bovenstaande items nog niet ingebouwd en dit moet ik nog gaan ontwikkelen. Vooral voorraad management via het admin panel. Daarbij zou ik willen weten hoe ik die functie voor het winkelwagentje eruit moet gaan zien.

De webshop is niet voor commercieel gebruik en wordt gebruikt voor een klantopdracht, neem even een kijkje op: http://webshopjef.jeffreydegraaf.nl

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • Kwastie
  • Registratie: April 2005
  • Laatst online: 19-09 10:42

Kwastie

Awesomeness

Als je producten bewaard in een array kun je controleren of dit product al besteld is.

Voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$_SESSION['articles'] = array(); 

$article_id = 10; //Uit een db gehaald

if(isset($_SESSION['articles'][$article_id])) {
   //Artikel bestaat, 1 extra toevoegen
   $_SESSION['articles'][$article_id]['amount'] ++;  
} else {
   //Artikel toevoegen en aantal op 1
   $_SESSION['articles'][$article_id] = array('amount' => 1);
}
?>


Voorbeeld uit jou code: (en hoe je dit kunt verbeteren)

PHP:
1
2
3
4
5
6
<?php
if (!isset($_SESSION['ingelogd'])
    || $_SESSION['ingelogd'] !== true){
    print '';
    } 
?>


Hier controleer je een gebruiker ingelogd, vervolgens print je met print ''; niets?? I.p.v van dit kun je de gebruiker doorsturen naar bijvoorbeeld login pagina.

PHP:
1
2
3
4
5
6
7
8
9
<?php
// Op deze manier zit niet alles in een if statment (beter leesbaar)
if(! isset($_SESSION['ingelogd']) || ($_SESSION['ingelogd'] !== true)) {
   echo("Niet ingelogd"); //Eventueel doorsturen naar login pagina. 
   exit;
}

//Hier begin je de rest van het script. 
?>


O je script is gevoelig voor MySQL injecties.

Misschien is het verstandig om een boek te lezen over programmeren (in PHP), want de code rammelt aan alle kanten.

When I get sad i stop being sad and be awesome instead


Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
Paar puntjes van kritiek na een snelle blik op je site
- het feit dat je moet ingelogd zijn om iets in het winkelmandje te stoppen ervaar ik als een drempel
- ik krijg geen feedback bij de registratie pagina ( als test heb ik velden leeg gelaten/foutief ingevuld ) + mijn invoer wordt niet onthouden indien er iets niet klopte

Ik zou zo werken dat ik een tabel bezoeker heb en één bvb klant; in de tabel winkelmand_producten slaan we alles van het winkelmandje op maar stel nu dat er iemand geregistreerd heeft dan maken we een tussentabel aan en koppelen we bezoeker aan de klanten tabel. Aangezien we een bezoeker herkennen aan de cookie, kunnen we later de cookie dus de bezoeker koppelen aan de klant

Misschien handig om mysql_real_escape_string() en sprintf() te gebruiken tegen mogelijke mysql injecties, ik zie dat je niet controleert op je input, maar je "controleert" die nu als het ware door middel van je iteratie. Maar aangezien dit een snippet is ga ik ervan uit dat de rest van je code ook niet voorzien is van mysql_real_escape_string()

[ Voor 19% gewijzigd door Precision op 03-06-2009 20:05 ]

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?


Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
Daarom ben ik dit project gestart en heb ik hier een PHP boek naast mij :+

Misschien ook voor de anderen, ik werk slechts 3 maanden met PHP en dit is zelfgeschreven rotzooi wat net aan functioneert. Daarom ben ik druk bezig om jullie tips te verwerken en probeer ik zelf opnieuw te verbeteren.

Daarbij merk ik inderdaad dat zoveel code crappy is dat de website zelf ook crappy is, maar voor een MySQL injection ben ik niet bang want hij wordt niet commercieel, alleen getest door anderen ;)

EDIT: op reactie hierboven, dus het is handiger om gewoon de winkelwagen te kunnen vullen terwijl je niet ingelogd bent en dan gewoon het session_id forwarden naar de login?

[ Voor 14% gewijzigd door JefSnare op 03-06-2009 20:03 ]

Twitter Flickr


Acties:
  • 0 Henk 'm!

Verwijderd

JefSnare schreef op woensdag 03 juni 2009 @ 20:01:
maar voor een MySQL injection ben ik niet bang want hij wordt niet commercieel
Dat is toch wel zo'n onzinnig argument. Je hebt er maar gewoon voor te zorgen dat SQL injection niet mogelijk is. Het is niet alsof het moeilijk is om te voorkomen dat iemand je query's verkloot.

Acties:
  • 0 Henk 'm!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
Verwijderd schreef op woensdag 03 juni 2009 @ 20:04:
[...]

Dat is toch wel zo'n onzinnig argument. Je hebt er maar gewoon voor te zorgen dat SQL injection niet mogelijk is. Het is niet alsof het moeilijk is om te voorkomen dat iemand je query's verkloot.
Ehm, ja als je niet precies weet hoe je moet gaan aanpakken...Maar graag wil ik het secure maken alleen op dit moment (ontwikkelfase) vergeet ik nog wel eens wat stappen, en dat is te zien aan de code

[ Voor 3% gewijzigd door JefSnare op 03-06-2009 20:07 ]

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
JefSnare schreef op woensdag 03 juni 2009 @ 20:06:
[...]


Ehm, ja als je niet precies weet hoe je moet gaan aanpakken..
PRG FAQ: Over het gebruik van Parametrized Queries (en ja, dat kan in PHP/MySQL ook, maar dat Google je maar even ;) )

[ Voor 10% gewijzigd door RobIII op 03-06-2009 20:13 ]

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!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
Genoeg info over de besproken onderwerpen te vinden, wordt maar eens tijd dat ik goed ga lezen en leren ;)

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
RobIII schreef op woensdag 03 juni 2009 @ 20:11:
[...]

PRG FAQ: Over het gebruik van Parametrized Queries (en ja, dat kan in PHP/MySQL ook, maar dat Google je maar even ;) )
In php kun je daar sprintf() voor gebruiken weliswaar niet vergeten om daar ook mysql_real_escape_string() bij te gooien, want php is zo vriendelijk om dit standaard niet te beveiligen.
of dit:
http://us2.php.net/manual/en/pdo.prepared-statements.php

[ Voor 6% gewijzigd door Precision op 03-06-2009 20:33 ]

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?


Acties:
  • 0 Henk 'm!

  • dB90
  • Registratie: Oktober 2004
  • Laatst online: 03-09 17:28
Offtopic:
Verwijderd schreef op woensdag 03 juni 2009 @ 20:04:
[...]

Dat is toch wel zo'n onzinnig argument. Je hebt er maar gewoon voor te zorgen dat SQL injection niet mogelijk is. Het is niet alsof het moeilijk is om te voorkomen dat iemand je query's verkloot.
Valide punt, maar dat toontje waarop weer :X Probeer je punt anders even op een positieve manier over te brengen, misschien motiveert/stimuleert dat meer om door te zetten en te leren. Het is niet alsof de TS lui is ofzo.. 8)7

Succes TS 8)

Webberry Webdevelopment


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
flanderssoft schreef op woensdag 03 juni 2009 @ 20:32:
[...]

In php kun je daar sprintf() voor gebruiken weliswaar niet vergeten om daar ook mysql_real_escape_string() bij te gooien, want php is zo vriendelijk om dit standaard niet te beveiligen.
Euh; een parameterized query / prepared statement kun je écht niet vergelijken met een sprintf(). De "sprintf() oplossing" is hooguit een tikje 'handiger' dan zelf je queries bouwen maar ik denk dat je geen benul hebt wat een parameterized query precies inhoudt ;)

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!

  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
RobIII schreef op donderdag 04 juni 2009 @ 01:06:
[...]

Euh; een parameterized query / prepared statement kun je écht niet vergelijken met een sprintf(). De "sprintf() oplossing" is hooguit een tikje 'handiger' dan zelf je queries bouwen maar ik denk dat je geen benul hebt wat een parameterized query precies inhoudt ;)
is druk aan het lezen... :/

Bedankt voor alle reacties ik ga lekker verder bouwen met de tips hier gegeven ;)

[ Voor 4% gewijzigd door JefSnare op 04-06-2009 08:38 ]

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
RobIII schreef op donderdag 04 juni 2009 @ 01:06:
[...]

Euh; een parameterized query / prepared statement kun je écht niet vergelijken met een sprintf(). De "sprintf() oplossing" is hooguit een tikje 'handiger' dan zelf je queries bouwen maar ik denk dat je geen benul hebt wat een parameterized query precies inhoudt ;)
Vandaar men link naar pdo waar je parameterized queries hebt :+
Toevallig dat je die niet mee quote 8)7
Waarom toch altijd die arrogantie...

De vraag was trouwens hoe je een query beveiligd, mss slecht geqoute van mij ja, maar mysql_real_escape_string() en sprintf() dekken volgens mij die lading

[ Voor 13% gewijzigd door Precision op 04-06-2009 10:09 ]

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?

Pagina: 1