Sarah: Eintrag aus DB löschen

Guten Morgen alle zusammen,
ich habe folgende Frage:

Auf meiner PHP Seite werden Daten aus meiner Datenbank geladen. Nun sollte man die Möglichkeit haben diese Datensätze über meinen php Screen  auch wieder zu löschen. Habe mir das so vorgestellt. Man klickt auf ein kleines Bild und mit dem Klick wird der Eintrag aus der Datenbank gelöscht.

Könnte mir jemand dabei helfen.

Vielen lieben Dank
Sarah

  1. Hi,

    Könnte mir jemand dabei helfen.

    Ja, du machst um das bild einen link auf dein script welches den
    Datensatz löscht, wichtig dabei ist das jeder Datensatz eine eindeutige
    ID hat und du diese mit "?id=..." übergibst, du kannst dann mit
    $_GET['id'] darauf zugreifen

    MfG

    1. Okej mein problem ist nur ich weiß nicht auf welche seite ich verweisen soll. Da er den Eintrag ja nur löschen soll und somit auf der seite bleiben soll.

      Dachte ich könnte mir irgendwie ein:
      DELETE FROM 'dynamic' Where 'ID' =' ' Limit 1

      in meinen Link bastel geht das und wenn ja wie?

      Vielen Dank
      Sarah

      1. Hi,

        Dachte ich könnte mir irgendwie ein:
        DELETE FROM 'dynamic' Where 'ID' =' ' Limit 1

        in meinen Link bastel geht das und wenn ja wie?

        AFAIK nein. aber du könntest auf dein löschscript wie von mir beschrieben verweisen das sieht dann so aus:

          
        <?  
        $aufrufende_seite = $_SERVER['HTTP_REFERER'];  
        $id = $_GET['id'];  
        $sql = "DELETE FROM 'dynamic' Where 'ID'='$id' Limit 1";  
        mysql_query($sql);  
        header("Location: $aufrufende_seite");  
        ?>  
        
        

        musst natürlich noch ne eingabe prüfung machen usw.

        MfG

        1. Hi,

          AFAIK nein. aber du könntest auf dein löschscript wie von mir beschrieben verweisen

          welches dann in etwa so aussieht:

          <?
          $aufrufende_seite = $_SERVER['HTTP_REFERER'];
          $id = $_GET['id'];
          $sql = "DELETE FROM 'dynamic' Where 'ID'='$id' Limit 1";
          mysql_query($sql);
          header("Location: $aufrufende_seite");

          ^^^^ Dadurch wird auf die seite zurück geleitet.

          ?>

          
          >   
          > musst natürlich noch ne eingabe prüfung machen usw.  
            
            
          MfG
          
          1. Okej super damit kann ich was anfangen
            meinst du mit Eingabeüberprüfung das Abfragen der ID's
            Nochmals Danke
            Sarah

            1. Hi,

              meinst du mit Eingabeüberprüfung das Abfragen der ID's

              unter anderem ja, sprich wenn die ID's alles nummern sind könntest du
              noch ein is_numeric() machen, dadurch wärst du dann auch gleich noch
              gegen injections geschützt. außerdem solltest du natürlich auch noch
              schauen wär das aufruft, ob der überhaupt das recht hat Datensätzte zu
              löschen etc. jede mögliche Sicherheitslücke welche dir einfällt nunmal
              schließen.

              MfG

              1. Ja okej also um Sicherheit wird es hier erstmal nicht gehen. Da es nur
                lokal angewand wird. Ich versuche jetzt mal mein Glück.
                Vielen Dank
                Sarah

          2. Hallo Daniel,

            $aufrufende_seite = $_SERVER['HTTP_REFERER'];
            header("Location: $aufrufende_seite");

            Der Referer ist absolut ungeeignet dazu den Benutzer irgendwohin weiterzuleiten - er kann von garnichts über eine beliebige URL bist zu schädlichem Code alles enthalten.

            $id = $_GET['id'];
            $sql = "DELETE FROM 'dynamic' Where 'ID'='$id' Limit 1";

            baue *nie* und unter *keinen* Umständen Daten die vom User kommen ungeprüft in deinen Query ein! Außerdem wird dieser Query vermutlich nicht funktionieren, da du nicht die Spalte ID sondern den String 'ID' mit dem Wert aus $id vergleichst ...

            Grüße aus Nürnberg
            Tobias

            1. Hi,

              Der Referer ist absolut ungeeignet dazu den Benutzer irgendwohin weiterzuleiten - er kann von garnichts über eine beliebige URL bist zu schädlichem Code alles enthalten.

              Wie gesagt eine eingabe üeberprüfung noch einbauen.

              $id = $_GET['id'];
              $sql = "DELETE FROM 'dynamic' Where 'ID'='$id' Limit 1";
              baue *nie* und unter *keinen* Umständen Daten die vom User kommen ungeprüft in deinen Query ein!

              s.o.

              Außerdem wird dieser Query vermutlich nicht funktionieren, da du nicht die Spalte ID sondern den String 'ID' mit dem Wert aus $id vergleichst

              oh, ups. naja das kommt davon wenn man zu faul ist selber zu schreiben und strg+c strg+v benutzt.

              MfG

        2. Hi!

          AFAIK nein. aber du könntest auf dein löschscript wie von mir beschrieben verweisen das sieht dann so aus:

          Klar geht das! Hierfür könnte man beispielsweise ein Affenformular einsetzen, welches die Daten an sich selbst verschickt oder eben einen Link verwenden, der auf die gleiche Seite verweist, nur das eben im Query-String die ID des Datensatzes steht.
          Das Beispiel für den Link würde dann z.B. so aussehen:

          HTML-Teil von seite.php:

            
          <p>Datensatz 1: <a href="<?php echo $_SERVER['PHP_SELF'] ?>?action=delete&amp;id=1">Löschen</a></p>  
          <p>Datensatz 2:  <a href="<?php echo $_SERVER['PHP_SELF'] ?>?action=delete&amp;id=2">Löschen</a></p>  
          ...  
          
          

          PHP-Teil von seite.php:

            
          ...  
          if(isset($_GET['action'] && $_GET['action'] == 'delete' &&  
             isset($_GET['id'] && is_numeric($_GET['id'])) {  
            
              $sql = "DELETE FROM dynamic WHERE id = ".intval($_GET['id'])." LIMIT 1";  
              if(mysql_query($sql) OR die(mysql_error())) {  
                  echo 'Datensatz erfolgreich gelöscht';  
              }  
          }  
          ...  
          
          

          <?
          $aufrufende_seite = $_SERVER['HTTP_REFERER'];
          $id = $_GET['id'];
          $sql = "DELETE FROM 'dynamic' Where 'ID'='$id' Limit 1";
          mysql_query($sql);
          header("Location: $aufrufende_seite");
          ?>

            
          Diese Lösung ist schlecht, weil  
            
          a) du dich auf das Vorhandensein von $\_SERVER[HTTP\_REFERER'] verlässt, was nicht jeder Browser mitschickt bzw. durch einen Proxy oder Firewall oftmals überschrieben wird mit so sinnvollen Werten wie «111111111111», etc.  
          b) bei dir «short\_open\_tag» auf On stehen muss, was aufgrund der Portabilität vermieden werden sollte.  
            
          Grüße,  
          Fabian St.
          
          -- 
          Selfcode: [ie:{ fl:( br:> va:) ls:\[ fo:) rl:( n4:( ss:) de:> js:| ch:? mo:) zu:)](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%28+ss%3A%29+de%3A%3E+js%3A%7C+ch%3A%3F+mo%3A%29+zu%3A%29)
          
          1. Vielen Dank für deine Mühe, ich sehe nur einen Haken ander sache in deinem HTML Link schreibst du:

            <p>Datensatz 1: <a href="<?php echo $_SERVER['PHP_SELF'] ?>?action=delete&amp;id=1">Löschen</a></p>

            Du gehst also davon aus das sie ID=1 ist das weiß ich leider nicht. Wenn der Kunde zuvor Mehrere Datensätze gelöscht hat und wieder eingefügt hat kann diese auch 40 oder 65 sein. Das ist eben das blöde an der sache es muss alles voll dynamisch sein.

            Kann ich das irgendwie ändern so gefällt mir dein Vorschlag echt supet
            Vielen Dank
            Sarah

            1. hi,

              Vielen Dank für deine Mühe, ich sehe nur einen Haken ander sache in deinem HTML Link schreibst du:

              <p>Datensatz 1: <a href="<?php echo $_SERVER['PHP_SELF'] ?>?action=delete&amp;id=1">Löschen</a></p>

              Du gehst also davon aus das sie ID=1 ist das weiß ich leider nicht. Wenn der Kunde zuvor Mehrere Datensätze gelöscht hat und wieder eingefügt hat kann diese auch 40 oder 65 sein. Das ist eben das blöde an der sache es muss alles voll dynamisch sein.

              ja dann mach es doch einfach dynamisch ...?

              niemand zwingt dich, die 1 dort fest im code stehen zu haben, die kannst du genausogut durch eine geeignete variable ersetzen.

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
            2. Hi,

              <p>Datensatz 1: <a href="<?php echo $_SERVER['PHP_SELF'] ?>?action=delete&amp;id=1">Löschen</a></p>

              Sarah mach doch die augen auf:

              <p>Datensatz 1: ... ?action=delete&amp;id=1">Löschen</a></p>
                           ^^                          ^^

              aber anstatt "&amp;" würde ich eher "&" verwenden.

              MfG

              1. Hi!

                <p>Datensatz 1: <a href="<?php echo $_SERVER['PHP_SELF'] ?>?action=delete&amp;id=1">Löschen</a></p>

                Sarah mach doch die augen auf:

                <p>Datensatz 1: ... ?action=delete&amp;id=1">Löschen</a></p>

                Was soll ihr das weiterhelfen?

                aber anstatt "&amp;" würde ich eher "&" verwenden.

                Nein, da dies zu einem Fehler führen würde, wenn man den HTML-Code validiert. «&» muss durch das entsprechende Entity ersetzt werden.

                Grüße,
                Fabian St.

                1. Hi,

                  Nein, da dies zu einem Fehler führen würde, wenn man den HTML-Code validiert. «&» muss durch das entsprechende Entity ersetzt werden.

                  ich hege zweifel daran das der link dann genauso funktioniert.
                  Allerdings verwundert es mich da dann das mein Editor ü, ö, ä und ß
                  ersetzt aber das & nicht.

                  MfG

                  1. hi,

                    Nein, da dies zu einem Fehler führen würde, wenn man den HTML-Code validiert. «&» muss durch das entsprechende Entity ersetzt werden.

                    ich hege zweifel daran das der link dann genauso funktioniert.

                    unberechtigt.

                    gruß,
                    wahsaga

                    --
                    /voodoo.css:
                    #GeorgeWBush { position:absolute; bottom:-6ft; }
                    1. Hi,

                      Nein, da dies zu einem Fehler führen würde, wenn man den HTML-Code validiert. «&» muss durch das entsprechende Entity ersetzt werden.
                      ich hege zweifel daran das der link dann genauso funktioniert.
                      unberechtigt.

                      Wenn du das sagst wahsaga dann wirds wohl stimmen. werde das bei
                      nächsten projekt ausprobieren und ggf. dann bei folgenden verwenden.
                      Schließlich wollen wir doch alle validen-code. die sprache ist doch
                      egal.

                      MfG

            3. Hi!

              <p>Datensatz 1: <a href="<?php echo $_SERVER['PHP_SELF'] ?>?action=delete&amp;id=1">Löschen</a></p>

              Du gehst also davon aus das sie ID=1 ist das weiß ich leider nicht. Wenn der Kunde zuvor Mehrere Datensätze gelöscht hat und wieder eingefügt hat kann diese auch 40 oder 65 sein. Das ist eben das blöde an der sache es muss alles voll dynamisch sein.

              Die «1» war auch nur als Beispiel gedacht - natürlich ließe sich das auch automatisieren, indem du zuerst eine SQL-Abfrage machst, welche IDs denn existieren und diese dann in einer Schleife durchläufst:

                
              $sql = "SELECT id FROM dynamic";  
              $res = mysql_query($sql) OR die(mysql_error());  
              while(($row = mysql_fetch_assoc($res)) !== FALSE) {  
                  echo '<p> Datensatz '.$row['id'].'<a href="'.$_SERVER['PHP_SELF'].'?action=delete&amp;id='.$row['id'].'">Löschen</a></p>'."\n";  
              }  
              
              

              Grüße,
              Fabian St.

              1. Hi,

                Die «1» war auch nur als Beispiel gedacht - natürlich ließe sich das auch automatisieren, indem du zuerst eine SQL-Abfrage machst, welche IDs denn existieren und diese dann in einer Schleife durchläufst:

                *fg*

                  
                
                > $sql = "SELECT id FROM dynamic";  
                > $res = mysql_query($sql) OR die(mysql_error());  
                > while(($row = mysql_fetch_assoc($res)) !== FALSE) {  
                >     echo '<p> Datensatz '.$row['id'].'<a href="'.$_SERVER['PHP_SELF'].'?action=delete&amp;id='.$row['id'].'">Löschen</a></p>'."\n";  
                > }  
                > 
                
                

                *rofl*

                Das bringt sicher viel, ich weis auch immer genauer was Datensatz 1, 2, 3
                etc. sind. und alle die auch damit arbeiten selbstverständlich auch. *SCNR*

                MfG

              2. Hej super toll. Es geht vielen Dank.
                Letzte Frage dann lass ich euch in Ruhe. Kann ich mit dem klick auf Löschen auch einen refresh der Seite ausführen. Da ich jetzt immer auf Aktualisieren klicken muss. Damit der Datensatz von der Oberfläsche verschwindet.

                Vielen Dank nochmal ihr seid super
                Sarah

                1. Hi,

                  Da ich jetzt immer auf Aktualisieren klicken muss. Damit der Datensatz von der Oberfläsche verschwindet.

                  Dann lösch sie zuerst bevor du sie aus der DB holst und ausgiebst.

                  MfG

          2. Hi,

            <p>Datensatz 1: <a href="<?php echo $_SERVER['PHP_SELF'] ?>?action=delete&amp;id=1">Löschen</a></p>
            <p>Datensatz 2:  <a href="<?php echo $_SERVER['PHP_SELF'] ?>?action=delete&amp;id=2">Löschen</a></p>
            ...

              
            Ja so geht das aber ich habe die Frage so verstanden das der link in  etwa so aussehen sollte:  
            <a href="delete from tablle where spalte=wert">Löschen</a>  
              
            
            > Diese Lösung ist schlecht, weil  
            >   
            > a) du dich auf das Vorhandensein von $\_SERVER[HTTP\_REFERER'] verlässt, was nicht jeder Browser mitschickt bzw. durch einen Proxy oder Firewall oftmals überschrieben wird mit so sinnvollen Werten wie «111111111111», etc.  
              
            Das wusste ich nicht, das ist natürlich doof.  
              
            
            > b) bei dir «short\_open\_tag» auf On stehen muss, was aufgrund der Portabilität vermieden werden sollte.  
              
            das wusste ich auch nicht.  
              
            Naja man lernt nie aus. Werds mir merken. kann man das irgendwie  
            umgehen? Hab das benutzt da ich ab und an mal mit getvariablen  
            erbeite, bzw. die gleiche seite von unterschiedlichen aufgerufen  
            werden kann. Damit man dann aber zu der zurück kommt, und ich nicht  
            "unnötigerweise" bei den links noch ein  
            "?aufrufe\_seite=$\_SERVER[PHP\_SELF]" dranhängen muss, hab ich das so  
            gelöst und es funktionierte bis jetzt überall.  
              
              
            MfG
            
            1. Hi!

              b) bei dir «short_open_tag» auf On stehen muss, was aufgrund der Portabilität vermieden werden sollte.

              das wusste ich auch nicht.

              Naja man lernt nie aus. Werds mir merken. kann man das irgendwie
              umgehen? Hab das benutzt da ich ab und an mal mit getvariablen
              erbeite, bzw. die gleiche seite von unterschiedlichen aufgerufen
              werden kann. Damit man dann aber zu der zurück kommt, und ich nicht
              "unnötigerweise" bei den links noch ein
              "?aufrufe_seite=$_SERVER[PHP_SELF]" dranhängen muss, hab ich das so
              gelöst und es funktionierte bis jetzt überall.

              Ich verstehe deine Frage jetzt irgendwie nicht - was hat den «short_open_tag» mit GET-Variablen zu tun?

              Grüße,
              Fabian St.

              1. Hi,

                Ich verstehe deine Frage jetzt irgendwie nicht - was hat den «short_open_tag» mit GET-Variablen zu tun?

                nix, wie du siehst ist da ein absatzt und der folgende text bezieht sich
                nochmal allgemein auf das ganze post. die GET-Variable bezieht sich auf
                das weglassen von $_SERVER['HTTP_REFERER'] wobei ich nicht verstehe
                warum der client diesen beeinflussen kann.
                Also ich habe 2 seiten. in der ersten kann ich einen neuen benutzer
                hinzufügen in der zweiten kann ich ihn bearbeiten. am anfang hab ich
                jetzt als "Wohnland" nur Deutschland, hab aber die möglichkeit über eine
                weitere seite ein neues land hinzuzufügen. wenn ich einen neuen
                benutzer anlege ist das kein problem, aber wenn ich einen bearbeite hab
                ich das script über "mein_script.php?benutzer_id=xy" aufgerufen. wenn
                ich nun ein neues land hinzufügen will (der benutzer ist nach jaksdfzg
                ahf land gezogen) dann will ich nach dem hinzufügen des neuen landes
                jawohl gleich auf ihn zurück um es ändern zu können also wieder auf
                "mein_script.php?benutzer_id=xy" diesen string bekomme ich über
                $_SERVER['HTTP_REFFERER'] beim aufruf des scripts zum hinzufügen eines
                neuen landes bzw. "neuer.php" und eine bessere lösung ist mir nicht
                eingefallen welche auch bei änderungen des dateinamens mitspielt.
                jetzt alles klar?

                MfG

                1. Hi!

                  nix, wie du siehst ist da ein absatzt und der folgende text bezieht sich
                  nochmal allgemein auf das ganze post. die GET-Variable bezieht sich auf
                  das weglassen von $_SERVER['HTTP_REFERER'] wobei ich nicht verstehe
                  warum der client diesen beeinflussen kann.

                  Firefox, Webdevelopper-Toolbar --> Deaktivieren
                                                          |_ Referrer-Loging deaktivieren

                  Grundsätzlich gilt: Alles was vom Client kommt, sollte mit größter Sorgfalt begutachtet werden, da diese Daten meist manipulierbar sind.

                  Also ich habe 2 seiten. in der ersten kann ich einen neuen benutzer
                  hinzufügen in der zweiten kann ich ihn bearbeiten. am anfang hab ich
                  jetzt als "Wohnland" nur Deutschland, hab aber die möglichkeit über eine
                  weitere seite ein neues land hinzuzufügen. wenn ich einen neuen
                  benutzer anlege ist das kein problem, aber wenn ich einen bearbeite hab
                  ich das script über "mein_script.php?benutzer_id=xy" aufgerufen. wenn
                  ich nun ein neues land hinzufügen will (der benutzer ist nach jaksdfzg
                  ahf land gezogen) dann will ich nach dem hinzufügen des neuen landes
                  jawohl gleich auf ihn zurück um es ändern zu können also wieder auf
                  "mein_script.php?benutzer_id=xy" diesen string bekomme ich über
                  $_SERVER['HTTP_REFFERER'] beim aufruf des scripts zum hinzufügen eines
                  neuen landes bzw. "neuer.php" und eine bessere lösung ist mir nicht
                  eingefallen welche auch bei änderungen des dateinamens mitspielt.
                  jetzt alles klar?

                  Warum sollte sich der Name des Skriptes so oft ändern, als dass du ihn völlig dynamisch ermitteln müsstest. In solch einem Fall ist IMHO etwas mit der Konzeption des Projektes nicht in Ordnung, denn dann wäre auch der unsinnige Weg über $_SERVER['HTTP_REFERER'] unnötig.

                  Grüße,
                  Fabian St.

                  1. Hi,

                    Grundsätzlich gilt: Alles was vom Client kommt, sollte mit größter Sorgfalt begutachtet werden, da diese Daten meist manipulierbar sind.

                    Schon klar. aber aufgrund des $_SERVER dacht ich das kommt vom server
                    und nicht vom user. mal abgesehen davon das das betreffende Projekt,
                    sollte da jmd manipulieren wollen es eh z spät ist da er sich
                    eingehackt hat, außerdem entsteht da ja kein schaden, dann wird er
                    halt nicht zurückgeleitet sondern muss sich dort wieder hinklickern.

                    Warum sollte sich der Name des Skriptes so oft ändern, als dass du ihn völlig dynamisch ermitteln müsstest.

                    Weil es eben so gut wie komplett dynamisch ist.

                    In solch einem Fall ist IMHO etwas mit der Konzeption des Projektes nicht in Ordnung,
                    denn dann wäre auch der unsinnige Weg über $_SERVER['HTTP_REFERER'] unnötig.

                    und wie soll ich das dann sonst eine dynamisch rückleitung ohne JS machen?

                    MfG

  2. Hi!

    Auf meiner PHP Seite werden Daten aus meiner Datenbank geladen. Nun sollte man die Möglichkeit haben diese Datensätze über meinen php Screen  auch wieder zu löschen. Habe mir das so vorgestellt. Man klickt auf ein kleines Bild und mit dem Klick wird der Eintrag aus der Datenbank gelöscht.

    Könnte mir jemand dabei helfen.

    Wo genau liegt dein Problem bzw. bei welchen Punkt kommst du nicht weiter? Das Vorgehen sollte doch klar sein:

    Du erstellst ein Formular, in dem neben jedem Datensatz ein Radiobutton erscheint. Diesem gibst du als value-Attribut den Primärschlüssel [1] des entsprechenden Datensatzes. Anschließend wird das Formular an ein PHP-Skript geschickt, welches überprüft, welchen Datensatz du gewählt hast und diesen dann entsprechend löscht.
    Sollten mehrere Datensätze auf einmal gelöscht werden, wäre eine Checkbox angebrachter. Ferner wäre auch eine Realisierung über einfache Links denkbar, die eben im Query-String die benötigten Informationen auf die andere Seite übermitteln.

    Grüße,
    Fabian St.

    [1] d.h. der Wert, durch den ein Datensatz genau bestimmt ist, z.B. eine ID.