Im Grunde ist ein Update auch nichts anderes als ein SELECT. Ich verweise nochmals hier rauf, zu mehr hab ich keine Lust erhlich gesagt.. der Code oben ist mir zu wirr. https://php-de.github.io/jumpto/pdo/#bind-array
Ankündigung
Einklappen
Keine Ankündigung bisher.
mein PDO-Projekt - Problem beim Update
Einklappen
Neue Werbung 2019
Einklappen
X
-
The string "()()" is not palindrom but the String "())(" is.
Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
PHP.de Wissenssammlung | Kein Support per PN
-
Ich schliesse mich Hausl an, das ist alles zu wirr..
Die Zeile "$update->bindValue(":id", $index);" findet sich beispielsweise schonmal nicht im Ausgangspost. Da weiß jetzt keiner, ob das der Grund für das ursprüngliche Problem war, ob der Code nachgeflickt wurde oder die Zeile beim Abtippen im Forum verloren gegangen ist.
Wie wäre es, wenn du ein nachvollziehbares Beispiel postest. Datenbank + Inhalte + Code in einem ZIP, einfach um das Ratespielchen zu beenden.
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
- 1 Likes
Kommentar
-
Am Rande:
Zitat von lstegelitz Beitrag anzeigenDa weiß jetzt keiner, ob das der Grund für das ursprüngliche Problem war, ob der Code nachgeflickt wurde oder die Zeile beim Abtippen im Forum verloren gegangen ist.
Kommentar
-
Moin!
wird zeit, dass ich mich mal melde. Also jetzt läuft alles im wesentlichen wie gewünscht. Wenn ich Euch den Fehler nenne würde es Steine hageln - deshalb lasse ich es einmal sein. Es war ein kleiner Fehler mit großer Wirkung etwas ausserhalb des geposteten Code.
Ich gebe aber nicht auf und habe auch schon wieder eine neue Frage in diesem Zusammenhang.
Das Erstellen von Datensätzen hatte ja gestern schon funktioniert. Nun kommt es aber zu einer Fehlermeldung die ich vom Wortlaut her nicht so ganz verstehe
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 19 UNIQUE constraint failed: MUM_PRAXIS.ID_RECHNER' in C:\PHProject\EBL_SoftwareInventar\ebl_class_crud.p hp:831 Stack trace: #0 C:\PHProject\EBL_SoftwareInventar\ebl_class_crud.p hp(831): PDOStatement->execute() #1 C:\PHProject\EBL_SoftwareInventar\ebl_class_crud.p hp(212): EBL_CRUD->PDO_Create() #2 C:\PHProject\EBL_SoftwareInventar\ebl_class_crud.p hp(139): EBL_CRUD->AktionCreate() #3 C:\PHProject\EBL_SoftwareInventar\mum_praxis.php(2: EBL_CRUD->execute() #4 {main} thrown in C:\PHProject\EBL_SoftwareInventar\ebl_class_crud.p hp on line 831
Hier einmal die Tabelle wo eingefügt werden soll:
sqlite_mum.png
Die Tabelle ist wie folgt definiert:
Code:CREATE TABLE "MUM_PRAXIS" ( `ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, `ID_RECHNER` INTEGER NOT NULL DEFAULT 1 UNIQUE, `ID_ANWENDER` INTEGER NOT NULL DEFAULT 1, `LIZDATEI` TEXT, `ID_MUM_PRAXIS_VERSION` INTEGER NOT NULL DEFAULT 1, `ANMERKUNG` TEXT )
Code:PDO_statement:= INSERT INTO MUM_PRAXIS ('ID_RECHNER', 'ID_ANWENDER', 'LIZDATEI', 'ID_MUM_PRAXIS_VERSION', 'ANMERKUNG') VALUES (:ID_RECHNER, :ID_ANWENDER, :LIZDATEI, :ID_MUM_PRAXIS_VERSION, :ANMERKUNG) bind:= :ID_RECHNER cdata:= 5 bind:= :ID_ANWENDER cdata:= 8 bind:= :LIZDATEI cdata:= MA22-PC-199.mumlic bind:= :ID_MUM_PRAXIS_VERSION cdata:= 3 bind:= :ANMERKUNG cdata:=
Gruß Jan
Kommentar
-
Integrity constraint violation: 19 UNIQUE constraint failed: MUM_PRAXIS.ID_RECHNER'
Das hättest du aber auch selbst raussuchen können. "UNIQUE constraint failed" in die Suchmaschine deiner Wahl und geht dahin.
The string "()()" is not palindrom but the String "())(" is.
Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
PHP.de Wissenssammlung | Kein Support per PN
Kommentar
-
Moin!
ich hatte mir das x-mal angesehen und irgendwie hätte ich darauf kommen können.
Danke aber wieder einmal.
Wenn ich eine solche Fehlermeldung bekomme die aus einem Codeblock wie diesem kommt, dann dachte ich die Fehlermeldung wird im letzten Teil ausgeben. Dann könnte ich nach einer textlichen Übereinstimmung suchen und einen deutschen Text ausgeben.
PHP-Code:// $update->execute() führt die vorbereitete Anweisung aus.
if ($create->execute()) {
$this->CreateSideContainer();
echo '<p>Die Daten wurden eingetragen.</p>';
echo "<p><a href='".strtolower($this->tabelle).".php?status=list".$this->CreateUrlLfdNr()."'>".$this->title." auflisten</a></p>\n";
echo "</div>\n";
exit;
} else {
// SQL-Fehlermeldung anzeigen.
$this->CreateSideContainer();
print_r($create->errorInfo());
echo "</div>\n";
} // endif
Wie würdet Ihr dieses implementieren?
Gruß Jan
Kommentar
-
Ich würde mit Exceptions arbeiten und nicht mit errorInfo().
Davon abgesehen haben SQL-Fehlermeldungen in der Ausgabe nichts verloren. Ein User interessiert sich nicht für irgendwelche SQL-Fehler. Außer der User ist ein Hacker, der versucht Fehler zu provozieren um sich aus den Fehlermeldungen Hintergrundwissen über die Anwendung anzueignen.
SQL-Fehler sollten am besten nur in einem Log aufscheinen. Im Falle von (ungefangenen) Exceptions landen die automatisch im PHP Error-Log.
Kommentar
-
PHP-Code:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$statement = $pdo->prepare("INSERT INTO test (id) VALUES (?)");
$statement->execute(array('2'));
} catch (\PDOException $e) {
if ($e->errorInfo[1] == 1062) {
return 'es wurde ein Wert zugewiesen, der bereits verwendet wird, aber eindeutig sein muss!';
} else {
// Logging
}
}
sorry, shift-taste kaputt
- 3 Likes
Kommentar
-
Du kannst vorher ein SELECT machen und schauen ob ein Satz mit dem Wert schon vorhanden ist.The string "()()" is not palindrom but the String "())(" is.
Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
PHP.de Wissenssammlung | Kein Support per PN
Kommentar
-
Zitat von jan99 Beitrag anzeigenKann man eigentlich irgendwie ermitteln im Vorab, ob ein Wert nicht NULL sein darf oder nur einmal vorkommen darf auf Basis der Tabellendefinition?
Als Beispiel:
Zeige alle Randbedinguen der Datenbank Test die nicht Primary als Constraint inne haben
Code:SELECT `TABLE_SCHEMA` AS Datenbank, `TABLE_NAME` AS Tabelle, `CONSTRAINT_NAME` Spalte, `CONSTRAINT_TYPE` AS Bedingung FROM `TABLE_CONSTRAINTS` WHERE `CONSTRAINT_NAME` <> 'PRIMARY' AND `TABLE_SCHEMA` = 'test'
Datenbank Tabelle Spalte Bedingung test a daten UNIQUE test countries id UNIQUE test countries code UNIQUE
Das sollte man aber auf gar keinen Fall Innerhalb der Abfragen Anwenden.
Es soll lediglich die Frage beantworten und zeigen wie es geht wenn man sich nicht besser zu helfen weiss.
Auf Grund dieser Information kann man dann seinen Code nach #27 erstellen.
Ein Export der DB zeigt aber auch die Constraints von unbekannten Tabellen.
Wenn man die DB selbst erstellt hat, sollte es zu solcher Fragestellungen ja wohl erst gar nicht kommen.
Kommentar
Kommentar