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!


<?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>
Waar komt $con vandaan?
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:
<?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.
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.

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.
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 <?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).
[/edit]
Ok dank Michael.
>> 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.
ik zou van regel 73
<?php $result=mysqli_query($con,$sql); ?>

maken
<?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!)
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 ;-).

Reageren