insert in mysql database lukt niet
ik probeer in een database gegevens in te voeren met php. Wat ik ook probeer, er komen geen gegevens in de database terecht.
Handmatig heb ik gegevens ingevoerd via phpMyAdmin.
Deze gegevens kan ik met php uitlezen. Met dezelfde connectie gegevens lukt het niet om insert aan de praat te krijgen. De database heeft 3 velden:
id (A/I), voornaam en achternaam
Dit is het programma
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$con =mysqli_connect($host,$user,$password,$dbname);
if(!con)
{echo 'niet verbonden met de server';}
if (!mysqli_select_db($con,stichtin15_project))
{echo 'geendatabase geselecteerd';}
$voornaam='Peter';
$achternaam='Janssen';
$sql= "INSERT INTO adressen (voornaam,achternaam)
VALUES ($voornaam','$achternaam')";
if (!msqli_query($con,$sql))
{echo 'niet ingevoerd';}
else
{echo 'ingevoerd';}
De echo "niet ingevoerd" of de echo "ingevoerd" komt niet in beeld
Geen idee wat ik fout doe.
$con =mysqli_connect($host,$user,$password,$dbname);
if(!con)
{echo 'niet verbonden met de server';}
if (!mysqli_select_db($con,stichtin15_project))
{echo 'geendatabase geselecteerd';}
$voornaam='Peter';
$achternaam='Janssen';
$sql= "INSERT INTO adressen (voornaam,achternaam)
VALUES ($voornaam','$achternaam')";
if (!msqli_query($con,$sql))
{echo 'niet ingevoerd';}
else
{echo 'ingevoerd';}
De echo "niet ingevoerd" of de echo "ingevoerd" komt niet in beeld
Geen idee wat ik fout doe.
Toevoeging op 01/10/2018 16:24:54:
Los daarvan, is het wel een heel simpele manier om query's uit te voeren.
Lees ook eens iets over SQL-injectie, en dan met name het stuk over escapen. Want wat nu als er een ' in de naam stond?
Naast mysqli_real_escape_string kun je ook naar prepared statements" zoeken.
Quote:
De echo "niet ingevoerd" of de echo "ingevoerd" komt niet in beeld
Dit is een indicatie dat er het e.e.a. fout gaat, maar de foutmeldingen mogelijk niet getoond worden.
De structuur van de code laat ook nogal wat te wensen over. Immers, als een bewerking fout gaat, waar je netjes op controleert (bijvoorbeeld bij het maken van een verbinding), ga je vervolgens wel door met de volgende stap, of de vorige stap nu goed of fout was. Dat heeft eigenlijk niet zoveel zin.
Waar het waarschijnlijk misgaat is regel 7, de tweede parameter van mysqli_select_db() -stichtin15_project- staat niet tussen (enkele) quotes. Daarnaast is deze bewerking helemaal niet nodig, omdat je bij het maken van de connectie al een database selecteert middels de 4e parameter van mysqli_connect() - $dbname.
De volgende snippet kan handig zijn voor bij de ontwikkeling van code, dit zort ervoor dat meldingen worden gemeld + weergegeven op het scherm, zet daartoe de volgende code aan het begin van elk script:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
?>
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
?>
Daarbij heeft @Ivo ook een punt. En laten we ook vooral het instellen van de character encoding niet vergeten, opdat je data niet corrupt raakt en escaping ook naar behoren functioneert.
De snippet van Thomas staat er nu in. Geen foutmeldingen meer maar ook geen insert
Een $voornaam van Ivo geeft geen opheldering.
Kan het zijn dat de database ergens schrijfbeveiligd is?
kijk eens naar regel 19 !msqli_query => !mysqli_query
Welke editor gebruik je om je code aan te passen? Een goede editor zou zulke syntax fouten al direct moeten aangeven.
Omdat regel 19 er alleen maar als een soort bevestiging in zat is die weggehaald. Geen verbetering
Ik gebruik Dreamwaever als editor
Dat je het niet opmerkt is wel een indicatie van je probleem.
Peter Van der Weijden op 01/10/2018 17:52:42:
Regel 5 is aangepast. Geen verbetering
Omdat regel 19 er alleen maar als een soort bevestiging in zat is die weggehaald. Geen verbetering
Ik gebruik Dreamwaever als editor
Omdat regel 19 er alleen maar als een soort bevestiging in zat is die weggehaald. Geen verbetering
Ik gebruik Dreamwaever als editor
Dreamweaver is niet echt een PHP-editor. Ik zou het gebruik ervan eerder gezegd afraden.
Ikzelf gebruik NetBeans IDE. Ook is Eclipse of PHP Storm een goede aanrader.
Gewijzigd op 01/10/2018 18:36:07 door - Ariën -
Ward van der Put op 01/10/2018 16:47:52:
Ik vind dit juist altijd extra onleesbaar worden, omdat je dan door de brij aan aanhalingstekens ook niet meer ziet welke nou bij welke hoort ... Een goede editor (wederom) toont de variabelen in een string gewoon in een ander kleurtje, en dan zie je precies wat je aan het doen bent (alhoewel het in dit geval sowieso al not-done is ivm SQL injectie).
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$sql = "INSERT INTO adressen (
voornaam,
achternaam
)
VALUES (
'" . $voornaam . "',
'" . $achternaam . "'
)";
?>
$sql = "INSERT INTO adressen (
voornaam,
achternaam
)
VALUES (
'" . $voornaam . "',
'" . $achternaam . "'
)";
?>
Zo beter? Of is dit code-formatting too much ;-)?
Bij grote queries bouw ik het ook altijd zo op.
Gewijzigd op 01/10/2018 20:18:19 door - Ariën -
Voor die ene keer dat ik 100% zeker weet dat ik variabelen niet hoef te escapen (vaste tekst, of een getal), dan zou ik:
Code (php)
1
2
3
2
3
$sql = "
INSERT INTO adressen (voornaam,achternaam)
VALUES ('$voornaam','$achternaam')";
INSERT INTO adressen (voornaam,achternaam)
VALUES ('$voornaam','$achternaam')";
Maar meestal gewoon met bindvars, dus dan:
Code (php)
1
2
3
4
2
3
4
$sql = "
INSERT INTO adressen (voornaam,achternaam)
VALUES (:voornaam,:achternaam)";
$args = compact('voornaam','achternaam');
INSERT INTO adressen (voornaam,achternaam)
VALUES (:voornaam,:achternaam)";
$args = compact('voornaam','achternaam');
Maar als het zo simpel is als dit doe ik nog liever:
Maar ingewikkelde queries (select met een zooi joins en een uitgebreide where) schrijf ik ook liever:
Stappen:
1. Maak verbinding met de database
2. Hier een voorbeeld voor toevoegen en check in tabel met als naam members
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$username=$_POST['username'];
$email=$_POST['email'];
$bedrijf=$_POST['bedrijf'];
$telefoon=$_POST['telefoon'];
$adres=$_POST['plaats'];
$naam=$_POST['naam'];
$wachtwoord=$_POST['wachtwoord'];
//$active="Yes or No, from select";
$active=$_POST['actief'];
// standard no privileges as administrator, no editing possible
$admin="No";
//maak nu hash van wachtwoord aan
$wachtwoord=password_hash($wachtwoord, PASSWORD_BCRYPT);
$ad="insert into members(username,password,email,naam,bedrijf,adres,telefoon,active,admin) values(?,?,?,?,?,?,?,?,?)";
$stmt= $mysqli->prepare($ad);
$stmt->bind_param("sssssssss",$username,$wachtwoord,$email,$naam,$bedrijf,$adres,$telefoon,$active,$admin);
$stmt->execute();
$newId = $stmtins->insert_id;
$stmt->close();
$email=$_POST['email'];
$bedrijf=$_POST['bedrijf'];
$telefoon=$_POST['telefoon'];
$adres=$_POST['plaats'];
$naam=$_POST['naam'];
$wachtwoord=$_POST['wachtwoord'];
//$active="Yes or No, from select";
$active=$_POST['actief'];
// standard no privileges as administrator, no editing possible
$admin="No";
//maak nu hash van wachtwoord aan
$wachtwoord=password_hash($wachtwoord, PASSWORD_BCRYPT);
$ad="insert into members(username,password,email,naam,bedrijf,adres,telefoon,active,admin) values(?,?,?,?,?,?,?,?,?)";
$stmt= $mysqli->prepare($ad);
$stmt->bind_param("sssssssss",$username,$wachtwoord,$email,$naam,$bedrijf,$adres,$telefoon,$active,$admin);
$stmt->execute();
$newId = $stmtins->insert_id;
$stmt->close();
In $newId weet je de toegevoegde regel.
Succes met het leren.
Jan te Pas op 02/10/2018 15:14:30:
Wel moet alles in het formulier opgevangen worden zodat geen injectie plaats kan vinden.
Uhhh, daar zorgt de prepared statement laag juist voor...
Enne, $stmtins bestaat niet helaas.
Ik denk dat de topicstarter meer geholpen is met een fatsoenlijke editor, debugging tools (zie codesnippet) en wat basiskennis programmeer knowhow.
Het probleem is inmiddels opgelost door mijn provider.
Ik denk dat daar iets niet goed was want nu gaat het wel goed.