Nieuw record aan database toevoegen geeft problemen. Ik zie het niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ventilatiesysteem Productontwikkelaar HBO WO Verwa

Samengevat: Zij bieden flexibele ventilatiematerialen, geluidsdempers, rookgasafvoer producten en industrieslangen. Ben jij een technisch productontwikkelaar? Heb jij ervaring met het ontwikkelen van nieuwe producten? Vaste baan: Technisch Productontwikkelaar HBO WO €3.000 - €4.000 Zij bieden een variëteit aan flexibele ventilatiematerialen, geluiddempers, rookgasafvoer producten, industrieslangen en ventilatieslangen voor de scheepsbouw. Met slimme en innovatieve materialen zorgen wij voor een gezonde en frisse leefomgeving. Deze werkgever is een organisatie die volop in ontwikkeling is met hardwerkende collega's. Dit geeft goede ontwikkelingsmogelijkheden. De branche van dit bedrijf is Techniek en Engineering. Functie: Voor de vacature als Technisch Productontwikkelaar Ede Gld HBO WO ga

Bekijk vacature »

Jan te Pas

Jan te Pas

18/03/2018 11:52:06
Quote Anchor link
In mijn project wil ik nu een tabel in Mysql vullen met een invoer. De volgende code heb ik als contact met de database.

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
$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();


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
 
PHP hulp

PHP hulp

27/04/2024 06:04:55
 
Rob Doemaarwat

Rob Doemaarwat

18/03/2018 12:23:03
Quote Anchor link
Getallen kun je als getallen invoeren, maar stukken tekst zul je van quootjes moeten voorzien
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql = "INSERT INTO projecten ... VALUES ($id, '$productsoortomschrijving', ...)";

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
 
Jan te Pas

Jan te Pas

18/03/2018 12:47:05
Quote Anchor link
Hi Rob,
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
 
Ben van Velzen

Ben van Velzen

18/03/2018 13:23:41
Quote Anchor link
Je gebruikt $sql in mysqli_insert_id terwijl je $conn wil hebben. Of nog makkelijker, gebruik $conn->insert_id
 
Jan te Pas

Jan te Pas

18/03/2018 13:24:41
Quote Anchor link
Hi Ben, dank je wel. Ik begin het een beetje te leren. Maar soms........Dank
 
Thomas van den Heuvel

Thomas van den Heuvel

18/03/2018 15:34:12
Quote Anchor link
Op het moment dat je grotere applicaties gaat schrijven is het ook zaak dat je je code beter gaat organiseren.

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
 
Jan te Pas

Jan te Pas

18/03/2018 15:55:37
Quote Anchor link
Hallo Thomas,
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!
 
Thomas van den Heuvel

Thomas van den Heuvel

18/03/2018 17:09:56
 
Jan te Pas

Jan te Pas

18/03/2018 19:17:53
Quote Anchor link
Dank voor de leeslijst. Zal ik meerdere uurtjes druk mee zijn, leervoer en leesvoer. Thumbs up Thomas.
 



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.