[PHP] Webshop problemen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • wouterg00
  • Registratie: November 2015
  • Laatst online: 01-10 13:33
Mijn vraag:
Ik ben een webshop aan het maken, alleen de loginpagina werkt niet :(
Meestal programmeer ik in Java/javascript, en van PHP heb ik niet heel veel verstand...

De website heeft een modulaire opbouw. In de basis, index.php start ik de session. In het midden komt een basis-stuk met de content.
code:
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
<?php 
        session_start();
        include('connect.php'); 
        ?>
<div class="navbartop">
                <?php include('navbar.html'); ?>
            </div>
<div class="content">
                <?php
                        if(isset($_GET['pagina'])){
                            $keuze = $_GET['pagina'];
                        } 
                        else {
                            Include("home.html");
                        }
                        if($keuze==1){
                        include("home.html");
                        }
                        if($keuze==2)       {
                        include("producten.html");
                        }
                        if($keuze==3){
                        include("account.html");
                        }
                        if($keuze==4){
                        include("contact.html");
                        }
                        if($keuze==5){
                        include('about.html');
                        }
                        if($keuze==6){
                        include('accountpagina.html');
                        }
               ?>
            </div>
//de rest


Als iemand wilt inloggen, vult diegene zijn pass en gebruikersnaam in en dan wordt de volgende code gestart:

code:
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
<?php
session_start();
$usernamecheck = 'admin'; 
$passwordcheck = 'admin';

//als formulier verzonden
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    if(isset($_POST['usernameinput'], $_POST['passwordinput'])){
        
        $username = ($_POST['usernameinput']);
        $password = ($_POST['passwordinput']);
        
        if($usernamecheck == $username && $passwordcheck == $password){
            $_SESSION['logged_in'] = true;
            $_SESSION['user'] = $username;
            
            header('refresh:2; url=accountpagina.php');
            echo 'Je bent ingelogd.';
        
        } else {
            header('refresh:2; url=account.html');
            echo 'Verkeerd wachtwoord of gebruikersnaam';
        }
    } else {
            header('refresh:2; url=account.html');
            echo 'Vul alle velden in';
        }
    }
    else {
        header('url=account.html');
        exit();
    }

En daarna:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php 
session_start();

// login check
if(!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] == false) 
{ 
    header('Location: account.html'); 
    exit(); 
    
} else {

echo 'Welkom terug, '.$_SESSION['user'].'!'; 
header('Refresh: 3; url=index.php?pagina=6');

}
?>


