insert met mysqli lukt niet.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nick VanRossem

Nick VanRossem

25/11/2015 22:45:15
Quote Anchor link
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?

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
<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>
Gewijzigd op 25/11/2015 22:47:09 door Nick VanRossem
 
PHP hulp

PHP hulp

21/09/2021 20:29:36
 
- Ariën -
Beheerder

- Ariën -

25/11/2015 22:49:24
Quote Anchor link
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.
 
Nick VanRossem

Nick VanRossem

25/11/2015 23:05:11
Quote Anchor link
Hoi - Ariën -,

bedankt voor je reactie,
Ik krijg helemaal geen melding van een fout. Als ik op "toevoegen" klik, wordt het form leeg gemaakt en wordt er niets aan de database toegevoegd.

hier staat het script > http://nickvzk61.sixtyone.axc.nl/testlab/category_add.php
 
Ivo P

Ivo P

26/11/2015 02:09:45
Quote Anchor link
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?
 
Thomas van den Heuvel

Thomas van den Heuvel

26/11/2015 02:13:54
Quote Anchor link
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).
 
L deB

L deB

26/11/2015 10:39:10
Quote Anchor link
Ik lees vooral mee om bij te leren.

Heb de code uitgeprobeerd en hier werkt hij wel..

http://static.afbeeldinguploaden.nl/1511/128080/LU2ugt9w.png

Krijg wel de volgende foutmelding:

http://static.afbeeldinguploaden.nl/1511/128081/ZOED4QYD.png

Maar gezien het bij mij werkt zou ik denken dat je de database niet precies zo hebt ingericht/genoemd als hier (dus 'naam' in plaats van 'Naam' of wat dan ook)
Gewijzigd op 27/11/2015 23:22:17 door - Ariën -
 
Nick VanRossem

Nick VanRossem

26/11/2015 20:52:22
Quote Anchor link
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.

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
<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?
Gewijzigd op 27/11/2015 23:07:02 door Nick VanRossem
 
- Ariën -
Beheerder

- Ariën -

26/11/2015 21:43:48
Quote Anchor link
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.
 
Nick VanRossem

Nick VanRossem

27/11/2015 23:08:35
Quote Anchor link
bedankt - Ariën -, net even aangepast :-)
 
Thomas van den Heuvel

Thomas van den Heuvel

27/11/2015 23:45:51
Quote Anchor link
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).
 
Nick VanRossem

Nick VanRossem

28/11/2015 00:24:05
Quote Anchor link
dus moet ik

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
accept-charset="UTF-8"
toevoeg? of is dit dan overbodig?
 
Thomas van den Heuvel

Thomas van den Heuvel

28/11/2015 13:04:01
Quote Anchor link
Ik zou waar ruimte voor interpretatie mogelijk is deze ruimte zoveel mogelijk inperken door alles zo expliciet mogelijk in te stellen. Voorschrijven wat iets zou moeten zijn lijkt mij beter dan uitgaan van een default (die mogelijk niet klopt).

Mogelijk is het overbodig, maar er kan op deze manier geen enkel misverstand bestaan over wat de bedoeling 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.