Hi,
ich möchte einen Fehler in execute() derart abfangen:
try {
$this->stmt->execute();
} catch(Exception $e) {
echo "<br />Fehler: ".$e->getMessage()."<br />";
}
fehler: Fatal error: Call to a member function execute() on a non-object in D:\DEVELOP\PHPworkspace\Utf8Korrektur\db.php on line 112
Warum funktioniert das nicht und er bricht weiter nach dem execute mit fatalerror ab? ich will das er das update wenn es fehlschlägt loggt, aber mit den anderen updates weiter fortfährt.
Danke!!
achso ich nutze php 5.3, mysqli zur verbindungsherstellung und prepared statements (und alles oo)
Seite 1 von 1
Mysqli Execute() Mit Try Catch Abfangen
Anzeige
#2
geschrieben 06. Oktober 2009 - 16:23
Hi, laut hier hast du von stmt keine Instanz erstellt.
Also theoretisch.
MfG Karl0
Also theoretisch.
$stmt = new Stmt;
try {
$stmt->execute();
} catch(Exception $e) {
echo "<br />Fehler: ".$e->getMessage()."<br />";
}
MfG Karl0
Du bist die Nr. 1 - BLUE!!
#3
geschrieben 06. Oktober 2009 - 17:32
doch hab ich. und die anfrage an die db (sprich das update) funktioniert ja an und für sich auch. nur manchmal kommen z.b. solche updates zustande: column = 'va'lue'. sprich es wurde stripslashes() vergessen. und dann kracht das update natürlich. und das wollte ich halt abfangen.
#4
geschrieben 06. Oktober 2009 - 21:32
Du rufst die Methode "execute" des Objects "stmt" über $this auf. Bist du dir sicher das auf jeden Fall ein Objekt "stmt" erzeugt wird?
Die Fehlermeldung besagt nämlich, dass du eine Methode (execute()) auf ein nicht existierendes Objekt anwendest.
Wenn du uns mehr Einblick in deinen Code schenkst, würde man dir besser helfen können
Die Fehlermeldung besagt nämlich, dass du eine Methode (execute()) auf ein nicht existierendes Objekt anwendest.
Wenn du uns mehr Einblick in deinen Code schenkst, würde man dir besser helfen können
Zitat
"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon
Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
#5
geschrieben 07. Oktober 2009 - 06:47
Was ist überhaupt this, befindest du dich denn innerhalb einer Klasse?
#6
geschrieben 07. Oktober 2009 - 07:32
Hier mein Code:
function updateTable($table, $cols = array(), $values = array(), $primeKey, $primeKeyValue) {
[...]
// Update zusammenbauen und durchfuehren
$cnt = 0;
$query = "UPDATE ".$table." SET ";
for($i = 0; $i < count($cols); $i++) {
if($cnt == 1) {
$query .= ",";
}
$query .= $cols[$i]." = '".$values[$i]."'";
$cnt = 1;
}
$query .= " WHERE ".$primeKey." = '".$primeKeyValue."'";
$cnt = 0;
$this->stmt = $this->db->prepare($query);
try {
$this->stmt->execute();
} catch(Exception $e) {
echo "<br />Fehler: ".$e->getMessage()."<br />";
}
// Anzahl beeinflusster Zeilen zurueckgeben
$cnt = $this->stmt->affected_rows;
$this->stmt->close();
return $cnt;
}
ja und jetzt sollte er eigentlich die Fehler abfangen und nicht das Programm beenden
function updateTable($table, $cols = array(), $values = array(), $primeKey, $primeKeyValue) {
[...]
// Update zusammenbauen und durchfuehren
$cnt = 0;
$query = "UPDATE ".$table." SET ";
for($i = 0; $i < count($cols); $i++) {
if($cnt == 1) {
$query .= ",";
}
$query .= $cols[$i]." = '".$values[$i]."'";
$cnt = 1;
}
$query .= " WHERE ".$primeKey." = '".$primeKeyValue."'";
$cnt = 0;
$this->stmt = $this->db->prepare($query);
try {
$this->stmt->execute();
} catch(Exception $e) {
echo "<br />Fehler: ".$e->getMessage()."<br />";
}
// Anzahl beeinflusster Zeilen zurueckgeben
$cnt = $this->stmt->affected_rows;
$this->stmt->close();
return $cnt;
}
ja und jetzt sollte er eigentlich die Fehler abfangen und nicht das Programm beenden
#7
geschrieben 07. Oktober 2009 - 08:48
Wie oben schon gefragt, wie kommst du darauf den this-Zeiger zu verwenden, wenn du dich lediglich in einer Funktion befindest? Wenn du überall "$this->" entfernst, sollte es laufen.
Btw, dir ist hoffentlich bewusst, dass die letzten drei Zeilen immer ausgeführt werden, auch wenn du die Exception abfängst.
Btw, dir ist hoffentlich bewusst, dass die letzten drei Zeilen immer ausgeführt werden, auch wenn du die Exception abfängst.
#8
geschrieben 07. Oktober 2009 - 15:19
ja ok ich habe vergessen noch mehr quellcode hinzuschreiben. es handelt sich um eine private function in meiner klasse db! von daher ist das $this berechtigt. funktionieren tut der code ja, aber eben wenn anführungszeichen nicht entwertet wurden, dann und nur dann kracht das execute(). genau das wollte ich mit der exception abfangen. leider geht das aber nicht und genau an der stelle brauche ich eure hilfe
@witi: ja stimmt, der letzte teil der function sollte da mit reingenommen werden
@witi: ja stimmt, der letzte teil der function sollte da mit reingenommen werden
#9
geschrieben 08. Oktober 2009 - 09:05
private function updateTable($table, $cols = array(), $values = array(), $primeKey, $primeKeyValue) {
[...]
// Update zusammenbauen und durchfuehren
$cnt = 0;
$query = "UPDATE `".$table."` SET ";
for($i = 0; $i < count($cols); $i++) {
if($cnt >= 1) {
$query .= ",";
}
$query .= "`".$table."`.`".$cols[$i]."` = '".$values[$i]."'";
$cnt++;
}
$query .= " WHERE ".$primeKey." = ".$primeKeyValue;
$cnt = 0;
$this->stmt = $this->db->prepare($query);
try {
$this->stmt->execute();
// Anzahl beeinflusster Zeilen zurueckgeben
$cnt = $this->stmt->affected_rows;
$this->stmt->close();
return $cnt;
} catch(Exception $e) {
$this->errorMessage = $e->getMessage();
return false;
}
}
Aufruf könnte so aussehen:
$entryUpdate = $this->updateTable(...);
if(!$entryUpdate) {
echo "Fehler: ".$this->errorMessage;
}
Vergiss nicht $errorMessage als Klassenvariable zu deklarieren.
Zu deinen Fehler: Du brauchtest nur 2 ` um $cols (Spaltennamen) zu setzen, und der Fehler würde nicht mehr auftretten..
[...]
// Update zusammenbauen und durchfuehren
$cnt = 0;
$query = "UPDATE `".$table."` SET ";
for($i = 0; $i < count($cols); $i++) {
if($cnt >= 1) {
$query .= ",";
}
$query .= "`".$table."`.`".$cols[$i]."` = '".$values[$i]."'";
$cnt++;
}
$query .= " WHERE ".$primeKey." = ".$primeKeyValue;
$cnt = 0;
$this->stmt = $this->db->prepare($query);
try {
$this->stmt->execute();
// Anzahl beeinflusster Zeilen zurueckgeben
$cnt = $this->stmt->affected_rows;
$this->stmt->close();
return $cnt;
} catch(Exception $e) {
$this->errorMessage = $e->getMessage();
return false;
}
}
Aufruf könnte so aussehen:
$entryUpdate = $this->updateTable(...);
if(!$entryUpdate) {
echo "Fehler: ".$this->errorMessage;
}
Vergiss nicht $errorMessage als Klassenvariable zu deklarieren.
Zu deinen Fehler: Du brauchtest nur 2 ` um $cols (Spaltennamen) zu setzen, und der Fehler würde nicht mehr auftretten..
Zitat
"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon
Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
Thema verteilen:
Seite 1 von 1

Hilfe
Neues Thema
Antworten
Nach oben