Mijn probleem is dat het me niet lukt om de variabelen $usernamecheck en $passwordcheck in de vorm van een array te krijgen met daarin alle passwords en usernames die tot nu toe geregistreerd staan (Ja,
ik weet dat dit een behoorlijk slechte methode is maar op deze manier is het simpel, snap ik de code en de webshop hoeft niet perse goed beveiligd te zijn


De webshop is verbonden met een MySQL database met daarin een tabel klanten: [klant_id, username, password, naam]. Ik heb al op internet rondgekeken maar op één of andere manier lukt het me niet om de code goed te implementeren.


Mijn tweede probleem is dat als iemand inlogt, ik wil dat hij ingelogd blijft. Dus daarom staat er bij de inlogpagina:
code:
1
2
3
4
5
6
7
8
9
10
11
<?php

if(!isset($_SESSION['logged_in']) == true) 
{ 
    header('url=index.php?pagina=6'); 
    exit(); 
}

 else { ?>
<h1>Inloggen</h1>
//formuliertje

Maar als ik inlog, klik op home, en dan weer op de inlogpagina krijg ik NIET mijn accountpagina te zien. Terwijl ik wél session_start heb in index.php, login.php, én accountpagina.php
Hoe kan dit? Heeft iemand hier alsjeblieft een oplossing voor?


Relevante software en hardware die ik gebruik: Ik gebruik Usbwebserver voor het hosten (met Apache en MySQL)

Wat ik al gevonden of geprobeerd heb: Een halfuur lang naar mijn beeldscherm staren (werkte niet).

Ik heb ook op de sub-pagina voor het inloggen een session starten, maar dat werkte ook niet. Verder heb ik gezocht op internet naar oplossingen om de database in een array te zetten, maar ik heb weinig php-kennis en snap niet hoe dat werkt.


Alvast bedankt voor jullie antwoord!



Overigens probeer ik ook een admin-gedeelte aan te maken in de site om producten aan te passen en toe te voegen, heeft iemand tips hiervoor?

[ Voor 6% gewijzigd door wouterg00 op 28-04-2017 23:44 ]

Beste antwoord (via wouterg00 op 29-04-2017 11:50)


  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Als hij plat gaat met die melding, zit het vermoedelijk niet in connect.php. Daar komt hij namelijk gewoon langs.

Probeer de truc die ik eerder noemde eens, maar dan in plaats van $variable gebruik je 'mysql_error()'.
Die functie kotst de laatste fout uit die MySQL tegen gekomen is.

Zie ook: http://php.net/manual/en/function.mysql-error.php

Ik denk dat je vergeten bent om achter de tabelnaam een lijstje kolomnamen op te geven tussen haakjes. Ik gok dan ook dat mysql_error een melding uitpoept over een syntax fout in je statement.
Oh, en de variabelen worden volgens mij ook niet mee genomen zoals je het nu doet. Dat zou dan iets als dit moeten zijn:
"blahblah ( ' ".$variable." ' ) blahblah;"
In PHP moet je de string beeindigen en dan concatenation doen met je variabele, volgende string, volgende variabele, etc. (in m'n voorbeeld wel even de extra spaties verwijderen trouwens, die staan er om duidelijk verschil te zien tussen single en double quote tekens.)
Tenzij je gebruik maakt van Stored Procedures, maar jij gebruikt die niet.
En ja, dat is vies gevaarlijk. Iets met SQL injectie enzo. Dat zou je dan weer kunnen opvangen met mysql_real_escape_string().

Oh, en je MySQL Close commando staat veel te vroeg! Die moet je pas aanroepen na de laatste query die je uitvoert.
Wat ik vroegah altijd deed was een header en footer file maken met de bovenkant en onderkant van de pagina. De header bevatte ook de DB connectie en de footer had de mysql_close.
Elke pagina begon met include header en eindigde met include footer, zodat je er zeker van was dat je DB verbinding altijd netjes geopend en gesloten wordt bij het aanroepen van een pagina.
Dan kan je naar hartelust queries uitvoeren en aan het einde weet je dat de verbinding netjes gesloten wordt :)

Wat ik ook nog wel eens deed, was diverse PHP settings goed zetten voor debugging.
Een productie ingerichte PHP zal fouten meestal niet naar scherm geven, maar deze onderdrukken.
Een rijtje Ini_set() opdrachten zoals "ini_set('error_reporting', E_ALL);" voegde ik dan toe, maar dan wel conditioneel met een "if file_exists('./debug.lock')" en dan het hele rijtje met ini_set() opdrachten. De pagina ging dan in debug mode als ik een bestand genaamd 'debug.lock' bij de website neer had gezet.
Dat betekende dan dat alle errors en warnings naar scherm worden gelogd ipv onderdrukt en in een systeem logfile worden geparkeerd.

[ Voor 102% gewijzigd door McKaamos op 29-04-2017 11:34 ]

Iemand een Tina2 in de aanbieding?

Alle reacties


Acties:
  • +3 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
wouterg00 schreef op vrijdag 28 april 2017 @ 22:57:
[...] Ja,
ik weet dat dit een behoorlijk slechte methode is maar op deze manier is het simpel, snap ik de code en de webshop hoeft niet perse goed beveiligd te zijn
[...]
Geef ff je URL, dan kan die op de blacklist. |:(
wouterg00 schreef op vrijdag 28 april 2017 @ 23:03:
[...]

Het is een soort van test, hij gaat (nog) niet live ;)
Zeg dat dan :o
ik bedoelde dat het geen professionele website hoeft te worden o.i.d.
Oh, dat vind ik dan weer geen goed argument om niet aan beveiliging te doen. :/

[ Voor 75% gewijzigd door Room42 op 28-04-2017 23:07 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • wouterg00
  • Registratie: November 2015
  • Laatst online: 01-10 13:33
Room42 schreef op vrijdag 28 april 2017 @ 23:02:
[...]

Geef ff je URL, dan kan die op de blacklist. |:(
Het is een soort van test, hij gaat (nog) niet live ;)

ik bedoelde dat je me niet hoeft af te kraken dat de website niet zo goed beveiligd is als een professionele website o.i.d. :+

[ Voor 40% gewijzigd door wouterg00 op 28-04-2017 23:10 ]


Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Wat zo mooi is aan PHP, is dat je gewoon at random ergens tussen de code door de inhoud van variabelen kan laten uitkotsen ;)
b.v. door dit te doen
PHP:
1
2
3
<?php
echo nl2br(print_r($variabele))
?>


Waar variabele dan b.v. een input waarde is, of b.v. het resultaat van een database query.
Als je dat op strategische plekken toepast, kan je dus precies uitprutsen waar het fout gaat.

Iemand een Tina2 in de aanbieding?


Acties:
  • +2 Henk 'm!

  • Slimbo
  • Registratie: April 2016
  • Laatst online: 00:12
Wellicht is het een idee om eens te spieken bij een opensource webshop pakket, zoals opencart? Dit werkt ook met PHP en de ervaringen die ik er mee heb, zijn vrij aardig.

Acties:
  • +2 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Slimbo schreef op vrijdag 28 april 2017 @ 23:13:
Wellicht is het een idee om eens te spieken bij een opensource webshop pakket, zoals opencart? Dit werkt ook met PHP en de ervaringen die ik er mee heb, zijn vrij aardig.
Ik denk niet dat een goed pakket gebouwd op een stevig OOP framework te vergelijken is met procedurele zelfmaak-meuk :+ er iets van leren zit er dan ook niet in...

Voor zelf even wat leren is er niks mis met wat bouwen, maar stel dat iets in productie gebruikt moet worden (hoewel het zelfs acceptance of testing niet zal doorstaan) kan je maar beter een bestaand en bewezen systeem gebruiken, hoeft niks te kosten, en aanpassen kan nog steeds. Er is eigenlijk geen reden om het zelf proberen te bouwen. Als het echt om het leren gaat, dan is zelfbouwen natuurlijk niet fout, maar dat betekent nog niet dat je het resultaat daarna ook daadwerkelijk moet gaan gebruiken.

Acties:
  • +2 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 02-10 08:45
wat @johnkeates zegt ja. Als je nog moet leren hoe je een SQL-query uitvoert ben je nog wel een héél eind verwijderd van een complete webshop bouwen.

Anyway ik zou eens beginnen gewoon een tabel met wat dummy-data te maken met PhpMyAdmin of een ander databasemanagementprogramma. En een query te maken om die data op te halen. Het beste kun je hiervoor PDO gebruiken.
Als je te grote stappen probeert te maken loop je vast in "naar je scherm staren".

Als je een stapje verder bent mag je nog googlen op sql-injectie, password-hasing etc, maar one step at a time.

Acties:
  • 0 Henk 'm!

  • wouterg00
  • Registratie: November 2015
  • Laatst online: 01-10 13:33
McKaamos schreef op vrijdag 28 april 2017 @ 23:06:

PHP:
1
2
3
<?php
echo nl2br(print_r($variabele))
?>
Het eerste probleem is opgelost :)

@mcDavid@johnkeates Het is primair bedoelt om van te leren, en zodra het goed genoeg is (heeft geen haast) gaat het live.

[ Voor 23% gewijzigd door wouterg00 op 28-04-2017 23:43 ]


Acties:
  • +3 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
wouterg00 schreef op vrijdag 28 april 2017 @ 23:42:
[...]
en zodra het goed genoeg is (heeft geen haast) gaat het live.
Ik denk dat je het punt een beetje mist. "Goed genoeg" zal het nooit worden. Niet om dat het onmogelijk is, maar om dat je waarschijnlijk niet 3 jaar lang non-stop aan dit spul zal gaan werken, maar dat wel het equivalent aan benodigde tijd is om iets op het niveau van bestaande open source e-commerce software te maken. En ja, dat niveau heb je nodig. Daarnaast vergeet je volgens mij ook dat er nog onderhoud nodig zal zijn, veranderingen van buiten af (stel dat andere betalingssystemen, andere devices, andere protocollen enz. ondersteund moeten worden) altijd blijven komen, en je nu ook een single point of failure aan het creëren bent (namelijk jijzelf).

Dus, ga vooral door met leren, maar plan vooral niet om je code live te gaan draaien, da's vragen om problemen die in verhoudig veel groter zullen zijn.

Acties:
  • 0 Henk 'm!

  • wouterg00
  • Registratie: November 2015
  • Laatst online: 01-10 13:33
Oke thanks, dan ga ik toch voor een externe webshop. Ik had gehoopt zo toch een paar honderd euro te besparen, maar dan gebruik ik dit om te oefenen. Inmiddels zijn de problemen al gefikst met dank aan het internet.

Acties:
  • +2 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
wouterg00 schreef op zaterdag 29 april 2017 @ 01:23:
Oke thanks, dan ga ik toch voor een externe webshop. Ik had gehoopt zo toch een paar honderd euro te besparen, maar dan gebruik ik dit om te oefenen. Inmiddels zijn de problemen al gefikst met dank aan het internet.
Zelf wat maken kost meer dan een gratis webshop downloaden en gebruiken... Neem bijvoorbeeld wooCommerce. Of Magento.

Acties:
  • 0 Henk 'm!

  • wouterg00
  • Registratie: November 2015
  • Laatst online: 01-10 13:33
Weet iemand wat ik hier fout doe?
Hij geeft de melding "Er is een fout opgetreden" maar ik heb geen idee wat er mis is.

code:
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
include('connect.php');

if (isset($_POST['username']) && isset($_POST['pass1']) && isset($_POST['pass2']))
{

$registerid =mysql_query("SELECT COUNT(klant_id) FROM klanten");
mysql_close();
$adres=stripslashes(trim($_POST['adres']));
$postcode=stripslashes(trim($_POST['postcode']));
$woonplaats=stripslashes(trim($_POST['woonplaats']));
$voornaam=stripslashes(trim($_POST['voornaam']));
$achternaam=stripslashes(trim($_POST['achternaam']));
$inlognaam=stripslashes(trim($_POST['username']));
$password1=stripslashes(trim($_POST['pass1']));
$password2=stripslashes(trim($_POST['pass2']));

    if ($password1==$password2)
    {
        $add_user=mysql_query("INSERT INTO klanten VALUES('$registerid', '$voornaam', '$achternaam', '$adres', '$postcode', '$woonplaats', '$inlognaam','$password1')");
            if ($add_user)
            {
                echo("Je bent geregistreerd!");
                header("url=logincheck.php");
                mysql_close();
            }
            else {
                echo("Er is een fout opgetreden");
                header("refresh:2");
            }
    }   
    else {
        echo("Je wachtwoorden kloppen niet");
        header("refresh:2");
    }
} 
else {
//formuliertje


code:
1
2
3
4
5
6
7
8
9
connect.php:


$connectie = 
mysql_connect($server,$gebruiker,$wachtwoord)
    or die ("Kan niet verbinden met de server");
    
$database = mysql_select_db($db,$connectie)
    or die ("Kan de database niet selecteren");


"you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id #5, 'f', 'f', 'fd', 'f', 'f', 'f','f')' at line 11"

[ Voor 14% gewijzigd door wouterg00 op 29-04-2017 11:37 ]


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Als hij plat gaat met die melding, zit het vermoedelijk niet in connect.php. Daar komt hij namelijk gewoon langs.

Probeer de truc die ik eerder noemde eens, maar dan in plaats van $variable gebruik je 'mysql_error()'.
Die functie kotst de laatste fout uit die MySQL tegen gekomen is.

Zie ook: http://php.net/manual/en/function.mysql-error.php

Ik denk dat je vergeten bent om achter de tabelnaam een lijstje kolomnamen op te geven tussen haakjes. Ik gok dan ook dat mysql_error een melding uitpoept over een syntax fout in je statement.
Oh, en de variabelen worden volgens mij ook niet mee genomen zoals je het nu doet. Dat zou dan iets als dit moeten zijn:
"blahblah ( ' ".$variable." ' ) blahblah;"
In PHP moet je de string beeindigen en dan concatenation doen met je variabele, volgende string, volgende variabele, etc. (in m'n voorbeeld wel even de extra spaties verwijderen trouwens, die staan er om duidelijk verschil te zien tussen single en double quote tekens.)
Tenzij je gebruik maakt van Stored Procedures, maar jij gebruikt die niet.
En ja, dat is vies gevaarlijk. Iets met SQL injectie enzo. Dat zou je dan weer kunnen opvangen met mysql_real_escape_string().

Oh, en je MySQL Close commando staat veel te vroeg! Die moet je pas aanroepen na de laatste query die je uitvoert.
Wat ik vroegah altijd deed was een header en footer file maken met de bovenkant en onderkant van de pagina. De header bevatte ook de DB connectie en de footer had de mysql_close.
Elke pagina begon met include header en eindigde met include footer, zodat je er zeker van was dat je DB verbinding altijd netjes geopend en gesloten wordt bij het aanroepen van een pagina.
Dan kan je naar hartelust queries uitvoeren en aan het einde weet je dat de verbinding netjes gesloten wordt :)

Wat ik ook nog wel eens deed, was diverse PHP settings goed zetten voor debugging.
Een productie ingerichte PHP zal fouten meestal niet naar scherm geven, maar deze onderdrukken.
Een rijtje Ini_set() opdrachten zoals "ini_set('error_reporting', E_ALL);" voegde ik dan toe, maar dan wel conditioneel met een "if file_exists('./debug.lock')" en dan het hele rijtje met ini_set() opdrachten. De pagina ging dan in debug mode als ik een bestand genaamd 'debug.lock' bij de website neer had gezet.
Dat betekende dan dat alle errors en warnings naar scherm worden gelogd ipv onderdrukt en in een systeem logfile worden geparkeerd.

[ Voor 102% gewijzigd door McKaamos op 29-04-2017 11:34 ]

Iemand een Tina2 in de aanbieding?


Acties:
  • +1 Henk 'm!

  • Rensjuh
  • Registratie: Juli 2007
  • Laatst online: 07:18
Maak van je kolom "klant_id" en primary key met auto_increment.
Dan word je ID verhoogd bij iedere insert en hoef je dit niet handmatig te doen.

En kijken of het formulier verstuurd word kan makkelijker:
code:
1
if($_SERVER['REQUEST_METHOD'] == "POST")

Controleert of de aanroepmethode POST is, wat meestal gebruikt word voor inlog/registratie formulieren.

[ Voor 43% gewijzigd door Rensjuh op 29-04-2017 18:14 ]

PV Output


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
McKaamos schreef op zaterdag 29 april 2017 @ 11:02:
Oh, en je MySQL Close commando staat veel te vroeg! Die moet je pas aanroepen na de laatste query die je uitvoert.
Gewoon helemaal niet aanroepen, PHP sluit die verbinding gewoon zelf voor je.

Het is leuk om te leren maar het lijkt erop alsof je nu tutorials aan t volgen bent van ruim 10 jaar geleden vol met enorme lekken. Als je dit een keer live gaat zetten is t een kwestie van wachten tot je database met gegevens op straat ligt of iemand die misbruikt maakt op een andere manier van je site. Een beetje geld willen besparen is natuurlijk prima maar laat t niet ten koste gaan van de veiligheid van je bezoekers/klanten aub.

Acties:
  • +2 Henk 'm!

  • nowayback
  • Registratie: November 2013
  • Laatst online: 13:36
Een paar tips om het geheel veiliger te maken.

Don't trust user input! Alles wat een gebruiker invoert (ook al is diegene moderator/admin) moet je grondig checken en 'schoonmaken'. In de code die je nu gepost hebt, is het mogelijk om SQL Injections uit te voeren.

Daarnaast is de MySQL extensions in PHP deprecated, maak in plaats daarvan gebruik van de PDO extension. Dit werkt op een iets andere manier dan je nu gewent bent. Het is niet meer procedial maar meer object georiënteerd. Op deze link zie je de verschillen tussen beide.

Nog beter zou je gebruik kunnen maken van bestaande packages (bijvoorbeeld Illuminate/Database) Dit zijn libraries, gemaakt door anderen, die veel bestaande uitdagingen makkelijker voor je maken of zelfs voor je oplossen. Om deze packages te gebruiken in een project, maak je gebruik van Composer.

Daarnaast is het nog handiger, als je misschien iets verder bent in het leren van PHP, om aan de slag te gaan met een framework. Mijn persoonlijke keuze zou vallen op Laravel, omdat Laracasts een enorme bron is van goede tutorials die allemaal ingaan op Laravel.

Succes!

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 18:27

Damic

Tijd voor Jasmijn thee

Trouwens origineel volgde je de tips van php niet: http://php.net/manual/en/function.session-start.php je gaf geen SID mee en/of je zette geen cookie.

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • wouterg00
  • Registratie: November 2015
  • Laatst online: 01-10 13:33
Oké mensen ik begrijp het punt. deze webshop gaat niet live en ik gebruik hem alleen om te oefenen. Voor mijn webshop die wel live gaat gebruik ik wel Magenta o.i.d.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Keep in mind; in php7 is de mysql extensie er niet meer. Wel de mysqli/pdo extensie, die naast betere performance ook beter beveiligd. Makkelijkste is om het wiel niet opnieuw uit te gaan vinden. ;)

[ Voor 19% gewijzigd door CH4OS op 30-04-2017 13:31 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
CH40S schreef op zondag 30 april 2017 @ 13:30:
die naast betere performance ook beter beveiligd.
Mits je het gebruikt zoals het bedoeld is ;)

Acties:
  • 0 Henk 'm!

  • wouterg00
  • Registratie: November 2015
  • Laatst online: 01-10 13:33
Topic kick, iemand een idee wat er mis is met deze code? Als ik op submite klik gebeurt er gewoon niets. Ik vermoed iets met de $datum, maar ik kan maar niet vinden wat er fout is. Er wordt niets gepost in MySQL en mysql_error geeft geen waarde terug.

code:
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php session_start();

if (!empty($_POST["submit"])) //bestelling bevestigd
{ //nieuw ordernummer bepalen
    include("connect.php");
    $query1="SELECT MAX(bestelling_id) FROM bestelling;";
    $result = mysql_query($query1);
    list($ONR)= mysql_fetch_row($result);
    $ONR = $ONR + 1;
    
//variabelen ophalen
    date_default_timezone_set('CET');
    $datum=date("Y-m-d",time());
    $klant_id = $_SESSION['klant_id'];
    $bestelling=$_SESSION["bestel"];
    $ap=count($bestelling);
    
//registreren van bestelling in tabel bestelling    
    
    for ($t=1; $t<=$ap; $t=$t+1){
        $Bestelling_id=$ONR;
        $artnr=$bestelling[$t][1];
        $aantal=$bestelling[$t][2];
        $prijs=$bestelling[$t][4];
        $query3="insert into bestelling values($Bestelling_id, $artnr, $klant_id, $aantal, $prijs, $datum)";
        $result=mysql_query($query3);
        if ((mysql_error()!="")){
            $antw=mysql_error();
            echo "$antw";}}
    print("Uw bestelling is vastgelegd op $datum!");
        
}
else //logincheck
{
    if (isset($_SESSION['inlognaam']) && isset($_SESSION['wachtwoord']))
    {
        $bestelling=$_SESSION["bestel"];
        $ap=count($bestelling);
        for ($t=1; $t<=$ap; $t=$t+1){
        $artnr=$bestelling[$t][1];
        $aantal=$bestelling[$t][2];
        $prijs=$bestelling[$t][4];
        $omschr=$bestelling[$t][3];
        }
?>
<HTML>
<HEAD><TITLE>Bevestig aankoop</TITLE></HEAD>
<BODY>
<div class="aankoop">
<h1>Bevestig aankoop</H1>

<?php 
$TOTAAL = 0;
echo "<table><tr bgcolor=\"lightgrey\"><td>Omschrijving</td><td>Prijs</td><td>Aantal</td></tr>";
for ($T=1; $T<=$ap ; $T=$T+1)
    {
    $TOTAAL = $TOTAAL + ($bestelling[$T][2] * $bestelling[$T][4]);
    echo "<tr><td>".$bestelling[$T][3]."</td><td>".$bestelling[$T][4]."</td><td><input name=\"AANTAL[$T]\" value=\"".$bestelling[$T][2]."\" size=5</td></table>";
    }
?>
<br>
Email: <input name='email'><br>
<input type="submit" name="submit" value="Bevestig uw aankoop">
</form>
<?php
}
else { //terugsturen
    header("refresh:2; url=logincheck.php");
}}   
?>
</div>
</body>
</html>

[ Voor 15% gewijzigd door wouterg00 op 03-06-2017 13:32 ]


Acties:
  • +1 Henk 'm!

Verwijderd

Met submit verstuur je een formulier - moet je alleen wel een formulier hebben. Ik zie alleen een </form>, geen <form method='post'>

Acties:
  • 0 Henk 'm!

  • wouterg00
  • Registratie: November 2015
  • Laatst online: 01-10 13:33
Verwijderd schreef op zaterdag 3 juni 2017 @ 13:16:
Met submit verstuur je een formulier - moet je alleen wel een formulier hebben. Ik zie alleen een </form>, geen <form method='post'>
Thanks! Helemaal over het hoofd gezien

Acties:
  • +2 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Als je uiteindelijk serieus er over nadenkt om een eigen webshop te gaan ontwikkelen, stap dan over op het gebruik van een framework. Die geeft al een heleboel tools, waardoor je zelf niet alles opnieuw hoeft uit te vinden. Laravel is bijvoorbeeld een erg makkelijk framework.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Als je de basis mist lijkt t me in z'n geheel geen goed idee om een webshop te bouwen die in productie gaat draaien.

Acties:
  • +3 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 02-10 08:45
wouterg00 schreef op zaterdag 3 juni 2017 @ 13:34:
[...]

Thanks! Helemaal over het hoofd gezien
Als je een goeie IDE gebruikt (bijv. PHPStorm) en je code netjes indent, kun je zoiets haast onmogelijk "over het hoofd zien". Gebruik daarnaast ook de development tools van je browser om te zien of en zoja watvoor request er verstuurd wordt.

En last but not least: Hou toch alsjeblíéft op met php-variablen rechtsteeks in je query te plakken. Mijn nekharen gaan recht overeind staan hiervan. PDO is echt niet heel moeilijk of zo. Eerder makkelijker. Er is echt geen excuus om het niet te gebruiken.

Acties:
  • +1 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07-10 14:25

Creepy

Tactical Espionage Splatterer

En denk eens na wat er gebeurd met $ONR als twee mensen precies tegelijk wat bestellen (ja, dat gaat je gebeuren).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • +1 Henk 'm!

  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 20:32
Creepy schreef op zaterdag 3 juni 2017 @ 14:49:
En denk eens na wat er gebeurd met $ONR als twee mensen precies tegelijk wat bestellen (ja, dat gaat je gebeuren).
yep, zoals hierboven gezegd laat je id's door de database genereren met een auto increment en gebruik je die in je code.

Verder is het geen schande om dingen voluit te schrijven, dus geen $t, $ap, $ONR of $antw gebruiken.

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


Acties:
  • 0 Henk 'm!

  • wouterg00
  • Registratie: November 2015
  • Laatst online: 01-10 13:33
Thanks voor de input. Om helemaal duidelijk te zijn:

Mijn webshop gaat gebruikmaken van een extern framework waarvoor ik ga betalen (squarespace/Wordpress). Dit topic is puur om te oefenen met code. Ik ben nog een beginner en heb nog veel te leren, maar ik wil begrijpen hoe een webshop werkt en hoe ik eigen websites maak, omdat ik denk dat dat nuttig is in de toekomst. Maar mijn huidige webshop is via een extern bedrijf.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

mcDavid schreef op zaterdag 3 juni 2017 @ 14:41:
Als je een goeie IDE gebruikt (bijv. PHPStorm) en je code netjes indent, kun je zoiets haast onmogelijk "over het hoofd zien". Gebruik daarnaast ook de development tools van je browser om te zien of en zoja watvoor request er verstuurd wordt.

En last but not least: Hou toch alsjeblíéft op met php-variablen rechtsteeks in je query te plakken. Mijn nekharen gaan recht overeind staan hiervan. PDO is echt niet heel moeilijk of zo. Eerder makkelijker. Er is echt geen excuus om het niet te gebruiken.
PHPStorm is echter geen gratis variant meer van; ze hebben enkel nog een editie met een montly subscription, helaas. Zend PDT, die ik op het werk gebruik, is wel gratis. :) Maar goed, dat is geen discussie voor dit topic. ;)

