pdo update query werkt niet
Ik heb vanalles nagezocht, maar krijg niet gevonden waarom de query niet werkt. Dit is wat ik heb:
De foutmelding geeft:
"SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; near:''nombre' = 'XXXX', 'apellidos' = 'XXX XXX', 'socio' = '00' at line 3"
Ik kom er niet uit
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
//Connect to the dBase
require_once ('link to de dBase-connectionFile');
$sql_update = "UPDATE socios
SET 'nombre' = :nombre,
'apellidos' = :apellidos,
'socio' = :socio,
'email' = :email,
'dni' = :dni
WHERE
'id' = $id";
$stmt = $db->prepare($sql_update);
$stmt->execute(array(':nombre'=>$nombre,
':apellidos'=>$apellidos,
':socio'=>$socio,
':email'=>$email,
':dni'=>$dni));
if($stmt->rowCount() == 0) {
throw new PDOException ('Er zijn geen rijen gewijzigd in de UPDATE query');
}
require_once ('link to de dBase-connectionFile');
$sql_update = "UPDATE socios
SET 'nombre' = :nombre,
'apellidos' = :apellidos,
'socio' = :socio,
'email' = :email,
'dni' = :dni
WHERE
'id' = $id";
$stmt = $db->prepare($sql_update);
$stmt->execute(array(':nombre'=>$nombre,
':apellidos'=>$apellidos,
':socio'=>$socio,
':email'=>$email,
':dni'=>$dni));
if($stmt->rowCount() == 0) {
throw new PDOException ('Er zijn geen rijen gewijzigd in de UPDATE query');
}
De foutmelding geeft:
"SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; near:''nombre' = 'XXXX', 'apellidos' = 'XXX XXX', 'socio' = '00' at line 3"
Ik kom er niet uit
Er hoeven toch geen aanhalingstekens om nombre, appellidos enz.
Ik heb ze weggehaald en inderdaad, de PDOerror is nu opgelost, maar de update is niet uitgevoerd, want krijg nu de melding: 'Er zijn geen rijen gewijzigd in de UPDATE query'.
Gewijzigd op 22/08/2014 11:33:46 door tortuga web
Probeer de error op te vangen.
zijn er records met id = $id
en wat is de waarde van de ingevulde kolommen vooraf?
is dat wel anders dan wat het moet worden?
stel x = 10 voor rij met id = 1;
UPDATE tabel
SET x = 11
WHERE id = 1;
>> affected rows = 1
UPDATE tabel
SET x = 11
WHERE id = 1;
>> affected rows = 0
er is namelijk niets veranderd in de database.
en wat is de waarde van de ingevulde kolommen vooraf?
is dat wel anders dan wat het moet worden?
stel x = 10 voor rij met id = 1;
UPDATE tabel
SET x = 11
WHERE id = 1;
>> affected rows = 1
UPDATE tabel
SET x = 11
WHERE id = 1;
>> affected rows = 0
er is namelijk niets veranderd in de database.
De foutmelding die ik nu krijg is uit de "if($stmt->rowCount() == 0) (regel 17 in de code hierbboven)
Daaronder heb ik een catch met de gebruikelijke PDOexceptions, waar ik de vorige foutmeldimng vandaan had. Dus daar wordt nu geen fout gegenereerd.
Toevoeging op 22/08/2014 11:50:17:
Oke, ik haal eerst de record op en stop die gegevens in een formulier. Dit werkt. In het formulier heb ik ook een hidden field (voor nu even zichtbaar) waar ik de id (autoincrement) uit de tabel in stop. Ook dit werkt. Ik zie alles goed opgehaald. Vervolgens wijzig ik één veld, (bv. nombre), maar deze wijziging wordt dus niet doorgevoerd. (voor de volledigheid heb ik ook de gegevens gecontroleerd in phpmyadmin). Kan het zijn dat ik iets niet goed doe met de $id, die heb ik weer terug opgehaald uit het formulier met $_POST['id']
Daaronder heb ik een catch met de gebruikelijke PDOexceptions, waar ik de vorige foutmeldimng vandaan had. Dus daar wordt nu geen fout gegenereerd.
Toevoeging op 22/08/2014 11:50:17:
Oke, ik haal eerst de record op en stop die gegevens in een formulier. Dit werkt. In het formulier heb ik ook een hidden field (voor nu even zichtbaar) waar ik de id (autoincrement) uit de tabel in stop. Ook dit werkt. Ik zie alles goed opgehaald. Vervolgens wijzig ik één veld, (bv. nombre), maar deze wijziging wordt dus niet doorgevoerd. (voor de volledigheid heb ik ook de gegevens gecontroleerd in phpmyadmin). Kan het zijn dat ik iets niet goed doe met de $id, die heb ik weer terug opgehaald uit het formulier met $_POST['id']
op zich is het natuurlijk niet een fout of een exception (voor php) dat de query 0 rijen aanpast.
Als de query een fout oplevert, dan wel.
Als de query een fout oplevert, dan wel.
Code (php)
Gewijzigd op 22/08/2014 12:20:10 door Ivo P
Dat klopt. Daarom lijkt het alsof er niets mis is met de syntax, maar deze query zou wél een update van de gegevens uit moet voeren. En dat doet ie niet, maar ik snap niet waarom niet.
Heb je bovenstaande code van Ivo P al uitgevoerd? Welke melding komt daaruit?
Dat er geen rijen zijn aangepast
als er geen rijen zijn aangepast dan
* is de query dus qua syntax goed
* matcht alles met bestaande kolommen en tabelnamen
* heb je connectie met de database
Dat er niets is aangepast:
* er zijn geen rijen die voldoen aan de wHERE-eisen: id = $id
* er zijn wel records, maar daaraan is in feite niets aangepast.
geef je huidige script (zoals in de openingspost) nog eens.
* is de query dus qua syntax goed
* matcht alles met bestaande kolommen en tabelnamen
* heb je connectie met de database
Dat er niets is aangepast:
* er zijn geen rijen die voldoen aan de wHERE-eisen: id = $id
* er zijn wel records, maar daaraan is in feite niets aangepast.
geef je huidige script (zoals in de openingspost) nog eens.
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
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$id=$_POST['id'];
try {
//Connect to the dBase
require_once ('connect.php');
//Make update-query for the dBase
$sql_update = "UPDATE socios
SET
nombre = :nombre,
apellidos = :apellidos,
socio = :socio,
email = :email,
dni = :dni
WHERE
'id' = $id";
$stmt = $db->prepare($sql_update);
$stmt->execute(array(':nombre'=>$nombre,
':apellidos'=>$apellidos,
':socio'=>$socio,
':email'=>$email,
':dni'=>$dni));
if($stmt->rowCount() == 0) {
throw new PDOException ('Er zijn geen rijen gewijzigd in de UPDATE query');
}
}
catch (PDOException $e) {
echo '<pre>';
echo 'Regel: ' . $e->getLine() . '<br />';
echo 'Bestand: ' . $e->getFile() . '<br />';
echo 'Foutmelding: ' . $e->getMessage();
echo '</pre>';
}
try {
//Connect to the dBase
require_once ('connect.php');
//Make update-query for the dBase
$sql_update = "UPDATE socios
SET
nombre = :nombre,
apellidos = :apellidos,
socio = :socio,
email = :email,
dni = :dni
WHERE
'id' = $id";
$stmt = $db->prepare($sql_update);
$stmt->execute(array(':nombre'=>$nombre,
':apellidos'=>$apellidos,
':socio'=>$socio,
':email'=>$email,
':dni'=>$dni));
if($stmt->rowCount() == 0) {
throw new PDOException ('Er zijn geen rijen gewijzigd in de UPDATE query');
}
}
catch (PDOException $e) {
echo '<pre>';
echo 'Regel: ' . $e->getLine() . '<br />';
echo 'Bestand: ' . $e->getFile() . '<br />';
echo 'Foutmelding: ' . $e->getMessage();
echo '</pre>';
}
De gegevens in het formulier die verzonden worden met method="post", worden opgehaald uit de dBase met een selectquery, ook de id zie ik juist weergegeven. De id in de dBase is autoincrement, dus blijft identiek, maar verzekerd mij er van dat er maar 1 record aangepast wordt, nl. die met die specifieke id.
Gewijzigd op 22/08/2014 16:20:51 door tortuga web
Bij de where hoeft om id ook geen aanhalingstekens. En je geeft geen :id mee.
Gewijzigd op 22/08/2014 16:20:15 door gerhard l
Ja, foutje, heb ze weggehaald.
als ik ingeef:
WHERE id=:id, dan krijg ik wel een pdo-errormessage, nl: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens op regelnr.20
als ik doe: where id=$id, waarbij $id=$_POST['id'], dan krijg ik de melding dat er niks is aangepast. Dus ik vermoed dat het daarmee te maken heeft, maar ik weet niet hoe ik het moet aanpassen.
als ik ingeef:
WHERE id=:id, dan krijg ik wel een pdo-errormessage, nl: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens op regelnr.20
als ik doe: where id=$id, waarbij $id=$_POST['id'], dan krijg ik de melding dat er niks is aangepast. Dus ik vermoed dat het daarmee te maken heeft, maar ik weet niet hoe ik het moet aanpassen.
Verander eerst regel 14 in id = :id. Daarna :id => $_POST['id']mee geven in de array op regel 16. Als er dan niets verandert, kijken of $_POST['id'] is wat je verwacht.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$stmt->execute(array(':nombre'=>$nombre,
':apellidos'=>$apellidos,
':socio'=>$socio,
':email'=>$email,
':dni'=>$dni,
':id'=>$id));
':apellidos'=>$apellidos,
':socio'=>$socio,
':email'=>$email,
':dni'=>$dni,
':id'=>$id));
Ik heb de oplossing gevonden. Waarschijnlijk heb ik steeds over het hoofd gezien dat de aanhalingstekens bij id er nog stonden, want ik had deze oplossing al eerder geprobeerd, maar met foutmeldingen. Dus nu is het oed.
Dank voor jullie hulp.




