Producten in database zetten met formulier wil niet lukken.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jos Duis

Jos Duis

19/01/2018 11:41:49
Quote Anchor link
Ben bezig met een webshopje als eerste project. Het weergeven van producten uit de database is geen probleem,
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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 &nbsp; &nbsp; &nbsp; <a href='inventory_edit.php?pid=$id'>Bewerken<a/> &bull; <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>&darr; Voeg een nieuw product toe &darr;</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>
 
PHP hulp

PHP hulp

01/11/2024 03:20:07
 
- SanThe -

- SanThe -

19/01/2018 11:59:37
Quote Anchor link
Waar komt $con vandaan?
 
Thomas van den Heuvel

Thomas van den Heuvel

19/01/2018 13:18:04
Quote Anchor link
Voor een administratief systeem zoals een webshop kan een echte relationele database handig zijn. In dat opzicht lijkt het mij handiger om InnoDB te gebruiken. Je hebt dan ook de beschikking over database-transacties (al kan dat misschien inmiddels ook met MyISAM). Houd in ieder geval consequent één engine aan zou ik zeggen.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
// 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.
 
Jos Duis

Jos Duis

19/01/2018 16:15:50
Quote Anchor link
Bedankt voor jullie antwoorden, San the, Con is de variable van een mysqli_connect verbinding in de login.php en die werkt als ik het test met bv een echo verbinding geslaagt als connectie is gelukt.

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.
 
- Ariën  -
Beheerder

- Ariën -

19/01/2018 16:50:38
Quote Anchor link
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.
 
Jos Duis

Jos Duis

19/01/2018 16:58:44
Quote Anchor link
Ok zal die website eens checken thnx Arien.
 
Michael -

Michael -

19/01/2018 17:18:55
Quote Anchor link
We hadden laatst ook al een topic waarin een script van W3Schools genoemd werd die om te janken was, maar hier slaan ze weer kei hard naast de plank.
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php $_SERVER['SCRIPT_NAME']; ?>


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).
Gewijzigd op 19/01/2018 17:21:48 door Michael -
 
Jos Duis

Jos Duis

19/01/2018 17:59:57
Quote Anchor link
Ok dank Michael.
 
Ben van Velzen

Ben van Velzen

19/01/2018 19:43:55
Quote Anchor link
>> We hadden laatst ook al een topic waarin een script van W3Schools genoemd werd die om te janken was,
Yup, en diezelfde idiote test_input functie zien we ook hier weer. Die functie test niets, het sloopt alleen maar je input.
 
Ivo P

Ivo P

22/01/2018 13:27:20
Quote Anchor link
ik zou van regel 73
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php $result=mysqli_query($con,$sql); ?>


maken
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if(!$result=mysqli_query($con,$sql)) {
   echo 'mysql error met '. $sql . '<br>';
   echo mysqli_error($con);
}

?>


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!)
 
- Ariën  -
Beheerder

- Ariën -

22/01/2018 13:38:25
Quote Anchor link
Ikzelf gebruik MySQLi, en ik heb een speciale extended class gebouwd waarin ik query() overerf, en daarbij meteen foutafhandeling toevoeg. In productie toon ik een algemene melding dat er "bij ons een technisch probleem is", met een toevoeging van de error in de log. En in development-mode laat ik netjes de error zien.

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 -
 
Jos Duis

Jos Duis

22/01/2018 13:58:27
Quote Anchor link
Oke bedankt, ik ga de hele code overzien met jullie tips.
 
Ivo P

Ivo P

22/01/2018 15:17:18
Quote Anchor link
regel 54: daar staat $_POST waar mi. $_FILES logischer is.
En ik zou even checken of het ook echt een plaatje (jpg) is.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.