[ Voor 3% gewijzigd door CH4OS op 03-06-2017 15:14 ]


Acties:
  • 0 Henk 'm!

  • wouterg00
  • Registratie: November 2015
  • Laatst online: 01-10 13:33
Om de één of andere manier werkt deze code niet.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (!empty($_POST['discountcode'])) {
   $discountcode = $_POST['discountcode'];
   $percentage = mysql_query("SELECT percentage FROM kortingscodes WHERE $discountcode = code_id");
   $maxuses = mysql_query("SELECT maxuses FROM kortingscodes WHERE $discountcode = code_id");
   $currentuses = mysql_query("SELECT currentuses FROM kortingscodes WHERE $discountcode = code_id");
   if ($maxuses > $currentuses){
       echo("test1");
            if ($percentage != null) {
                echo("test2");
                $TOTAAL = $TOTAAL * (1.00-($percentage/100));
                $_SESSION['totaalbedrag'] = $TOTAAL;
                mysql_query("UPDATE kortingscodes SET currentuses = currentuses+1 WHERE $discountcode = code_id");
                }
   }
   else {
       echo("Deze kortingscode is verlopen of onjuist");
       header("refresh:5; url=winkelwagen.php");
       }
}

Hij geeft geen enkele melding van test1 of test2, alleen van "deze kortingscode is verlopen of onjuist"

Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 05-10 19:42
echo var_dump ($maxuses);

