Nieuw record aan database toevoegen geeft problemen. Ik zie het niet
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$id="1";
//projectgegevens nu wegschrijven!
$servername = "localhost";
$username = "xxxxxxxxxxxt";
$password = "xxxxxxxxxxxr";
$dbname = "xxxxxxxxxx";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "INSERT INTO projecten(user, productsoort, aantal, meters, steek, bouwlagen, bouwperiode, objecttype, chkbx1, chkbx2, chkbx3, chkbx4, locatie, locatiekosten, totaal, pereenheid) VALUES ($id, $productsoortomschrijving, $aantal, $metersomschrijving, $steek, $bouwlagenomschrijving, $bouwperiodeomschrijving, $objectypeomschrijving, $sc1, $sc2, $sc3, $sc4, $locatieomschrijving, $locatie, $var1, $var2)";
// systeem: welk recordnummer is gemaakt? phphulp
$projectnummer='PR-'.(mysqli_insert_id($sql));
//verder door met eerste code
if ($conn->query($sql) === TRUE) {
echo 'klaar, projectnummer: PR'.$projectnummer;
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
//projectgegevens nu wegschrijven!
$servername = "localhost";
$username = "xxxxxxxxxxxt";
$password = "xxxxxxxxxxxr";
$dbname = "xxxxxxxxxx";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "INSERT INTO projecten(user, productsoort, aantal, meters, steek, bouwlagen, bouwperiode, objecttype, chkbx1, chkbx2, chkbx3, chkbx4, locatie, locatiekosten, totaal, pereenheid) VALUES ($id, $productsoortomschrijving, $aantal, $metersomschrijving, $steek, $bouwlagenomschrijving, $bouwperiodeomschrijving, $objectypeomschrijving, $sc1, $sc2, $sc3, $sc4, $locatieomschrijving, $locatie, $var1, $var2)";
// systeem: welk recordnummer is gemaakt? phphulp
$projectnummer='PR-'.(mysqli_insert_id($sql));
//verder door met eerste code
if ($conn->query($sql) === TRUE) {
echo 'klaar, projectnummer: PR'.$projectnummer;
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
Uiteraard even de echte inloggegevens eruit gehaald.
Ik heb alles tig-keer gecontroleerd, maar het blijft mis gaan. Ik krijg de volgende foutmelding:
Error: INSERT INTO projecten(user, productsoort, aantal, meters, steek, bouwlagen, bouwperiode, objecttype, chkbx1, chkbx2, chkbx3, chkbx4, locatie, locatiekosten, totaal, pereenheid) VALUES (1, Inventarisatie NEN3699 M1, 44, 10, 10, 1 bouwlaag- bereikbaarheid achterzijde, >= 2010, Woning Vrijstaand, , , , , Arnhem - Gelderland, 172.5, 172.5, 43.125)
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'NEN3699 M1, 44, 10, 10, 1 bouwlaag- bereikbaarheid achterzijde, >= 2010, Woning ' at line 1
Waar ga ik de fout in.
Ik heb, om komma’s uit te sluiten, bij variabelen van te voren met srt_replace de komma’s vervangen door een ‘min’. Kortom...HELP
Maar dan moet je meteen ook maar even zoeken naar SQL injectie ("stel nu dat er een quootje in $productsoortomschrijving staat" ...).
Gewijzigd op 18/03/2018 12:23:33 door Rob Doemaarwat
DANK DANK DANK! Zoiets zie je snel over het hoofd. Hij doet het! Dank
Nu merk ik dat het laatste nummer niet in projectnummer ingevuld wordt. Dat is dus nog niet goed. Rob, zie jij het?
Gewijzigd op 18/03/2018 13:11:11 door Jan te Pas
Je gebruikt $sql in mysqli_insert_id terwijl je $conn wil hebben. Of nog makkelijker, gebruik $conn->insert_id
Hi Ben, dank je wel. Ik begin het een beetje te leren. Maar soms........Dank
Uiteindelijk zul je dan geen standalone scripts (een script wat autonoom zijn werk kan doen, los oproepbaar) meer hebben waarin alles volledig wordt geregeld (zoals het starten van een sessie, het maken van een database-connectie et cetera).
Dit is uit oogpunt van veiligheid ook niet wenselijk, immers, elk standalone script is een "voordeur" in je applicatie. Het liefste heb je dan ook slechts één voordeur via welke bezoekers je applicatie binnenkomen. Stel namelijk dat je een potentieel veiligheidslek hebt geïdentificeerd in een standalone script. In het ergste geval zul je dan elk script met deze herhalende code (als hier sprake van is) moeten patchen. Naast het feit dat dat nogal bewerkelijk is, is dit ook foutgevoelig - wat als je een script vergeet? Het is dus beter om alles één keer en op één plaats te regelen.
Ook verdienen bepaalde stukken functionaliteit een eigen plekje. $servername, $username, $password en $dbname zijn onderdeel van (database)configuratie. Deze horen dus in een (één) configuratie-bestand thuis. Los hiervan staan deze variabelen nu in een "globale scope". Mochten deze onverhoopt in de output van een HTML-document terecht komen dan liggen je database-gegevens (en daarmee ook andere gegevens) op straat. Daarnaast is dit een voorbeeld van onhandig gebruik: wanneer een van deze waarden verandert in de huidige opzet, zul je alle scripts aan moeten gaan passen...
Je moet ook gaan nadenken hoe je dingen efficiënter en eenduidiger aanpakt. Op dit moment gebruik je twee verschillende schrijfwijzen voor communicatie met de database door elkaar: een procedurele (mysqli_insert_id) en een object georiënteerde (new mysqli, $conn->query). Zorg dat hier lijn in zit, of nog beter, gebruik een wrapper om ook werk uit handen te nemen.
En tot slot: als je met een database gaat werken moet je weten hoe dit werkt. Zo selecteer je geen character encoding bij (of liever gezegd na) het maken van een connectie. Alle tekst waarmee je werkt heeft een character encoding. Het is jouw verantwoordelijkheid dat deze overal in de pas loopt. Overal zijnde: de encoding waarmee alle bestanden zijn opgeslagen, het gegenereerde HTML-document, de connectie met je database, de encoding van tabellen + kolommen van deze database en tot slot de data in deze tabellen zelf.
Tevens: (database-gerelateerde) veiligheid. Zoals @Rob aangeeft zul je moeten leren veilig om te gaan met data van eindgebruikers, dit eindigt ook niet nadat je het in de database hebt gestopt. Hier moet je je altijd en overal bewust van zijn.
Gewijzigd op 18/03/2018 15:36:53 door Thomas van den Heuvel
Dank voor jouw relaas. Duideljk en gestructureerd. Ik test de modules, pagina’s separaat. De dbconnectie zit in een config die via een include opgenomen is. Maar dat zou de code groot worden in deze pagina. Daarom deel geplakt.
Ik ben blij met de ondersteuning die ik vanochtend jou en anderen krijg. Dank. Ik hou van structuur, maar je moet eerst zeker worden....en dan durf je meer. Dank!
> wat zijn character encoderingen
> wat is SQL-injectie
> hoe voorkom ik SQL-injectie
> real_escape_string() alleen is niet genoeg
> een MySQLi wrapper, deze neemt je werk uit handen
> voorbeeld van gebruik
> veiligheid gaat verder dan DB: filter input, escape output
> filter input, escape output #2
Gewijzigd op 18/03/2018 17:10:09 door Thomas van den Heuvel
Dank voor de leeslijst. Zal ik meerdere uurtjes druk mee zijn, leervoer en leesvoer. Thumbs up Thomas.