pdo update query werkt niet
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.
Gewijzigd op 22/08/2014 11:33:46 door tortuga web
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.
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']
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
* 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
Gewijzigd op 22/08/2014 16:20:15 door gerhard l
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.