Producten in database zetten met formulier wil niet lukken.
maar ik wil een admin gedeelte toevoegen waar je producten kan invoeren. Ik kan geen fouten vinden, php_errors is ook leeg er staat ook niks over in de logs folder. Ter verduidelijking ook wel belangrijk ik gebruik Wamp om mijn scripts te testen. Hieronder mijn code. Hij voert alles netjes uit en zet een afbeelding in de juiste map die hij de naam 0 geeft omdat er nog geen producten in de database staan. Heb net een product ingevoegd via phpmyadmin en die word netjes weergegeven door dezelfde code. Wat doe ik fout of kan het iets te maken hebben met de storage engine van phpmyadmin die MYISAM draait en de tabellen op INNODB dit heb ik ook veranderd en op MYISAM gezet maar werkt ook niet. Dus concreet mijn vraag waarom verschijnen er geen producten in de database. Alvast bedankt voor jullie hulp!
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php // Session
session_start();
if (!isset($_SESSION["manager"])){
header("location: admin_login.php");
exit();
}
include ("login.php");
?>
<?php
// Clean data and verify input
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
if (!empty($_POST["voegToe"])) {
// Parse the form data and add inventory items to the system
// define variables and set to empty values
$product_naam=$prijs=$details=$fileField="";
$product_naamErr=$detailsErr=$prijsErr=$fileFieldErr="";
if (empty($_POST["product_naam"])) {
$product_naamErr = "Productnaam verplicht!";
} else {
$product_naam = test_input($_POST["product_naam"]);
if (!preg_match("/^[a-zA-Z]*$/",$product_naam)) {
$product_naamErr = "Alleen letters en spaties toegestaan";
}
}
if (empty($_POST["details"])) {
$detailsErr = "Beschrijving verplicht!";
} else {
$details = test_input($_POST["details"]);
if (!preg_match("/^[a-zA-Z]*$/",$details)) {
$detailsErr = "Alleen letters en spaties toegestaan";
}
}
if (empty($_POST["prijs"])) {
$prijsErr = "Prijs verplicht!";
} else {
$prijs = test_input($_POST["prijs"]);
if (!filter_var($prijs, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)) {
$prijsErr = "Alleen cijfers toegestaan en ., toegestaan";
}
}
if (empty($_POST["fileField"])) {
$fileFieldErr = "Afbeelding toevoegen verplicht!";
} else {
$fileField = test_input($_POST["fileField"]);
if (!preg_match("/^[a-zA-Z0-9]*$/",$details)) {
$fileFieldErr = "Alleen letters en cijfers toegestaan";
}
}
// See if that product exists
$sql = "SELECT id FROM producten WHERE product_naam='$product_naam' LIMIT 1";
$result = mysqli_query($con,$sql);
$productMatch = mysqli_num_rows($result);
if ($productMatch > 0){
echo "U probeerd een duplicaat 'Product Naam' toe te voegen, <a href='inventory_list.php'>klik hier</a>";
exit();
}
// Add product to database
$sql = "INSERT INTO producten (product_naam,details,prijs,date_added) VALUES ('$product_naam','$details','$prijs',now())" or die (mysql_error());
$result=mysqli_query($con,$sql);
$pid = mysqli_insert_id($con);
$newname = "$pid.jpg";
move_uploaded_file($_FILES['fileField']['tmp_name'],"../images/$newname");
header("location: inventory_list.php");
exit();
}
?>
<?php // This block grabs the whole list for viewing
$product_list="";
$sql = "SELECT * FROM producten";
$result = mysqli_query($con,$sql);
$productCount = mysqli_num_rows($result);
if ($productCount>0){
while($row=mysqli_fetch_array($result)){
$id=$row["id"];
$product_naam=$row["product_naam"];
$date_added = strftime("%b %d %Y", strtotime($row["date_added"]));
$product_list.="$date_added-$id-$product_naam <a href='inventory_edit.php?pid=$id'>Bewerken<a/> • <a href='#'>Verwijderen</a><br/>";
}
}else{
$product_list="Er zijn geen producten in de winkel!!";
}
?>
<!DOCTYPE HTML>
<html>
<head>
<title>Voorraadlijst</title>
<link rel="stylesheet" href="../css/main.css" type="text/css" media="screen">
</head>
<body>
<div id="mainWrapper" class="col-m-12 col-12"></div>
<?php include_once("../template_header.html");?>
<div id="pageContent">
<div align="right"><a href="inventory_list.php#inventoryForm">+ Voeg nieuw product toe</a></div>
<div align="left">
<h2>Voorraadlijst</h2>
<?php echo $product_list;?>
</div>
<a name="inventoryForm" id="inventoryForm"></a>
<h3>↓ Voeg een nieuw product toe ↓</h3>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"enctype="multipart/form-data" name="newprodForm" id="newprodForm" method="post">
<table class="col-m-11 col-11" border="0" cellspacing="0" cellpadding="6">
<tr>
<td class="col-m-2 col-2">Productnaam</td>
<td class="col-m-6 col-6"><label><input name="product_naam" type="text" id="product_naam" size="64"/></label></td></tr>
<tr><td class="col-m-2 col-2">Beschrijving</td><td class="col-m-6 col-6"><label><textarea name="details" type="textarea" id="details" cols="49" rows="5"/></textarea></label></td></tr>
<tr><td class="col-m-2 col-2">Prijs</td><td class="col-m-6 col-6"><label><input name="prijs" type="text" id="prijs"/></label></td></tr>
<tr><td class="col-m-2 col-2">Afbeelding</td><td class="col-m-6 col-6"><label><input type="file" name="fileField" id="fileField"/></label></td></tr>
<td><label><input type="submit" name="voegToe" id="voegToe" value="Product toevoegen"/></label></td></tr>
</table></form><br/><br/>
</div>
<?php include_once("../template_footer.html");?>
</div>
</body>
</html>
session_start();
if (!isset($_SESSION["manager"])){
header("location: admin_login.php");
exit();
}
include ("login.php");
?>
<?php
// Clean data and verify input
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
if (!empty($_POST["voegToe"])) {
// Parse the form data and add inventory items to the system
// define variables and set to empty values
$product_naam=$prijs=$details=$fileField="";
$product_naamErr=$detailsErr=$prijsErr=$fileFieldErr="";
if (empty($_POST["product_naam"])) {
$product_naamErr = "Productnaam verplicht!";
} else {
$product_naam = test_input($_POST["product_naam"]);
if (!preg_match("/^[a-zA-Z]*$/",$product_naam)) {
$product_naamErr = "Alleen letters en spaties toegestaan";
}
}
if (empty($_POST["details"])) {
$detailsErr = "Beschrijving verplicht!";
} else {
$details = test_input($_POST["details"]);
if (!preg_match("/^[a-zA-Z]*$/",$details)) {
$detailsErr = "Alleen letters en spaties toegestaan";
}
}
if (empty($_POST["prijs"])) {
$prijsErr = "Prijs verplicht!";
} else {
$prijs = test_input($_POST["prijs"]);
if (!filter_var($prijs, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)) {
$prijsErr = "Alleen cijfers toegestaan en ., toegestaan";
}
}
if (empty($_POST["fileField"])) {
$fileFieldErr = "Afbeelding toevoegen verplicht!";
} else {
$fileField = test_input($_POST["fileField"]);
if (!preg_match("/^[a-zA-Z0-9]*$/",$details)) {
$fileFieldErr = "Alleen letters en cijfers toegestaan";
}
}
// See if that product exists
$sql = "SELECT id FROM producten WHERE product_naam='$product_naam' LIMIT 1";
$result = mysqli_query($con,$sql);
$productMatch = mysqli_num_rows($result);
if ($productMatch > 0){
echo "U probeerd een duplicaat 'Product Naam' toe te voegen, <a href='inventory_list.php'>klik hier</a>";
exit();
}
// Add product to database
$sql = "INSERT INTO producten (product_naam,details,prijs,date_added) VALUES ('$product_naam','$details','$prijs',now())" or die (mysql_error());
$result=mysqli_query($con,$sql);
$pid = mysqli_insert_id($con);
$newname = "$pid.jpg";
move_uploaded_file($_FILES['fileField']['tmp_name'],"../images/$newname");
header("location: inventory_list.php");
exit();
}
?>
<?php // This block grabs the whole list for viewing
$product_list="";
$sql = "SELECT * FROM producten";
$result = mysqli_query($con,$sql);
$productCount = mysqli_num_rows($result);
if ($productCount>0){
while($row=mysqli_fetch_array($result)){
$id=$row["id"];
$product_naam=$row["product_naam"];
$date_added = strftime("%b %d %Y", strtotime($row["date_added"]));
$product_list.="$date_added-$id-$product_naam <a href='inventory_edit.php?pid=$id'>Bewerken<a/> • <a href='#'>Verwijderen</a><br/>";
}
}else{
$product_list="Er zijn geen producten in de winkel!!";
}
?>
<!DOCTYPE HTML>
<html>
<head>
<title>Voorraadlijst</title>
<link rel="stylesheet" href="../css/main.css" type="text/css" media="screen">
</head>
<body>
<div id="mainWrapper" class="col-m-12 col-12"></div>
<?php include_once("../template_header.html");?>
<div id="pageContent">
<div align="right"><a href="inventory_list.php#inventoryForm">+ Voeg nieuw product toe</a></div>
<div align="left">
<h2>Voorraadlijst</h2>
<?php echo $product_list;?>
</div>
<a name="inventoryForm" id="inventoryForm"></a>
<h3>↓ Voeg een nieuw product toe ↓</h3>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"enctype="multipart/form-data" name="newprodForm" id="newprodForm" method="post">
<table class="col-m-11 col-11" border="0" cellspacing="0" cellpadding="6">
<tr>
<td class="col-m-2 col-2">Productnaam</td>
<td class="col-m-6 col-6"><label><input name="product_naam" type="text" id="product_naam" size="64"/></label></td></tr>
<tr><td class="col-m-2 col-2">Beschrijving</td><td class="col-m-6 col-6"><label><textarea name="details" type="textarea" id="details" cols="49" rows="5"/></textarea></label></td></tr>
<tr><td class="col-m-2 col-2">Prijs</td><td class="col-m-6 col-6"><label><input name="prijs" type="text" id="prijs"/></label></td></tr>
<tr><td class="col-m-2 col-2">Afbeelding</td><td class="col-m-6 col-6"><label><input type="file" name="fileField" id="fileField"/></label></td></tr>
<td><label><input type="submit" name="voegToe" id="voegToe" value="Product toevoegen"/></label></td></tr>
</table></form><br/><br/>
</div>
<?php include_once("../template_footer.html");?>
</div>
</body>
</html>
Waar komt $con vandaan?
Bij het ontwikkelen van code is het handig als deze mondig is m.b.t. het melden van fouten. Zet daartoe de volgende code bovenaan je script:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
// for development
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');
?>
// for development
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');
?>
En als je code in een verwerkstap wilt debuggen loont het misschien ook de moeite om de header()s tijdelijk te verwijderen zodat je ook kunt zien wat er fout gaat voordat je direct wordt doorgestuurd.
Tot slot kunnen je errorlogs uitkomst bieden bij het opsporen van fouten, maar het is gewoon veel handiger als deze met bovenstaande snippet ook direct worden uitgespuugd op het scherm.
Enne, die functie test_input() (was die van w3schools?) is inmiddels een soort van terugkerend fenomeen. Deze functie slaat echt de plank mis in die zin dat deze allerlei bewerkingen uitvoert die niet direct nodig zijn voor het geschikt maken voor toevoeging aan de database. Daarnaast kan deze functie ongewenste manipulaties doen op ingevoerde data. Eigenlijk zou data niet veranderd mogen worden (of deze geaccepteerd wordt in die vorm is een apart onderwerp), maar deze functie breekt dus met die regel.
En precies dat dus: die functie helpt allerminst om data op een veilige en juiste manier in te voegen in de database. Zelfs met gebruikmaking van deze functie kan men met bepaalde invoer nog steeds een query om zeep helpen.
Ik weet ook niet of "een webshop als eerste project" voor eenieder is weggelegd.
Thomas van den Heuvel, Het klopt dat stukje heb ik van w3schools wat raad jij me aan dan om te gebruiken want de gegevens moeten toch gecontroleerd worden en sql injectie en dergelijke voorkomen? Maar ik zal het eens proberen door het eruit te halen.
Altijd moeilijk beginnen dan leer je het meest is mijn motto.
Thomas van den Heuvel op 19/01/2018 13:18:04:
Enne, die functie test_input() (was die van w3schools?) is inmiddels een soort van terugkerend fenomeen.
Helemaal correct, Thomas. Helaas komt deze inderdaad bij W3schools vandaan...
https://www.w3schools.com/php/php_form_validation.asp
Ik steun de website http://www.w3fools.com/ dan ook ten zeerste. Maar ik geef wel toe dat W3schools niet altijd de plank misslaat.
Ok zal die website eens checken thnx Arien.
Ze gebruiken PHP_SELF en vervolgens zeggen ze "The $_SERVER["PHP_SELF"] variable can be used by hackers!" en vervolgens gaan ze daar een oplossing voor verzinnen.
Volgens mij wordt het al jaren aangeraden PHP_SELF niet te gebruiken als het niet nodig is (en dat is het ook niet).
Als je dan perse je script naam variabel wil houden, gebruik dan
Edit:
Het kopieren van variabelen is totaal onnodig en maakt het i.m.o. niet overzichtelijker aangezien je niet meer ziet wat voor type het is (Bijv $_POST of $_GET).
Het kopieren van variabelen is totaal onnodig en maakt het i.m.o. niet overzichtelijker aangezien je niet meer ziet wat voor type het is (Bijv $_POST of $_GET).
Gewijzigd op 19/01/2018 17:21:48 door Michael -
Ok dank Michael.
Yup, en diezelfde idiote test_input functie zien we ook hier weer. Die functie test niets, het sloopt alleen maar je input.
maken
Code (php)
Mocht het dan liggen aan je insert-query, dan kan mysql jou zeggen wat er mis is.
(NB: deze regels niet laten staanin je productie omgeving!)
Ik weet niet of het overerven en query() herschrijven maar den met een Exception bij een fout, wel de beste oplossing is. Maar als iemand een betere oplossing heeft, mag die dat zeggen ;-).
Gewijzigd op 22/01/2018 13:39:17 door - Ariën -
Oke bedankt, ik ga de hele code overzien met jullie tips.
En ik zou even checken of het ook echt een plaatje (jpg) is.