Dan kom je je probleem wel tegen :)

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07-10 14:25

Creepy

Tactical Espionage Splatterer

Debuggen moet je inderdaad in eerste zelf doen. Je begint het forum hier nu als helpdesk te gebruiken en dat is niet de bedoeling.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

En kijk eens naar het begrip SQL-injection - als ik deze kortingscode invul is je shop leeg:
code:
1
1=1; TRUNCATE shop; #

Acties:
  • +1 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
wouterg00 schreef op maandag 5 juni 2017 @ 15:42:
Om de één of andere manier werkt deze code niet.
code:
1
   $percentage = mysql_query("SELECT percentage FROM kortingscodes WHERE $discountcode =
Dat komt omdat je mysql_* niet meer mag gebruiken. Stop daar dus mee.

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Los van het SQL-injection verhaal ben je nu 3 keer dezelfde query aan het doen waar je bij allemaal niet goed weet wat er als resultaat komt uit mysql_query (die je dus tevens niet mag gebruiken). Een projectje om te leren is prima maar als je de goedbedoelde adviezen hier blijft negeren ga je jezelf dingen compleet verkeerd aanleren.

Acties:
  • +2 Henk 'm!

  • Compizfox
  • Registratie: Januari 2009
  • Laatst online: 19:07

Compizfox

Bait for wenchmarks

Geen directe oplossing voor je probleem, maar ik krijg uit de voorbeeldcode die je post heel sterk het idee dat je verkeerde en verouderde practices aan het leren bent. Er is niets mis met oefenen, maar op deze manier ben je jezelf foute dingen aan het aanleren, en daar heb je niks aan (integendeel...).

Bijvoorbeeld: het gebruik van ext/mysql. Stop daar direct mee. Deze extensie is al jaren deprecated en bestaat niet meer sinds PHP7.

Vanaf waar leer je PHP? Kan het zijn dat je dit doet met een verouderde tutorial? Er zwerven helaas heel veel slechte/oude tutorials voor PHP rond op het internet.

Om mezelf niet te herhalen, link ik even deze post van mij uit een ander topic die je verder kan helpen met het leren van goede, gestructureerde PHP, en ook gaat over het wel/niet gebruiken van een framework bij het leren van PHP.


CH40S schreef op zaterdag 3 juni 2017 @ 15:14:
[...]
PHPStorm is echter geen gratis variant meer van; ze hebben enkel nog een editie met een montly subscription, helaas. Zend PDT, die ik op het werk gebruik, is wel gratis. :) Maar goed, dat is geen discussie voor dit topic. ;)
Tip: als je student bent kom je wel in aanmerking voor gratis IDEs van JetBrains.

