PHP - Datensätze in MySQL über Button löschen

  • Hallo an alle!


    (wie immer) stelle ich eine sehr komplizierte Frage, ... zumindest für mich. ^^


    Ich benötige einen Button der bei einem Klick eine bestimmte Action in PHP ausführt. Die PHP Funktion soll eine ganz bestimmte Zeile Löschen.


    ganz billig geschrieben würde sie ca. so aussehen:

    SQL
    DELETE FROM nachrichten WHERE benutzer='$username' AND gelesen='1' AND empfaenger='$empfaenger' AND zeit='$datum'

    (nur grobe angaben zum Verständnis)


    Soweit so gut. Das einzige Problem an der ganzen Sache ist nur das ich diese Variablen wie $empfaenger oder $datum gar nicht habe.
    Die größte Frage ist bei mir wie schreibe ich diese Variablen?


    PS: Ich denke die frage ist sehr ungenau und nicht sonderlich zu verstehen. Daher schreibe ich euch mal meinen Code etc.
    -----------------------------------------------------------------------------------------------------------------------------------
    Dies ist der Code zum erstellen der Tabelle
    [PHP]
    $username = $_SESSION["username"];
    $ungelesentabelle = "SELECT * FROM nachrichten WHERE gelesen = '0' AND empfaenger = '$username'";
    $query = mysql_query($ungelesentabelle) or die(mysql_error());
    ?>
    <?php


    $username = $_SESSION["username"];
    $ungelesentabelle = "SELECT * FROM nachrichten WHERE gelesen = '0' AND empfaenger = '$username'";
    $query = mysql_query($ungelesentabelle) or die(mysql_error());
    ?>
    <?php
    echo '<table border height=80 border="1">';
    echo '<colgroup>';
    echo '<col width="80">';
    echo '<col width="80">';
    echo '<col width="150">';
    echo '<col width="60">';
    echo '<col width="70">';
    echo '</colgroup>';
    echo '<tr>';
    echo '<th>Für: </th>';
    echo '<th>Von: </th>';
    echo '<th><center>Datum</center></th>';
    echo '<th><center>Lesen</center></th>';
    echo '<th><center>Löschen</center></th>';
    echo '<tr>';
    while($fetch = mysql_fetch_assoc($query)) {
    echo '<tr>';
    echo '<td>' . $fetch['empfaenger'] . '</td>';
    echo '<td>' . $fetch['benutzer'] . '</td>';
    echo '<td><center>' . $fetch['zeit'] . '</center></td>';
    echo '<td><center><button><img width="25" src="../images/read_message.png" alt="read_message" ></button></center></td>';
    echo '<td><center><button><img width="25" src="../images/button_cancel.png" alt="read_message" ></button></center></td>';
    echo '</tr>';
    }
    echo '</table>';
    ?>[/PHP]
    -----------------------------------------------------------------------------------------------------------------------------------
    Meine ausgegebene Tabelle sieht anschließend so aus:


    [Blockierte Grafik: http://metrostorm.bplaced.com/Unbenannt.PNG]


    -----------------------------------------------------------------------------------------------------------------------------------


    Nun möchte ich das wenn man auf "Löschen" klickt, (also das img) das der Button "sagt" sobald er geklickt wurde "eh du, PHP? lösche mal bitte die Zeile, die mit allen Einträgen übereinstimmen.)
    Also soll geprüft werden das der Absender der selbe ist, der Empfänger der selbe ist, ebenfalls das Datum.
    So, das PHP genau diese Nachricht so sehr in der Tabelle 'nachrichten' gefiltert hat und sie anschließend löschen kann. bzw. automatisch gelöscht wird sobald das img bzw. der Button gedrückt wurde.


    SO! Sorry wenn sich die Frage sooo lang gezogen hat. eigentlich wollte ich nur kurz eine Frage posten, dann wurde es jedoch immer mehr, so das ich nun meinen gesamten Fehler geschildert habe.


    Ich hoffe das sich die mühe für die Frage gelohnt hat und hoffe auf weiterhin hilfreiche Antworten! :)

  • ... die erste <tr> wird nicht geschlossen - da fehlt ein slash.


    So. Ist umfangreicher als Du denkst.
    Erstmal den button mit nem <a></a> umschliessen und den link zum php script setzen.
    Du brauchst natürlich eine id der Nachricht.

    HTML
    <td>
     <a href="SCRIPTNAME.php?delete=<?php echo $fetch['id']; ?>"> 
      <center><button><img width="25" src="../images/button_cancel.png" alt="read_message" ></button></center>
     </a>
    </td>


    im php script musst Du nun prüfen:
    - ist der Benutzer (also der das Script aufruft) berechtigt das Script aufzurufen? (eingeloggt? rechte?)
    - ist der Benutzer dazu berechtigt die Nachricht zu sehen/lesen/löschen ... also soll er irgendwas mit der Nachricht machen dürfen?
    - kommt über $_GET "was rein"? Also hier im Bsp $_GET['delete']
    - ist der Wert in $_GET['delete'] valid? (also numerisch und nicht leer):

    PHP
    if(isset($_GET['delete'])and is_numeric($_GET['delete'])){ ... dann erst weiler ... }


    - sql Query zusamenstellen:

    PHP
    §query = "
    DELETE FROM `nachrichten`
    WHERE 
        empfaenger = ".mysql_real_escape_string($username)." -- "extra" sicher stellen, dass der benutzer stimmt
        AND id = ".mysql_real_escape_string($_GET['delete'])." 
    LIMIT 1 -- FALLS mal jemand eine SQL injection hinbekommen sollte, dann KANN man damit u.U. schlimmeres verhindern. Kann man aber auch umgehen. (Thema schweift zu sehr ab)
    "


    Wenn jetzt doch de id, also die Nachricht nicht existieren sollte, dann passiert "einfach nix".
    Ein UPDATE oder DELETE gibt keinen Fehler zurück, wenn kein passender Datensatz gefunden wurde.


  • - sql Query zusamenstellen:

    PHP
    §query = "
    DELETE FROM `nachrichten`
    WHERE 
        empfaenger = ".mysql_real_escape_string($username)." -- "extra" sicher stellen, dass der benutzer stimmt
        AND id = ".mysql_real_escape_string($_GET['delete'])." 
    LIMIT 1 -- FALLS mal jemand eine SQL injection hinbekommen sollte, dann KANN man damit u.U. schlimmeres verhindern. Kann man aber auch umgehen. (Thema schweift zu sehr ab)
    "


    Wenn jetzt doch de id, also die Nachricht nicht existieren sollte, dann passiert "einfach nix".
    Ein UPDATE oder DELETE gibt keinen Fehler zurück, wenn kein passender Datensatz gefunden wurde.

    Das ist das einzige was ich momentan so gar nicht verstehe ?(
    Hast du eventuell den Code falsch geschrieben?


    egal in welchen formen ich deinen Code anwende bekomme ich immer nur eine Fehlermeldung in der 18 Zeile. (hier 12)
    AND id = '.mysql_real_escape_string($_GET['delete']).'


    Ich poste mal den gesamten Code, ich glaube eher das ich einen Fehler gemacht haben.


    PS: ansonsten funktioniert alles super! :)


    Code von loeschen.php
    [PHP]


    <?php
    if(isset($_GET['delete'])and is_numeric($_GET['delete'])) {
    ?>
    <?php
    }
    ?>
    <?php
    $query = "
    DELETE FROM nachrichten
    WHERE
    empfaenger = '.mysql_real_escape_string($username).'
    AND id = '.mysql_real_escape_string($_GET['delete']).'
    LIMIT 1
    "
    ?>
    [/PHP]

  • Achte auf Einrückung und benutze doch einfach ein <?php tag?
    Außerdem kannst du auch ein echo Tag benutzen ;)


    EDIT's:
    -in Zeile 14 fehlt dir ein ;
    - NIEMALS angewöhnen HTML und CSS zu vermischen (nur in NOTFÄLLEN)
    -zu deinem Problem, php functionen werden nicht in einem string ausgeführt, d.h.

    PHP
    //wird nie zu einem ergebniss führen 
    $blub = "empfaenger = '.mysqli_real_escape_string($username).'";
    //funktioniert
    $blub = "empfaenger = ".mysqli_real_escape_string($username)."";


    Das gleiche gilt auch für variablen aus einem Array ($_GET['delete'])


    Hier nochmal dein loeschen.php Code

  • Ja, da hab ich die " vergessen =)


    PS: wenn Du schreibst, dass Du einen Fehler in Zeile xy bekommst, wäre es auch gut den Fehler zu posten =)
    Dafür sind Fehlermeldungen ja da. Die sagen nicht nur "nö, hier gehts nicht weiter" =)
    Wenn man sich an die Meldungen "gewöhnt", die also versteht, dann findet man meistens auf Anhieb die Lösung.



    EDIT:
    ich finde noch wichtig zu erwähnen, dass Du nach

    PHP
    // Wieder zurrück zur alten Seite
        header("location: deinSeitenName.php");


    exit(0); nutzen solltest. Also:

    PHP
    // Wieder zurrück zur alten Seite
        header("location: deinSeitenName.php");
        exit(0);


    Denn die Funktion header() beendet das Script nicht.
    Heißt: nachfolgender Code würde ausgeführt werden.


    Bsp:


    exit() beendet das Script (exit eben =)
    Die 0 (null) bewirkt, dass das Script "erfolgreich" beendet wird.
    Siehe: http://www.php.net/manual/de/function.exit.php
    Evtl Destructoren(?) ect werden also noch ausgeführt. (braucht man, wenn man eher in Sachen OOP (Objektorientierter Programmierung) ).

  • Erstmal natürlich wiedermal vielen Dank an euch, ich denke der Code ist soweit fast funktionsfähig, er gibt also keine Fehlermeldung aus.


    jedoch tut sich immer noch nichts wenn ich den Button drücke, ich denke es liegt daran das der "button" gar nicht ausgibt das er gedrückt wurde, sondern nur weiterleitet.


    PHP
    <td>
    <a href="loeschen.php?delete=<?php echo $fetch['id']; ?>"></html>
    <center>
    <button>
    <img width="25" src="../images/button_cancel.png" alt="read_message" >
    </button>
    </center>
    </a>
    </td>;


    Und die loeschen.php benötigt ja bei der Abfrage das wissen ob er denn nun gedürckt wurde.

    Code
    if(isset($_SESSION["username"]) && isset($_GET['delete']) && is_numeric($_GET['delete']))
    [size=10]

    [/size]



    Wie müsste ich denn den HTML button definieren das er mit PHP kommuniziert? funktioniert da auch value? Eher nicht, oder? 8|

  • Also ....
    Ich wiederhole mich ungerne aber
    1. EINRÜCKUNG
    2. TRENNE bitte styling und html!! (<center> Tag weg!)


    -Ich verstehe nicht wieso du n'Button drum machst..
    -In zeile 9 fehlt ein " oder ' ..
    -ich vertsehe nicht wieso du das bild zum löschen zeigst und alternativ read_message schreibst..


    Das hier sollte reichen

    PHP
    echo '
        <td>
            <a href="loeschen.php?delete="'.$fetch['id'].'"></html>
                <img src="../images/button_cancel.png" alt="read_message" >
            </a>
        </td>
    ';


    Hast du die Seite irgendwo online?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!