PHP [SQL] PDO::prepare mit bindParam

p0pp

Cadet 3rd Year
Registriert
März 2008
Beiträge
47
Hei ich bin grad dabei ne Aufgabe für die Uni zu machen aber ich bekomm ein Update Statement ned richtig hin.

der Teil um denes geht ist folgender :

$updateQuantity = $this->db->prepare(' UPDATE shoppingcart SET quantity = :q
WHERE name LIKE :n');
$updateQuantity->bindParam(':n',$name);
$updateQuantity->bindParam(':q',$quantity);

dann :

$updateQuantity->execute();

Wird einwandfrei ausgeführt nur ein update der Zeile erfolgt nicht.
Wenn ich im pma den SQL Code so eingebe :

UPDATE shoppingcart SET quantity = 10
WHERE name LIKE 'bier'

funktioniert das Update, ich weiß echt nicht wo der Fehler sein soll, da die vars einwandfrei gesetzt sind.

Einer ne Idee evtl. ?

Danke im vorraus.

p0pp
 
Hey,

das Problem habe ich auch gehabt - ohne eine Lösung zu finden. Ich habe auch andere Methoden wie zB. bindValue() versucht, allerdings ohne Erfolg. Mal aufs Geratewohl: was sagt PDO::errorInfo(), PDO::debugDumpParams oder PDO::errorCode()? Ich hatte damals das Problem, dass mir deren Ausgaben leider nicht viel geholfen haben.
 
Vielleicht hilft es, wenn du der Methode bindParam noch einen dritten Parameter gibst:
PDO::PARAM_STR für Strings bzw.
PDO::PARAM_INT für Ganzzahlen
 
Hei,

also PDO macht das wohl richtig ich denke es wird irgendwie dass problem sein dass :

:n nicht zu 'bier' sondern zu bier aufgelöst wird. dass findet er dann nicht oder so.
Aber meine versuche das :n umzuwandeln : \' :n \' usw. haben nichts gebracht.

Dass muss doch irgendwie funktionieren.

@Cobinja hab ich schon versucht, da stdandartmäßig die Sachen als String übergeben werden, hab ich die quantity mal auf int gesetzt, kein Erfolg.
 
Hast du in deinem Code den prepare-Aufruf auch zweizeilig stehen, so wie hier? Wenn ja, dann prüf mal, ob du hinter :q bzw. for WHERE ein Leerzeichen hast. Sonst erwartet er dort den Parameter :qWHERE.

Abgesehen davon: Du weisst, dass
Code:
LIKE 'bier'
das gleiche ist wie
Code:
= 'bier'
?
 
Hei,

ich hab das Update Statement mal ineine Zeile gerückt, keine Veränderung.
Hab LIKE durch = ersetzt und auch keine Verbesserung.

Das Ding ist halt :

$search = $this->db->prepare(' SELECT * FROM shoppingcart
WHERE name LIKE :n');
$search->bindParam(':n',$name);
$search->execute();

funktioniert einwandfrei.
Scheint also eindeutig am UPDATE zu liegen irgendwie.

btw. danke für die Hilfe.
 
bindParam gibt als Rückgabewert true oder false zurück. Gibt das bei beiden Aufrufen true?

Wenn nicht, fallen mit noch zwei Möglichkeiten ein:

1. Tausch mal die beiden Aufrufe von bindParam. Vielleicht wird erwartet, dass die Parameter in der geichen Reihenfolge gebunden werden, wie sie im Statement auftauchen.

2. Probier mal die Variante mit ? statt :q und :n. dabei musst du statt ':q' 1 an bindParam übergeben und statt ':n' 2, also jeweils den 1-basierten Index.
 
ahhh,

hab die Lösung des Problems.

Anscheind reicht es nicht mit dem 3. Parameter von bindParam zu sagen dass es ein int ist,
mein Aufruf sah folgender maßen aus :

$abc('bier','3');

Obwohl ich die 3 als int caste beim bindParam ging es nicht.
Wenn ich nun aber mit $abc('bier',3) aufrufe geht es einwandfrei...

Trotzdem allen vielen Dank für die Hilfe :)
 
Zurück
Oben