ik wou een simpel insert scriptje maken om een waarde toe te voegen aan een tabel in een database. maar de waarde wordt niet in mijn database geplaatst en ik vind niet wat er mis gaat. Wie kan mij helpen?


<html>
<head>
	<title>Categorie invoeren</title>
</head>
<body>
<?php
// errors weergeven
ini_set('display_errors',1); // 1 == aan , 0 == uit
error_reporting(E_ALL | E_STRICT);

// database connectie maken
// ""localhost","my_user","my_password","my_db"
$db = mysqli_connect("localhost", "user", "pasword", "nickvzk61_myshop");

// foutmelding weergeven bij mislukte database connectie
if (!$db) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

// de waarde van nieuwecategorie in de database zetten
if ($_POST["categorieknop"] && $_POST["nieuwecategorie"]) {
	
	
if(!mysqli_query($db, "INSERT INTO `nickvzk61_myshop`.`CATEGORIE` (`Categorie_id`, `Naam`) VALUES (NULL, '".$_POST["nieuwecategorie"]."')")){ // voer SQL code uit)
	echo "Helaas, de categorie ".$_POST["nieuwecategorie"]." kon niet worden toegevoegd aan de database!"; //wordt de query goed uitgevoerd?
} 
else {
	echo "De categorie <b>".$_POST["nieuwecategorie"]."</b> is toegevoegd.";
}
mysqli_close($db);
} else {
?>
<form method="post"	action="<?php echo $_SERVER['PHP_SELF'] ?>">
Welke categorie wilt u toevoegen?<br>
Categorie: <input type="text" name="nieuwecategorie"><br>
<input type="submit" name="categorieknop" value="toevoegen">
</form>
<?php
}
?>
</body>
</html>
Wat gaat er dan mis?
En wat meldt mysqli_error($db)?

- Let er ook op dat hoofdletters in tabelnamen niet echt handig zijn.
- Een databasenaam hoef je in jouw geval niet te gebruiken na je INTO.
- Verder is je script ook lek voor SQL-injection.
- En is het niet nodig om $_SERVER['PHP_SELF'] te echoen op lijn 36. Je kan de action ook leeg laten.
en als je de regel

if ($_POST["categorieknop"] && $_POST["nieuwecategorie"]) {

vervangt door

if($_SERVER['REQUEST_METHOD'] == 'POST') {

want de enige manier om weer in je form uit te komen, is zo te zien als niet zowel categorieknop als nieuwecategorie verzonden zijn en een waarde hebben.
En mogelijk is door gebruik van ENTER de knop niet meegestuurd?
Levert het if-statement van regel 14 wel true op dan? Waarschijnlijk niet? Dat is enige reden die ik kan bedenken, al zie ik niet direct hoe dit dan fout kan gaan. Debug dit eens zou ik zeggen, kijk wat precies wordt uitgevoerd na submitten.

Mogelijk is het ook beter om te controleren of een formulier verzonden is met behulp van $_SERVER['REQUEST_METHOD'].

Ook zou ik dit in een aparte actie zetten die verder geen output produceert zoals hier staat beschreven. Andere methoden leveren vaak spaghetti-code op (de mogelijk welbekende if-elseif-elseif-else hel).
Er was inderdaad een foutje in de database geslopen. de notice heb ik opgelost met isset(). de tabelnaam is nu ook aangepast naar kleine letters. Allen bedankt voor de hulp! Ik ga nu proberen verder uit te breiden tegen SQL injectie.


<html>
<head>
    <title>Categorie invoeren</title>
</head>
<body>
<?php
// errors weergeven
ini_set('display_errors',1); // 1 == aan , 0 == uit
error_reporting(E_ALL | E_STRICT);

// database connectie maken
// ""localhost","my_user","my_password","my_db"
$db = mysqli_connect("localhost", "user", "pasword", "nickvzk61_myshop");

// foutmelding weergeven bij mislukte database connectie
if (!$db) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

// de waarde van nieuwecategorie in de database zetten
if (isset($_POST["categorieknop"]) && $_POST["nieuwecategorie"]) {
    
    
if(!mysqli_query($db, "INSERT INTO `nickvzk61_myshop`.`categorie` (`Categorie_id`, `Naam`) VALUES (NULL, '".mysqli_real_escape_string($db, $_POST["nieuwecategorie"])."')")){ // voer SQL code uit)
    echo "Helaas, de categorie ".htmlspecialchars($_POST["nieuwecategorie"], ENT_QUOTES, "UTF-8")." kon niet worden toegevoegd aan de database!"; //wordt de query goed uitgevoerd?
} 
else {
    echo "De categorie <b>".htmlspecialchars($_POST["nieuwecategorie"], ENT_QUOTES, "UTF-8")."</b> is toegevoegd.";
}
mysqli_close($db);
} else {
?>
<form method="post"    action="">
Welke categorie wilt u toevoegen?<br>
Categorie: <input type="text" name="nieuwecategorie"><br>
<input type="submit" name="categorieknop" value="toevoegen">
</form>
<?php
}
?>
</body>
</html> 


/edit
Net even wat "beveiliging" proberen toe te voegen. Hoe lek is mijn script? en wat zou ik eventueel nog kunnen proberen/doen?
Ik zou die $_SERVER['PHP_SELF']; PHP-regel eruit halen op lijn 36.
Ten eerste kan de action net zo goed leeg zijn, als het om bestandsnaam gaat. En verder zit er ook een potentieel gevaar voor XXS achter.
bedankt - Ariën -, net even aangepast :-)
Je definieert niet op alle plaatsen een character encoding.

Niet in je HTML document via een PHP header() of HTML meta-tag.
Niet in het accept-charset attribuut van je formulier.
Niet bij het maken van een connectie met je database.
Maar (enkel) bij htmlspecialchars()?

Escaping functies (zoals _real_escape_string() en htmlspecialchars() etc.) werken alleen correct als alles omtrent character encoderingen goed staat ingesteld.

Als je nu teksten invoert die exotische karakters bevatten, en je later je connectie repareert (een _set_charset() aanroep toevoegt net na het maken van je connectie) dan zal blijken dat eerder ingevoerde data in je database corrupt is (niet van de voorgeschreven character encoding is).
dus moet ik


<meta http-equiv="content-type" content="text/html; charset=utf-8


toevoegen in de head sectie.

Is het dan correct dat ik in mijn form tag de code

accept-charset="•UTF-8"
toevoeg? of is dit dan overbodig?

Reageren