Frage von SoOn1, 79

MySQL DELETE funktioniert nicht?

Hallo,

hab Probleme mit dem Delete hier. Und zwar gibt es eine Tabelle "wartungsfenster" in der der Eintrag WID als AI steht.

Auf Buttondruck soll jetzt ein Datensatz mit einer variablen ID gelöscht werden. Leider löscht er nichts. Könnt ihr mir helfen?

if(isset($_POST["txtdel"])) { $del = "DELETE FROM wartungsfenster WHERE WID='.$WID.'"; echo $WID; }

Antwort
von Suboptimierer, 27

Leg zum Testen den SQL-Befehl ohne Variablen fest. Es kann sein, dass du kein Löschrecht hast.

Dabei fällt mir ein, dass eine Fehlermeldung oftmals nützlich für Problemanalysen ist.

Kommentar von SoOn1 ,

if(isset($_POST["txtdel"]))
{
$del = "DELETE FROM wartungsfenster WHERE WID='.8.'";

if($del == true)
{
echo "Löschung erfolgreich";
}
else
{
echo "Löschung fehlerhaft";
}

Gibt mir aus Löschung erfolgreich, jedoch tut sich nichts in der DB

Kommentar von Suboptimierer ,

In $del steht eine Zeichenkette. Du musst noch eine Datenbankverbindung aufbauen und den Befehl gegen die Datenbank absetzen.

Kommentar von SoOn1 ,

Verbindung steht weiter oben,

$verbindung = mysql_connect("localhost", "****", "****")
or die ("Fehler im System");

mysql_select_db("infoserver")
or die ("Verbindung zur Datenbank nicht möglich...");

Kommentar von mastema666 ,

1.: Die id ist wahrscheinlich 8 und nicht .8. oder? (die Punkte sind nur bei Variablen nötig, wie du sie hier genutzt hast wird halt nach einer id (WID) mit dem Wert ".8." gesucht, den es nicht geben dürfte).

2.: Das Query müsste, mit den korrekten Punkten etc,  so aussehen:

"DELETE FROM wartungsfenster WHERE WID = '". $WID ."'";

3.: Du führst das Query ganz offensichtlich ja gar nicht aus, du erzeugst hier nur eine Variable "$del", die das Query enthält, mehr nicht.

4.: mysql_* ist veraltet und wird in zukünftigen PHP Versionen nicht mehr unterstützt, nutze besser PDO oder mysqli.

Kommentar von SoOn1 ,

Zu 2 und 3.: Vielen Dank, funktioniert jetzt. :)

4.: Ja habe schon drüber gelesen, aber so bekommen wir das ganze in der Schule beigebracht.

Kommentar von SoOn1 ,

Ok irgentwo hab ich noch einen Bockmist geschossen,

sofern ich auf löschen drücken, löscht er 2 Datensätze, bei Seitenaktuallierung immer 1

Kommentar von mastema666 ,

Wenn du nach einem POST die Seite aktualisierst, dann wird dieser standardmäßig auch noch einmal abgesendet, ist also das gleiche als wenn du noch mal den Button zum Absenden klickst.

So lange du noch testest könntest du dir, um sicher zu gehen, am Anfang der Datei mittels 

var_dump($_POST);

anzeigen lassen, was du ggf (auch durch reload z.B.) per POST übermittelt hast.

Oder werden auch beim einmaligen Absenden direkt 2 Datensätze gelöscht? Das Feld "WID" sollte ja unique (bzw wahrscheinlich primary) sein, also wenn nur eine "$WID" übergeben wird, sollte auch nur ein Datensatz gelöscht werden. Lass dir vielleicht auch $del mal ausgeben wenn das Query ausgeführt wird, dann siehst du zumindest ob da was falsches drin steht. (Oder poste hier, bzw besser hastebin.com oder so, mal den kompletten Code, das Problem kann ja auch an etwas liegen, was du hier noch gar nicht gepostet hast).

BTW: Für den Lehrer, der euch so was beibringt: Setzen, 6 ;)
(Ok, unserer damals war nicht viel besser, der "Informatikleher" war  da eigentlich ein Mathelehrer, der "mal ein HTML Tutorial gelesen hat" so in der Art^^)

Kommentar von SoOn1 ,

http://hastebin.com/ukanedohej.xml

Er löscht sowohl bei Druck des Buttons, als auch bei Neuladen der Seite jeweils 1 Eintrag.

Kommentar von mastema666 ,

Was mir da zunächst auffällt, du hast vergessen, die korrekte $WID zu übergeben, du liest die zwar aus der DB aus und zeigst sie in der Tabelle an, aber das Formular sendet nur den Wert des Submit-Buttons ab, welche WID gelöscht werden soll wird also nirgends festgelegt, da die Variable $WID bei jedem Durchlauf der Schleife gesetzt wird, dürfte da auf jeden Fall schon mal immer der letzte Eintrag gelöscht werden und nicht der, der in der Zeile steht, in der man den Button drückt.

Außerdem müsstest du, damit das funktionieren kann, das ganze Formular innerhalb der Schleife öffnen und schließen, nicht außerhalb.

Das Problem mit dem Löschen der 2 Datensätze dürfte die Nutzung von "header("Refresh:0");" sein, das bewirkt ein neu laden der Seite, wundert mich eher, dass da nicht noch mehr gelöscht / öfter reloaded wird. Lieber einen redirect auf sich selbst nutzen, hat den gleichen Effekt, aber der POST wird nicht nochmal gesendet.

Ich hab das mal eben bisl angepasst: http://hastebin.com/ifabinoruq.php

Kommentar von SoOn1 ,

Wow, ich danke dir!

Hast mir sehr weitergeholfen :)

Antwort
von mastema666, 19

Woher kommt denn die Variable $WID ? Ist die auch sicher gesetzt? Kann man aus deinem Codeschnipsel leider nicht erkennen.

Und was passiert denn genau? Also du hast da ja noch ein "echo $WID;", wird das denn ausgegeben? Bzw führst du das Query überhaupt aus? Auch das fehlt ja bei dem von dir geposteten Code.

Am besten mal sämtlichen relevanten Code posten, ggf auf hastebin.com oder so, GF hat damit ja schonmal so gewisse Probleme ;)

Kommentar von SoOn1 ,

Auch danke an dich für deine Hilfe.

Antwort
von wotan38, 4

Wenn es am DELETE liegt, gibt es eine Fehlermeldung, wo drin steht, warum nicht gelöscht werden kann. Kommt keine Fehlermeldung, dann liegt das Problem woanders. Dann kommt Deine Anweisung vielleicht bei der Datenbank gar nicht an.

Antwort
von Xpomul, 30

was gibt ein manuell abgesetzer select-befehl aus? Existiert denn ein solcher Datensatz noch?

Kommentar von SoOn1 ,

Datensätze existieren noch,

sofern ich "DELETE FROM wartungsfenster WHERE WID='.8.'"

Nur ohne " . und ' über SQL in der Datenbank manuell ausführe erfolgt die Löschung auch

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten