Bestelling afhandelen
Naam: Matthijs
Leeftijd: 16
School: VWO 5e klas
Programmeertalen: HTML, CSS, (PHP beetje) en aan het leren.
Tot zover over mij :p
Nu mijn vraag, ik ben bezig met een webwinkel, alleen moet ik nu zelf wat codes gaan schrijven om alles netjes af te handelen, etc. Maar ik ben nog niet zo lang bezig met PHP, ik ben zeg maar net uit de fase "scripts bewerken" gekomen en ben net beland in de zelf script bouw fase.
Maar natuurlijk zijn daar in het begin wat problemen mee, dus vandaar deze vraag.
Ik ben bezig met het bestellingsysteem, en ik heb dus eerst een scriptje geschreven om de database te updaten als er een bestelling is gedaan. Daarvoor gebruik ik het volgende script: (zoals ik al zei, eerste volledig zelf geschreven script, dus waarschijnlijk veel onhandige dingen, graag tips om te verbeteren :))
Quote:
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
45
46
47
48
49
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
<?php
session_start();
include "header.php";
if( $_SESSION['winkelwagen'] ) {
echo "<table border=2 cellpadding=0 cellspacing=0>";
echo "<tr><td><b>Aantal</b></td><td><b>Naam</b></td><td><b>Prijs in €</b></td></tr>"; // bovenste regel
$totaal = 0;
//Haalt klant ID op.
$info = $login->get_login_info('alles');
$klantid = $info['id'];
//Maakt een nieuwe Bestelling ID aan, en doet daarin de Klant ID
$sql = "INSERT INTO Bestelling (KLANT_ID) VALUES ($klantid)";
if (!mysql_query($sql)) { // voer SQL code uit
echo "Toevoegen bestelling mislukt!";
//haalt de zojuist ingevoerde bestelling id op om vervolgens te gebruiken voor de tabel order (zie omschrijving onder) Ik denk zelf dat het hier fout gaat.
$bestellingid = mysql_insert_id();
// Dus voor ieder product in het winkelmandje moet er een regel worden aangemaakt in Order
foreach ( $_SESSION['winkelwagen'] as $key=>$val ) {
$sql = "SELECT * FROM Artikel WHERE ARTIKEL_ID=$key";
$resultaat = mysql_query($sql);
while ($rij = mysql_fetch_array($resultaat)) {
echo "<tr>";
echo "<td>$val</td>";
echo "<td>".$rij["Naam"]."</td>";
echo "<td>".number_format($rij["Prijs"], 2, ',', ' ')."</td>";
echo "</tr>";
$totaal = $totaal + ($rij["Prijs"] * $val);
$prijs = $rij["Prijs"];
$datum = date("d-m-Y", time());
// hier worden de artikelen in de Tabel Orders gezet.
$sql = "INSERT INTO Orders (BESTELLING_ID, ARTIKEL_ID, Aantal, Prijs, Datum) VALUES ($bestellingid, $key, $val, $prijs, NOW())";
if (!mysql_query($sql)) { // voer SQL code uit
echo "Toevoegen bestelling deel 2 mislukt!";
}
}
}
}
}
include "footer.php";
?>
session_start();
include "header.php";
if( $_SESSION['winkelwagen'] ) {
echo "<table border=2 cellpadding=0 cellspacing=0>";
echo "<tr><td><b>Aantal</b></td><td><b>Naam</b></td><td><b>Prijs in €</b></td></tr>"; // bovenste regel
$totaal = 0;
//Haalt klant ID op.
$info = $login->get_login_info('alles');
$klantid = $info['id'];
//Maakt een nieuwe Bestelling ID aan, en doet daarin de Klant ID
$sql = "INSERT INTO Bestelling (KLANT_ID) VALUES ($klantid)";
if (!mysql_query($sql)) { // voer SQL code uit
echo "Toevoegen bestelling mislukt!";
//haalt de zojuist ingevoerde bestelling id op om vervolgens te gebruiken voor de tabel order (zie omschrijving onder) Ik denk zelf dat het hier fout gaat.
$bestellingid = mysql_insert_id();
// Dus voor ieder product in het winkelmandje moet er een regel worden aangemaakt in Order
foreach ( $_SESSION['winkelwagen'] as $key=>$val ) {
$sql = "SELECT * FROM Artikel WHERE ARTIKEL_ID=$key";
$resultaat = mysql_query($sql);
while ($rij = mysql_fetch_array($resultaat)) {
echo "<tr>";
echo "<td>$val</td>";
echo "<td>".$rij["Naam"]."</td>";
echo "<td>".number_format($rij["Prijs"], 2, ',', ' ')."</td>";
echo "</tr>";
$totaal = $totaal + ($rij["Prijs"] * $val);
$prijs = $rij["Prijs"];
$datum = date("d-m-Y", time());
// hier worden de artikelen in de Tabel Orders gezet.
$sql = "INSERT INTO Orders (BESTELLING_ID, ARTIKEL_ID, Aantal, Prijs, Datum) VALUES ($bestellingid, $key, $val, $prijs, NOW())";
if (!mysql_query($sql)) { // voer SQL code uit
echo "Toevoegen bestelling deel 2 mislukt!";
}
}
}
}
}
include "footer.php";
?>
De bedoeling van dit script is dat de artikelen uit het winkelwagentje allemaal in de database komen. In de tabel Bestelling (namen hadden beter gekund :p) komt de Bestelling ID en de Klant ID, dit is dus de "koppel" tabel. In de tabel Klant staan alle gegevens van de klant, maar dat is verder hier niet van belang.
In de tabel Order moeten de producten die in een bepaalde bestelling zitten bij elkaar komen, dus voor ieder product moet een aparte Order ID, maar de Bestelling ID moet bij ieder product van één bestelling hetzelfde blijven.
Bij hoe het script nu is wordt er voor ieder product in de winkelmandje een aparte Bestelling ID aangemaakt. Dus er klopt iets niet.
Als jullie ook andere fouten zien in het script, graag ook melden want daar leer ik natuurlijk ook van.
Als jullie nog andere scripts of extra informatie nodig hebben, vraag het dan.
Alvast bedankt,
Matthijs
Gewijzigd op 29/11/2010 20:56:03 door Matthijs PHPHULP
Op het eerste zicht, lijkt de accolade op lijn 16 wat vreemd.
Die block code, wordt die enkel uitgevoerd als de insert mislukt is?
Verder vind ik het er proper uit zien. Goed bezig, lijkt me.
Let nog een beetje op indentering (het aantal spaties aan het begin van de lijn).
Zorg dat de sluitende accolade op de plaats komt die overeen komt met de lijn waar de accolade geopend is. Binnen de accolades laat je de code twee spaties meer naar rechts starten
bv.
Meer lees je hier:
http://drupal.org/coding-standards
Er zijn andere coding standards, maar hier hou ik me toch liefst aan.
tabel orders key=id, foreignkey=klant_id
tabel orderregels key=id en foreignkey=order_id
tabel klanten key=id
tabel producten key=id
tabel product_prijs key=id en foreignkey=product_id, belangrijk attribuut: datum_tot
Gewijzigd op 30/11/2010 13:06:04 door John D
En @John, maar wat is er dan mis met de database? (behalve de namen Orders en Bestelling?)
En verder is dit script makkelijk te omzeilen of te "hacken" of op welke andere manier dan ook dit te verstoren? Injection ofzo? En zo ja wat kan ik daar tegen doen?
Heel erg bedankt voor de rest, nu ga ik werken aan het script om dit mooi weer te geven, dus waarschijnlijk heb ik daar vanavond ook nog wel wat vragen over :p
Matthijs
Gewijzigd op 30/11/2010 17:45:41 door Matthijs PHPHULP
Matthijs Thoolen op 30/11/2010 17:44:46:
... En verder is dit script makkelijk te omzeilen of te "hacken" of op welke andere manier dan ook dit te verstoren? Injection ofzo? ...
Lijkt me niet. Ik zie toch niet direct iets gevaarlijks.
Over het algemeen is injection een probleem van data die van de gebruiker komt en in een sql string terecht komt.
Hier zie ik niets van $_GET of $_POST variabelen, laat staan dat ze in een sql string zijn verwerkt.
Matthijs Thoolen op 30/11/2010 17:44:46:
(...)
En @John, maar wat is er dan mis met de database? (behalve de namen Orders en Bestelling?)
(...)
En @John, maar wat is er dan mis met de database? (behalve de namen Orders en Bestelling?)
(...)
Ik heb het even snel doorgekeken, volgens mij kan er redunantie ontstaan. Ik zag ergens dat je alleen een klantid insert, dat kan per definitie niet goed zijn, want wat zegt dat? Niks. Die zou bij bestellingen in kunnen.
Zie ook normaliseren.
Kris Peeters op 30/11/2010 17:51:19:
Lijkt me niet. Ik zie toch niet direct iets gevaarlijks.
Over het algemeen is injection een probleem van data die van de gebruiker komt en in een sql string terecht komt.
Hier zie ik niets van $_GET of $_POST variabelen, laat staan dat ze in een sql string zijn verwerkt.
Matthijs Thoolen op 30/11/2010 17:44:46:
... En verder is dit script makkelijk te omzeilen of te "hacken" of op welke andere manier dan ook dit te verstoren? Injection ofzo? ...
Lijkt me niet. Ik zie toch niet direct iets gevaarlijks.
Over het algemeen is injection een probleem van data die van de gebruiker komt en in een sql string terecht komt.
Hier zie ik niets van $_GET of $_POST variabelen, laat staan dat ze in een sql string zijn verwerkt.
Je kunt je afvragen of die $_SESSION data veilig is.
Dat kunnen wij nu niet controleren.
En over die $_SESSION, hoe kan ik zorgen dat die wel veilig is dan? Of hoe moet ik het controleren, laten controleren?
Bedankt
In principe is $_SESSION niet gevaarlijk (zoals $_GET / $_POST / $_COOKIE), maar je moet je afvragen waar die data vandaan komt die in de session zit. Als die bij de gebruiker vandaan komt, dan is die gevaarlijk.
Maar sowieso is dat niet eens erg belangrijk, alle data die je in de database zou je door mysql_real_escape_string moeten halen, niet alleen voor hacks, maar ook gewoon om te zorgen dat er geen verkeerde data in de db komt.
Functies als htmlentities gooi je over je data als je het uit de db trekt.
Dat hoor je heden anno 2010 toch wel zo ongeveer met CSS te regelen ...
Wat betreft je HTML ...Gewijzigd op 30/11/2010 19:50:07 door Piet Verhagen
Piet Verhagen op 30/11/2010 19:49:39:
Mee eens, maar ben eerst bezig met code, en wou even snel een makkelijke opmaak. Als ik het script ga afronden ga ik het met CSS doen, hele site draait met CSS :)
Maar toch bedankt, voor het zelfde geld deed ik de hele site zo :)
Is fout, check de tips van John, je kan beter werken met een tabel orders en een tabel orderregels. Dit is zo ongeveer les 1 in datamodellering. Uiteraard mag het ook heten: tabel bestellingen en tabel bestelregels. Overigens heb ik altijd geleerd om tabelnamen niet in meervoud te maken: tabel order, orderregel, bestelling, bestelregel. Vaak onstaat er dan discussie van tegenstanders die dan gaan beweren dat er meer orders in de tabel order kunnen en daarom de tabel orders moet heten maar dat is nou precies de foute opvatting.
Oké bedankt dan zou ik daar nog is naar gaan kijken.