Daten löschen mit MYSQL
Wolfgang
- php
hallo,
ich bin anfänger was php angeht und versuche mich gerade an einer website.
jetzt habe ich volgendes probelm und mir fehlt einfach der ansatz.
also, ich möchte gerne einen datensatz aus einer mysql tabelle löschen. das klappt auch. nur jetzt möchte ich, dass das dazugehörige bild auch mit geschlöscht wird.
ich muss mit unlink löschen, das ist mir schon klar.
aber wie komme ich an den passenden bildnamen?
ich stehe gerade absolut auf dem schlauch und mich schon dusselig gesucht.
<?php
mysql_connect("localhost","19899m8400_5","heXagon4") or die
("Keine Verbindung moeglich");
mysql_select_db("19899m8400_5") or die
("Die Datenbank existiert nicht");
mysql_query("DELETE FROM funtstuecke WHERE id=".$_GET['id']);
?>
<?php
header("location:admin/intern.php");
?>
ich hoffe ihr könnt mir weiterhelfen.
grüsse wolfgang
Wo findet sich denn der Link zum Bild?
Ich rate jetzt einfach mal das der Link zum Bild sich im entsprechenden Datensatz befindet den du löschen willst.
Also solltest du vorher den Link auslesen und das Bild löschen, dann den Datensatz löschen.
Gruß,
Jan
Wo findet sich denn der Link zum Bild?
der datensatz wird vorher in einer anderen datei ausgewählt und über die id weitergegeben
Ich rate jetzt einfach mal das der Link zum Bild sich im entsprechenden Datensatz befindet den du löschen willst.
Also solltest du vorher den Link auslesen und das Bild löschen, dann den Datensatz löschen.
vielleicht sollte ich mal drüber schlafen. mir kommt das gerade wie ein unlösbares problem vor.
Gruß,
Jan
Wenn das drüber schlafen nicht geholfen hat:
Erzähl uns doch bitte etwas genauer wie das ganze von statten geht.
Wie wird die Datei ausgewählt?
Datei: ???.???
Wo steht jetzt die ID in der Datei?
Wohin wird die ID weitergegeben? In die Abfrage für die mySQL Tabelle?
Im Allgemeinen kann man sagen, dass du den Weg zum Link zur Datei wieder rückwärts aufschlüsseln musst.
Gruß
Frank
von da kommt das ganze:
<?
$abfrage = "SELECT img, url, id FROM funtstuecke ORDER BY tag DESC";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{ ?><li>
<div id="bild">
<img src="../img/url_img/<? echo $row->img;?>" />
<div id="links">
<a href="http://<? echo $row->url;?>">www</a> <br /><a href="#"><img src="img/bearbeiten.png" /></a> <a href="../delete.php?id=<? echo $row->id; ?>"><img src="img/delete.png" /></a>
</div>
</div>
</li><?}
?>
grüsse
wolfgang
Moin!
von da kommt das ganze:
Das ist nicht hilfreich.
Du hast die ID des Datensatzes, den du löschen willst. Super.
Aber wenn du den Datensatz hast - woher weißt du, welches Bild dazu gehört? Irgendeine logische Verknüpfung muß es da geben. Und genau diese Verknüpfung musst du vor dem Löschen des Datensatzes wieder nachvollziehen, damit du die Bilddatei kennst und löschen kannst.
Also mutmaßlich nicht nur DELETE machen, sondern vorher nochmal SELECT für den Bildnamen - sofern der sich nicht aus der ID allein schon rekonstruieren lässt.
- Sven Rautenberg
Moin!
von da kommt das ganze:
Das ist nicht hilfreich.
Du hast die ID des Datensatzes, den du löschen willst. Super.
Aber wenn du den Datensatz hast - woher weißt du, welches Bild dazu gehört? Irgendeine logische Verknüpfung muß es da geben. Und genau diese Verknüpfung musst du vor dem Löschen des Datensatzes wieder nachvollziehen, damit du die Bilddatei kennst und löschen kannst.
Also mutmaßlich nicht nur DELETE machen, sondern vorher nochmal SELECT für den Bildnamen - sofern der sich nicht aus der ID allein schon rekonstruieren lässt.
die spalte mit der jeweiligen id beherbergt auch den bildnamen. aber wie ich dran komme weiß ich nciht. also weiß ichs chon, ich kann ihn ja auslesen.
also vom sinn her:
wäre es sinnigerst in der ersten datei die img zu löschen und dann erst den datensatz. macht man das im link? oder kann man das da?
- Sven Rautenberg
Also wenn die Datei genauso heisst wie die ID, dann weisst du ja auch welche Datei du löschen musst.
Dazu benutzt den Befehl unlink(filename). Hier musst du jetzt wieder deinen Pfad angeben den du für das Bild benutzt.
unlink("img/url_img/".$_GET["id"]);
!!!!!!!!!!!!!!
Der Code sollte nicht so stehen gelassen werden, er dient nur zur Veranschauchlichung!
Wenn jemand ganz gemein ist, kann er mit dem Aufruf von
(deine URL)/delete.php?id=xyz/index.php
alles mögliche löschen.
Du solltest stattdessen bei gehen und den eintrag über die ID in der Datenbank suchen. und nur wenn du auch fündig geworden bist das ganze löschen. Alternativ kannst du auch hier wieder $row->id benutzen. Achja auch das POST ist hier keine sichere Variante, denn selbst wenn Textboxen versteckt sind können sie mit Tools wie FireBug geändert werden
!!!!!!!!!!!!!!
Du solltest vorsichtig mit unlink umgehen. Nicht das du die falsche(n) Datei(en) löscht!
!!!!!!!!!!!!!!
Gruß
Frank
Also wenn die Datei genauso heisst wie die ID, dann weisst du ja auch welche Datei du löschen musst.
nee, die datei heißt nicht so wie die id. ich dachte nur das ich über die id an den passenden namen komme.
Dazu benutzt den Befehl unlink(filename). Hier musst du jetzt wieder deinen Pfad angeben den du für das Bild benutzt.
unlink("img/url_img/".$_GET["id"]);
>
> wie kann ich das ganze denn sicherer machen?
grüsse
Wolfgang
Sorry. Hatte mich vertan:
Du benutzt $row->img also musst du das natürlich auch benutzten. Dafür musst du vorher mit
$abfrage = "SELECT * FROM funtstuecke WHERE ID='.mysql_real_escape_string($_GET["id"]).' LIMIT 1";
$ergebnis = mysql_query($abfrage);
einen Datebankabruf starten. Damit kommst du jetzt auch an den Bildnamen und kannst anschließend mittels:
unlink("img/url_img/".$row->img);
die Datei löschen. Wenn du das abgeschlossen hast, löscht die wie gewohnt den Datenbankeintrag.
Gruß
Frank
Sorry. Hatte mich vertan:
Du benutzt $row->img also musst du das natürlich auch benutzten. Dafür musst du vorher mit
$abfrage = "SELECT * FROM funtstuecke WHERE ID='.mysql_real_escape_string($_GET["id"]).' LIMIT 1";
$ergebnis = mysql_query($abfrage);
> einen Datebankabruf starten. Damit kommst du jetzt auch an den Bildnamen und kannst anschließend mittels:
> ~~~php
> unlink("img/url_img/".$row->img);
>
die Datei löschen. Wenn du das abgeschlossen hast, löscht die wie gewohnt den Datenbankeintrag.
sorry, ich stehe glaube ich gerade ein bisschen auf dem schlach. wo muss ich das denn jetzt einpflegen?
ich die delete.php?
grüße
wolfgang
ich hab jetzt folgendes mit in die delete.php eingefügt:
$abfrage = "SELECT * FROM funtstuecke WHERE ID='.mysql_real_escape_string($_GET["id"]).' LIMIT 1";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
unlink("img/url_img/".$row->img);
}
aber es funktioniert leider nicht :-(
Deine Verzeichnisstruktur ist folgende?
.../
/delete.php
/abc
/def.php
/img
/url_img
/xyz.png // irgend ein Bild
den Ordner abc vermute ich weil du "../delete.php" aufrufst. Das gleiche machst du ja auch bei den Bildern. "def.php" ist nur ein angenommener Name ich hab keine Ahnung wie du deine Abfrage-Datei genannt hast. "xyz.png" kann auch "xyz.gif" oder sowas sein ist aber ein Bild das existiert und auch genau so in der Datenbank steht?
Hast du die "delete.php" direkt aufgerufen oder über deine "def.php"? Wenn du sie direkt aufgerufen hast: hast du die ID mit angegeben? ("http://.../delete.php?id=4" oder so) ?
Gruß
Frank
du hast recht, da ist noch ein ordner zwischen.
also ich hab die datei mit id aufgerufen.
die url lautet: delete.php?id=77
also irgendein fehler muss noch drin sein, da mir nichts angezeigt wird.
mysql_query("DELETE FROM funtstuecke WHERE id=".$_GET['id']);
$abfrage = "SELECT * FROM funtstuecke WHERE ID='.mysql_real_escape_string($_GET["id"]).' LIMIT 1";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
unlink("img/url_img/".$row->img);
}
viele grüße
wolfgang
Es werden auch keine Ausgaben erzeugt. Wird die Datei denn gelöscht? Oder ist sie weiterhin vorhanden?
Die Anzeige kannst du dann mittels:
include("/abs/def.php");
wieder bekommen.
Du musst natürlich auch den Datenbank-Eintrag mittels DELETE löschen sonst sind Ordnerinhalt und Datenbank nicht mehr synchron!
nee ich weiß das nichts erzeugt wird.
hab aber eine weiterleitung zu einer seite. und die datei ist auch noch da :-(
ich muss jetzt erstmal zur arbeit.
aber schonmal danke.
grüße
wolfgang
Hallo Wolfgang,
mysql_query("DELETE FROM funtstuecke WHERE id=".$_GET['id']);
Du musst *unbedingt* auch hier $_GET['id'] entschärfen, sonst hängt dir einer noch ein » OR 1« dran und deine komplette Tabelle ist leer - außerdem darfst du den Datensatz natürlich nicht löschen bevor du abgefragt hast wo das Bild liegt.
$abfrage = "SELECT * FROM funtstuecke WHERE ID='.mysql_real_escape_string($_GET["id"]).' LIMIT 1";
Zum einen reicht es wenn du nur die benötigte Spalte (»img« statt »*« abfragst, und zum anderen enthält der Code einen Syntaxfehler - schau dir die Anführungszeichen nochmal genau an.
$ergebnis = mysql_query($abfrage);
Wo ist die Fehlerbehandlung?
while($row = mysql_fetch_object($ergebnis))
Was finden nur alle an mysql_fetch_object()? mysql_fetch_assoc() finde ich praktischer ... Außerdem brauchst du keine while-Schleife, die Abfrage liefert ohnehin nur einen Datensatz.
Gruß,
Tobias
hallo,
danke erstmal für die tipps. habs verscuht umzusetzen.
jetzt wird das skript zumindest wieder bis auf das löschen der datei durchgeführt.
hier der aktuelle code:
mysql_query("DELETE FROM funtstuecke WHERE id=".$_GET['id']);
$abfrage = 'SELECT img FROM funtstuecke WHERE ID=".mysql_real_escape_string($_GET["id"])." LIMIT 1';
$ergebnis = mysql_query($abfrage);
{
unlink("img/url_img/".$row->img);
}
?>
<?php
header("location:admin/intern.php");
?>
wie kann ich das GET denn entschärfen?
viele grüße
Wolfgang
Hallo
danke erstmal für die tipps. habs verscuht umzusetzen.
jetzt wird das skript zumindest wieder bis auf das löschen der datei durchgeführt.
hier der aktuelle code:
mysql_query("DELETE FROM funtstuecke WHERE id=".$_GET['id']);
$abfrage = 'SELECT img FROM funtstuecke WHERE ID=".mysql_real_escape_string($_GET["id"])." LIMIT 1';
$ergebnis = mysql_query($abfrage);{
unlink("img/url_img/".$row->img);
}
Warum erwartest du, den Namen des Bildes auslesen zu können, wenn du \*vorher\* den Datensatz, in dem der Name des Bildes steht, gelöscht hast? Nochmal (es wurde ja schon mehrfach gesagt): Lese den Dateinamen des Bildes \*als erstes\* aus der Tabelle.
Wenn's nach mir ginge würde der weitere Ablauf so aussehen: Du hast den Bildnamen in einer Variable, nun löschst du den Datensatz aus der DB, prüfst, ob das geklappt hat und löschst nun als letztes das zum Datensatz gehörige Bild (Name in der Variable).
Übrigens, kannst du, um den Heckmeck mit den Verzeichnistiefen zu umgehen, mit den absoluten Pfaden im Dateisystem des Servers arbeiten. $\_SERVER["DOCUMENT\_ROOT"] liefert dir den Pfad zum Wurzelverzeichnis deiner Domain. Steht in der Datenbank der vollständige Pfad \*innerhalb\* der Domain, kannst du beide Angaben kombinieren und landest von überall in der Domain bei der richtigen Datei.
Beispiel:
~~~php
// absoluter Pfad zum Wurzelverzeichnis der Domain
$_SERVER["DOCUMENT_ROOT"] = "/var/www/html/domainname";
// Pfad zu einer Datei, wie er in der DB eingetragen wird
$bild = "/grafik/fotos/foto34.jpg";
// Diese Notation ist auch bei der Angabe als Source im <img> von Vorteil,
// da auch im HTTP-Bereich somit das Anpassen der verzeichnistiefen wegfällt.
$ganzer_pfad = $_SERVER["DOCUMENT_ROOT"].$bild;
// ergibt: /var/www/html/domainname/grafik/fotos/foto34.jpg
?>
<?php
header("location:admin/intern.php");?>
Das Schließen und wieder Öffnen der PHP-Blöcke dürfte die Headeranweisung entschärfen (Meldung: "[... Headers already sent ...](http://www.google.de/search?hl=de&q=Headers+already+sent)"). Irgendein Zeichen, das an den Browser gesendet wird, bedingt, dass die Sendemöglichkeit für Header abgeschlossen ist. Zudem muss ein Locationheader eine \*vollständige URI\* enthalten. Das heißt, der Header müsste so notiert werden: "location:http://example.com/admin/intern.php".
> wie kann ich das GET denn entschärfen?
Prüfe vor der Benutzung, ob $\_GET['id'] eine Integerzahl ist ([is_int](http://de3.php.net/is_int)).
Tschö, Auge
--
Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
Terry Pratchett, "Wachen! Wachen!"
[Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
Hi,
also irgendein fehler muss noch drin sein, da mir nichts angezeigt wird.
Dann *lerne* bitte mal, zu debuggen!
Als erstes stellst du bitte das error_reporting auf E_ALL und display_errors auf on, sofern das nicht schon so konfiguriert bist.
(Wenn dir das nichts sagt, dann informiere dich bitte.)
Und dann machst du mal Kontrollausgaben, um zu überprüfen, ob die Variablen in deinem Scriptverlauf auch die Inhalte haben, die du annimmst.
Und wenn du das gemacht hast, dann melde dich bitte mit einer detailierten Beschreibung des Ergebnisses (was hast du wo gemacht, was kam heraus) wieder hier.
MfG ChrisB