Probleem met prepared statements

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Medina Wal

Medina Wal

30/05/2016 15:31:26
Quote Anchor link
Ik wil klantgegevens toevoegen of update in zo min mogelijk code maar wel met prepared statements
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
if ($countRows > 0) {
 $klantid = $KlantID;
 $sql = "UPDATE klant
     SET Voornaam=?, etc.
     WHERE Emailadres=?";
} else {
 $sql = "INSERT INTO klant ( Voornaam, etc)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
};
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ssssssssss', $_POST['voornaam'], etc.);
if(!$stmt->execute()) {
 echo "Door een fout is de klant niet toegevoegd!";
 exit;
}
$stmt->close();


dit werkt alleen als ik een nieuwe klant toevoeg.
Kan ik dit werkend krijgen op deze manier, of moet ik toch de 2 querys voluit schrijven?
- Ariën -:
Titel aangepast van 'Kan dit zo?' naar 'Probleem met prepared statements'.

Gelieve in het vervolg duidelijke topictitels mee te geven.
Gewijzigd op 30/05/2016 21:21:36 door - Ariën -
 
PHP hulp

PHP hulp

19/04/2024 06:01:08
 
Ward van der Put
Moderator

Ward van der Put

30/05/2016 15:49:14
Quote Anchor link
MySQL heeft een syntaxis waarmee je een INSERT en een UPDATE kunt combineren tot één query:

INSERT ... ON DUPLICATE KEY UPDATE

Daarmee kun je besparen op de voorafgaande controle of een klant al bestaat: mislukt de INSERT van een nieuwe klant namelijk, dan wordt de UPDATE van een bestaande klant uitgevoerd.
 
Thomas van den Heuvel

Thomas van den Heuvel

30/05/2016 15:56:38
Quote Anchor link
Quote:
maar wel met prepared statements

Waarom?

Quote:
dit werkt alleen als ik een nieuwe klant toevoeg

Waarom werkt het niet in beide gevallen? Is het aantal parameters of de volgorde anders? Waarin uit zich dit? Worden gegevens niet geupdate? Krijg je ook foutmeldingen?

Je zou er ook altijd voor kunnen kiezen om het toevoegen en wijzigen te splitsen en deze acties geheel in afzondering te behandelen.
 
Pipo Clown

Pipo Clown

30/05/2016 16:20:07
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$klantid = $KlantID;


Geen idee wat je hier probeert maar PHP is niet hoofdlettergevoelig, dus hier staat 2x dezelfde variabele. (bijv. 5=5)

Verder wil ik je adviseren om, voor de overzichtelijkheid, al die vraagtekens weg te halen en met pseudoniemen te werken, dan zie je wat je doet.
Bijvoorbeeld :

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
$sql = "INSERT INTO klant ( Voornaam, etc)
    VALUES ('naam=:naam', 'adres=:adres', 'woonplaats=:woonplaats')";

 $waarden = array(
   ':naam'  => 'Pietje',
   ':adres: => 'php-weg',
   ':woonplaats' => 'Programmeerstad
 )

$stmt = $mysqli->prepare($sql);
if(!$stmt->execute($waarden)) {
 echo "Door een fout is de klant niet toegevoegd!";
 exit;
}
 
Ivo P

Ivo P

30/05/2016 16:23:49
Quote Anchor link
@pipo

beetje te veel aan '''''' in de insert query zo. (eigenlijk horen daar in het geheel geen ' in te staan)
 
Medina Wal

Medina Wal

30/05/2016 19:21:20
Quote Anchor link
Ward,
dank je wel voor dit doortastende antwoord, hier was ik naar op zoek, zonder dat ik van het bestaan wist.

Thomas,
ik gebruik prepared statements, omdat ik overal lees, dat dat qua beveiliging beter is (ivm sql injection), het gaat immers om het verwerken van menselijke input.
Waarom dit niet in beide gevallen werkt, is mij dus ook niet duidelijk, maar een syntaxes die dit combineert zorgt er in ieder geval voor dat deze vraag niet meer evident is.

Pipo,
Je zegt wel dat php niet hoofdletter gevoelig is, maar als ik beide echo, dan krijg ik maar van 1 de waarde. de 2e waarde, dus $KlantID is een net uit de db onttrokken waarde, is dat misschien waarom?
Je tip over psuedoniemen neem ik zeker ter harte, dank je wel hiervoor.
 
- SanThe -

- SanThe -

30/05/2016 20:14:04
Quote Anchor link
Pipo Clown op 30/05/2016 16:20:07:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$klantid = $KlantID;

Geen idee wat je hier probeert maar PHP is niet hoofdlettergevoelig, dus hier staat 2x dezelfde variabele. (bijv. 5=5)


Interessant.
Mijn PHP wel. Het zijn hier wel degelijk twee verschillende variabelen.
 
Jan de Laet

Jan de Laet

30/05/2016 20:31:38
Quote Anchor link
@Pipo: http://php.net/manual/en/language.variables.basics.php

Variabelen zijn dus wel degelijk case sensitive.
Gewijzigd op 30/05/2016 20:32:39 door Jan de Laet
 
Ivo P

Ivo P

31/05/2016 14:20:08
Quote Anchor link
in 1 script zowel $klantid als $klantID gebruiken, is een bron van bugs natuurlijk.

500 regels verderop zit je je af te vragen waarom $klantId toch maar leeg blijft.
 
Thomas van den Heuvel

Thomas van den Heuvel

31/05/2016 14:30:48
Quote Anchor link
Zowel prepare(), alsmede bind_param() en execute() retourneren false als er iets misgaat.

Controleer hierop.

Mogelijk zit er ergens een typefout in het "etc" gedeelte.
 



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.