[ Voor 59% gewijzigd door Compizfox op 05-06-2017 18:00 ]

Gewoon een heel grote verzameling snoertjes


Acties:
  • +1 Henk 'm!

  • Tjolk
  • Registratie: Juni 2007
  • Laatst online: 16:43
En anders gebruik je gewoon NetBeans. FOSS en werkt op Linux, Mac en Windows. Misschien niet op het niveau van PHPStorm, maar voorziet denk ik in 99,9% van de behoeften van TS. Zelfs behoeften waarvan hij nog niet wist dat hij ze had. ;)

Verder kan ik je inderdaad alleen maar aanraden om andere tutorials te gaan volgen, en gebruik te maken van een framework. Ga eens stoeien met bijvoorbeeld CodeIgniter, die hebben een leuke tutorial waarmee je vlot op scheut bent. Niet te fancypancy op te hoog niveau, maar er wordt al wel veel uit handen genomen. Met name dingen die je hier fout doet...

CodeIgniter is natuurlijk maar een voorbeeld, er zijn legio andere (goede) frameworks. De één met een wat steilere leercurve dan de ander. Zoek er iig één die nog actief in ontwikkeling is.

Face it: hoe goed je ook bent, je gaat niet het niveau halen van deze frameworks of van een open source webshop. Zou mij ook niet lukken en ik heb toch al aardig wat ervaring inmiddels. En juist bij webshops moet je niveau gewoon hoog zijn, want je hoeft maar op 1 plaats een klein lekje of foutje te hebben en je bent klauwen met geld kwijt door oftewel oplichting oftewel datalekken met schadevergoedingen c.q. boetes.

