DELETE - Anfrage geht immer schief...
Constantin Kiesling
- php
Hallo liebe Leute!
Ich hab ein Problem und wäre über Lösungsvorschläge wirklich sehr froh!
Ich kreiere gerade eine Lehrerbewertungsseite für unsere Schule und da benutze ich u.A. eine Tabelle, in der alle Lehrer gespeichert werden. Damit ich leicht Lehrer hinzufügen bzw. löschen kann, habe ich einen kleinen "Admin Panel" erstellt - Und genau hier gibt es immer einen Fehler, wenn ich einen Lehrer-Datensatz mittels "DELETE" Anfrage löschen will. Hier ist das Script (vorher wird von einem Formular der name des Lehrers gesendet, aufgrund dessen dann die richtige Zeile gelöscht werden kann):
<?php
if ($loeschen[name]) {
/*-----Variablen zur Datenbakanbindung-----*/
$host = "localhost";
$user = "lifelehrer_fr";
$passwort = "";
$dbname = "lifelehrer_db";
$tabellenname = "lehrer";
/*-----Datenbankverbindung und -auswahl-----*/
$link = mysql_connect ($host, $user, $passwort);
mysql_select_db ($dbname, $link);
/*-----Datenabkanfrage-----*/
$query = "DELETE FROM $tabellenname WHERE (name=$loeschen[name]) LIMIT 1";
if (mysql_query ($query, $link)) {
print ("Der/Die LehrerIn $loeschen[name] wurde
gelöscht.<br><br>\n");
print ("<a href="index.php">Admin Panel</a>\n");
} else {
print ("Fehler in der Datenbankanfrage\n");
}
/*-----Schliessen der DB Verbindung-----*/
mysql_close ($link);
} else {
print ("Es müssen alle Felder ausgefüllt werden!
(Evtl. Kein Lehrer in der Database)<br><br>\n");
print ("<a href="javascript:history.back()">Zurück</a>\n");
}
?>
Ah... sorry, ich hab ncoh was vergessen: Bei mir kommt immer die Ausgabe "Fehler in der Datenbankanfrage", die ich für den Fall eines Fehlers geschrieben habe. Nochmals das Script...
<?php
if ($loeschen[name]) {
/*-----Variablen zur Datenbakanbindung-----*/
$host = "localhost";
$user = "lifelehrer_fr";
$passwort = "";
$dbname = "lifelehrer_db";
$tabellenname = "lehrer";
/*-----Datenbankverbindung und -auswahl-----*/
$link = mysql_connect ($host, $user, $passwort);
mysql_select_db ($dbname, $link);
/*-----Datenabkanfrage-----*/
$query = "DELETE FROM $tabellenname WHERE (name=$loeschen[name]) LIMIT 1";
if (mysql_query ($query, $link)) {
print ("Der/Die LehrerIn $loeschen[name] wurde gelöscht.<br><br>\n");
print ("<a href="index.php">Admin Panel</a>\n");
} else {
print ("Fehler in der Datenbankanfrage\n");
}
/*-----Schliessen der DB Verbindung-----*/
mysql_close ($link);
} else {
print ("Es müssen alle Felder ausgefüllt werden! (Evtl. Kein Lehrer in der Database)<br><br>\n");
print ("<a href="javascript:history.back()">Zurück</a>\n");
}
?>
MfG
Consti
Wie wärs' damit:?
mysql_connect ($host, $user, $passwort);
mysql_select_db ($dbname, $link);
/*-----Datenabkanfrage-----*/
$query = "...";
if (mysql_query ($query)
Hi Constantin!
"DELETE FROM $tabellenname WHERE (name=$loeschen[name]) LIMIT 1";
Ist $loeschen[name] ein Array? Wenn nicht, dann solltest du die eckigen Klammern weglassen, bzw. ["name"] schreiben.
Der Wert, der in die Datenbank eingetragen wird, sollte in einfachen Anführungszeichen stehen, z.B.:
"DELETE FROM $tabellenname WHERE name='$loeschen' LIMIT 1";
Gruß aus München,
Fabian
Hailow,
"DELETE FROM $tabellenname WHERE (name=$loeschen[name]) LIMIT 1";
Ist $loeschen[name] ein Array? Wenn nicht, dann solltest du die eckigen Klammern weglassen, bzw. ["name"] schreiben.
Außerdem kann man im SQL-String keine Doppelreferenzen auflösen. Dann muss man den Arraywert irgendwie aus dem String ausklammern {$loeschen["name"]} oder durch auspunkten
"DELETE FROM $tabellenname WHERE (name=".$loeschen["name"].") LIMIT 1";
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi!
"DELETE FROM $tabellenname WHERE name='$loeschen' LIMIT 1";
Ich habs jetzt auf deinen Tip hin so probiert:
... WHERE name='$loeschen[name]' LIMIT 1";
...und siehe da, es geht!
Danke an dich un auch an alle anderen Helfer!
MfG
Hallo,
... WHERE name='$loeschen[name]' LIMIT 1";
das ist aber immer noch falsch. Wenn name mal irgendwann Funktion, Konstante, Sprachkonstrukt oder ähnliches wird, dann knallt es.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi!
Nungut, meine da ich ein ordentliches Script will, muss ich einfach nochmal schreiben! =)
Meine Lösung sieht also so aus:
"DELETE FROM $tabellenname WHERE name='$loeschen[name]' LIMIT 1";
Deine so:
"DELETE FROM $tabellenname WHERE (name="{$loeschen["name"]}") LIMIT 1";
bzw.
"DELETE FROM $tabellenname WHERE (name=".$loeschen["name"].") LIMIT 1";
Jetzt verstehe ich eins nicht: Die Anführungszeichen im Arraywert müssen doch im Script "verwirrend" wirken...! Oder wird die Verwirrung durch die Klammern bzw. Punkte verhindert? Wenn ja, sind Punkte oder Klammern besser? Ich würde mich nochmals über eine Antwort von dir freuen!
Thy schon im voraus,
lG, Consti
Moin!
Nungut, meine da ich ein ordentliches Script will, muss ich einfach nochmal schreiben! =)
Meine Lösung sieht also so aus:
"DELETE FROM $tabellenname WHERE name='$loeschen[name]' LIMIT 1";
Die ist wunderbar.
Deine so:
"DELETE FROM $tabellenname WHERE (name="{$loeschen["name"]}") LIMIT 1";
Das von dir richtig erkannte Problem dieser Lösung ist, dass sie eine Fehlermeldung liefern dürfte.
bzw.
"DELETE FROM $tabellenname WHERE (name=".$loeschen["name"].") LIMIT 1";
Das Problem dieser Lösung ist, dass im entstehenden SQL-String um den String, der den Namen bildet, keine Anführungsstriche stehen, so dass die Datenbank damit Probleme haben könnte.
Jetzt verstehe ich eins nicht: Die Anführungszeichen im Arraywert müssen doch im Script "verwirrend" wirken...! Oder wird die Verwirrung durch die Klammern bzw. Punkte verhindert? Wenn ja, sind Punkte oder Klammern besser? Ich würde mich nochmals über eine Antwort von dir freuen!
Stell dir das zu erzeugende Ergebnis mal vor:
DELETE FROM dietabelle WHERE name='dername' LIMIT 1
Das soll erzeugt werden. Die Variablen darin sind:
$tabellenname = "dietabelle";
$loeschen['name'] = "dername";
Mit der Anweisung:
$sqlquery = "DELETE FROM dietabelle WHERE name='dername' LIMIT 1";
hast du der Variablen $sqlquery diesen String zugeordnet.
Nebenbei bemerkt: Einfache Anführungsstriche im SQL-String zur Stringbegrenzung vertragen sich wunderbar mit den doppelten Anführungsstrichen, die den PHP-String begrenzen.
In diesem String kannst du nun ein paar Ersetzungen machen, um ihn variabel zu gestalten. dietabelle wird durch $tabellenname ersetzt, und dername durch $loeschen['name'].
$sqlquery = "DELETE FROM $tabellenname WHERE name='$loeschen['name']' LIMIT 1";
Weil es mit Arrayvariablen innerhalb von Strings immer mal wieder (so genau hab ich das auch noch nicht herausgefunden, wann das der Fall ist) Probleme gibt, ist es sehr sinnvoll, sie in geschweifte Klammern einzuschließen, um auf Nummer Sicher zu gehen:
$sqlquery = "DELETE FROM $tabellenname WHERE name='{$loeschen['name']}' LIMIT 1";
Alternativ kann man den String auch aus Einzelstücken zusammensetzen - der Verkettungsoperator ist der Punkt:
$sqlquery = "DELETE FROM $tabellenname WHERE name='".$loeschen['name']."' LIMIT 1";
Ich bevorzuge mittlerweile die geschweiften Klammern.
- Sven Rautenberg
Hallo Sven,
$sqlquery = "DELETE FROM $tabellenname WHERE name='{$loeschen['name']}' LIMIT 1";
Das hst Du wunderbar erklärt *schulterklopf*
Brauchst Du jetzt einen neuen Kasten mit Buntstiften[tm]? Da Antje ja verschollen zu sein scheint, darfst Du Dich dann vertrauensvoll an mich wenden.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo,
runde Klammern helfen da nicht, da muss man geschweifte nehmen.
Liebe Grüße aus http://www.braunschweig.de
Tom