Probleem met prepared statements
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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();
$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.
Gelieve in het vervolg duidelijke topictitels mee te geven.
Gewijzigd op 30/05/2016 21:21:36 door - Ariën -
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.
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.
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
}
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;
}
beetje te veel aan '''''' in de insert query zo. (eigenlijk horen daar in het geheel geen ' in te staan)
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.
Pipo Clown op 30/05/2016 16:20:07:
Interessant.
Mijn PHP wel. Het zijn hier wel degelijk twee verschillende variabelen.
http://php.net/manual/en/language.variables.basics.php
Variabelen zijn dus wel degelijk case sensitive.
@Pipo: Variabelen zijn dus wel degelijk case sensitive.
Gewijzigd op 30/05/2016 20:32:39 door Jan de Laet
500 regels verderop zit je je af te vragen waarom $klantId toch maar leeg blijft.
Controleer hierop.
Mogelijk zit er ergens een typefout in het "etc" gedeelte.