Tjolk is lekker. overal en altijd.


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Ger schreef op woensdag 7 juni 2017 @ 16:02:
je hoeft maar op 1 plaats een klein lekje of foutje te hebben en je bent klauwen met geld kwijt door oftewel oplichting oftewel datalekken met schadevergoedingen c.q. boetes.
En daarvoor hebben we Thuiswinkel Waarborg, Webshop Keurmerk en Qshops Keurmerk.
Die gooien gewoon ergens in het weekend je webshop plat door Qualys een security scan te laten uitvoeren of jouw webshop een beetje bestand is tegen alle beginners fouten.

Zelfs bij de beste webshops is niet elk onderdeel in het Qualys rapport "groen" en zelfs dan zitten er nog beveiligingsfouten in die Qualys niet kan vinden :)

[ Voor 5% gewijzigd door DJMaze op 07-06-2017 17:06 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Ramon schreef op zaterdag 3 juni 2017 @ 14:59:
yep, zoals hierboven gezegd laat je id's door de database genereren met een auto increment en gebruik je die in je code.
MySQL heeft die functionaliteit, maar niet elke RDBMS heeft die. En wie zegt dat er in een RDBMS wordt opgeslagen? Als dat bijvoorbeeld in Redis is, heb je key => value, that's it. ;)

[ Voor 7% gewijzigd door CH4OS op 07-06-2017 19:30 ]


Acties:
  • 0 Henk 'm!

  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 20:32
CH40S schreef op woensdag 7 juni 2017 @ 18:52:
[...]
MySQL heeft die functionaliteit, maar niet elke RDBMS heeft die. En wie zegt dat er in een RDBMS wordt opgeslagen? Als dat bijvoorbeeld in Redis is, heb je key => value, that's it. ;)
Volgens mij gebruikt redis geen SQL :+

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Ramon schreef op woensdag 7 juni 2017 @ 19:53:
Volgens mij gebruikt redis geen SQL :+
Lees mijn bericht even nog een keer, er is een reden dat ik die volgorde gebruik. ;) Ik beweer dus nergens dat Redis SQL zou zijn. :) Daarnaast hoeft auto increment niet per se in een RDBMS te zitten. ;) Aan de andere kant kan je ook discussiëren of dat een verantwoordelijkheid van de database moet zijn (ervan uitgaande dat de functie aanwezig is). Binnen een applicatie is het niet de verantwoordelijkheid van een database om het model valide te houden, dat is toch echt die van het model zelf, al dan niet binnen het domain (bij domain driven design).

[ Voor 127% gewijzigd door CH4OS op 07-06-2017 20:59 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07-10 14:25

Creepy

Tactical Espionage Splatterer

Zo'n beetje elk respecterend RDMBS heeft een optie om een uniek ID te genereren (autoincrement, identity, sequence etc). Om dat nu ineens te gaan veranderen omdat je ineens een totaal ander systeem noemt lijkt me niet echt relevant. Tuurlijk kunnen we allemaal UUID genereren om er zo zeker van te zijn dat we in de applicatie al een uniek ID hebben, maar als dat niet nodig is en je gebruikt een redelijk standaard oplossing om door de DB een ID te laten genereren, dan lijkt me dat nu niet gelijk een reden om maar iets anders te gaan adviseren.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Compizfox
  • Registratie: Januari 2009
  • Laatst online: 19:07

Compizfox

Bait for wenchmarks

CH40S schreef op woensdag 7 juni 2017 @ 18:52:
[...]
MySQL heeft die functionaliteit, maar niet elke RDBMS heeft die. En wie zegt dat er in een RDBMS wordt opgeslagen? Als dat bijvoorbeeld in Redis is, heb je key => value, that's it. ;)
TS gebruikt ext/mysql dus welke RDBMS hij gebruikt laat zich niet al te lastig raden ;)

Gewoon een heel grote verzameling snoertjes

Pagina: 1