Daten aus wählen und dann aus mysql mit php löschen

  • Hallo,
    ich möchte Daten aus mysql löschen die ich vorher per Knopfdruck ausgewählt habe. .
    Das Script sieht momentan so aus:
    [code=php]<?php
    session_start();
    if(isset($_SESSION["username"])) {
    require_once("../../include/db_config.inc.php");
    $user = $_SESSION['username'];



    $q = "SELECT * FROM user WHERE username='$user'";
    $con = mysql_query($q);
    while ($row = mysql_fetch_object($con))
    {
    $name = $row->name;
    }
    ?>
    <html>
    </head>
    <title><?php include '../../include/title/name.php'; ?></title>
    <link rel="stylesheet" type="text/css" href="../../include/css/footer.css" />
    </head>
    <body>
    <h3>l&ouml;schen</h3>
    <h4>Bitte Ausw&auml;len:</h4>
    <?php
    $abfrage = "SELECT * FROM news WHERE id ORDER BY id DESC LIMIT 5";
    $ergebnis = mysql_query($abfrage);
    while($row = mysql_fetch_object($ergebnis))
    {
    $id2 = $row->id;
    ?>
    <input type="submit" value=' ' onClick="value='X'">
    &nbsp;&nbsp; <?php echo $row->id;?> &nbsp;&nbsp;
    <?php echo $row->title;?>
    <br/>
    <?php
    }
    ?>
    <br />
    <form action="loeschen.php?page=2" method="post">
    &nbsp;&nbsp; <input type="submit" value='L&ouml;schen'>
    <footer><input type='submit' class='submit stdbtn' name='js_close' value="Schlie&szlig;en" onClick='top.window.close()'></footer>
    </body>
    </html>
    <?php
    } else {
    ?>
    Bitte erst anmelden, <a href="<?php include'../../include/link-login.php'; ?>">hier</a>.
    <?php
    }
    ?>[/php]



    doch jetzt sind meine php-Künste leider am Ende. Deshalb frage ich euch um Rat bzw. Hilfe.


    Vielen Dank
    raspi-wetter

  • Was willst du denn machen? Die ausgewählte id löschen?


    Dann würde ich das Input Field erstmal in die Form packen damit du die id überhaupt übergeben kannst, die id dann auf der loeschen.php abfragen und mit


    Code
    "DELETE FROM news WHERE id='".$_POST['id']."'"


    aus der Datenbank löschen. Bedenke aber die Möglichkeit der MySQL Injection und validiere zuvor die Werte, die per $_POST übergeben werden.


    Die Values im Input Field fehlen auch, da steht nix :)


    ---


    Nachtrag: Offenbar hast du da auch verschiedene User - die User musst du dann natürlich auch im POST mit übergeben (z.B. in einem Hidden Field) und in den löschen Befehl mit einbauen - es sei denn du hast Unique id's die mit dem User verknüpft sind.

    Edited once, last by doing ().

  • Nö - in deiner FORM ist kein Feld zu sehen, also wird auch nix im POST übergeben. Die id's aus der Datenbank gibst du doch eh in einer while() Schleife aus - wieso hast du die Schleife nicht in der Form (eigentlich ungünstig, das gibt ne Menge Eingabefelder untereinander - vielleicht ein pulldown Menu?) damit du eine id auswählen und übergeben kannst?

  • Generell solltest du dir ein besseren Programmierstyle angewöhnen und Einrückungen verwenden damit man den Code besser lesen kann :fies:


    'SELECT *' sollte vermieden werden da das langsamer ist als explizit die Felder auszuwählen die man wirklich haben will bzw braucht. Gerade auf dem PI sollte man darauf achten ;)


    Dein erstes SELECT versteh ich nicht so richtig.. Du scheinst nur die Spalte 'name' auszulesen - ist das nicht mit $username identisch? Das wird aber auch nirgends verwendet also scheint die Abfrage generell überflüssig zu sein :s


    Dein 2.SELECT ist ebenfalls komisch da du nur "WHERE id" angibst, was aber eine komische Bedingung ist. Wenn du die WHERE Bedingung nicht wirklich nutzt kannst du das auch ganz weglassen und nach 'FROM news' direkt 'ORDER BY ...' angeben. Allerdings wirst du ein Problem mit der Verarbeitung kriegen, da du ja ein LIMIT von 5 angibst aber $id2 dann jedes mal überschrieben wird. Wenn also mehr als ein Treffer raus kommt wird nur der letzte in $id2 stehen. Hier müsstest du also entweder direkt eine HTML-Ausgabe machen oder die Ausgabe in ein Array schreiben was du dann auch im Prinzip machst, aber $id2 garnicht verwendet wird - ist das eine code-leiche? :fies:
    Das nächste Problem ist dass du keine id an das <input übergibst und somit auch keine HTML-Auswahl machen kannst. Und zu guter letzt hast du kein <form vor den <input 's und somit wird auch nichts "verwertbar" übergeben.

  • Also ich würde dir folgendes vorlagen


    In der db_config.inc.php sollten wirklich nur Config-Informationen stehen. Eine Verbindung an sich solltest du wirklich erst in der eigentlichen Datei, also z.B. index.php, vornehmen. Dafür ist das 'include/' Verzeichnis eigentlich auch vorgesehen: Konfigurationen, Funktionen, weiteres was Inkludiert werden kann. In der db_config.inc.php (das .inc kannst du eigentlich auch weg lassen) sollte also nur sowas wie folgendes drin stehen:
    [code=php]
    <?php
    $dbHost = 'localhost';
    $dbUser = 'root';
    $dbPass = 'raspberry';
    $database = 'db_news';
    ?>
    [/php]


    In deiner index.php (oder news.php, how ever) include'st du dann die db_config.php und erst da stellst du eine Verbindung zum MySQL her:
    [code=php]
    <?php
    session_start();


    if (isset($_SESSION["username"])) {
    require_once("../../include/db_config.php");
    $conid = mysql_connect($dbHost, $dbUser, $dbPass) OR die('Error connecting to MySQL: ' . mysql_error());
    $select_db = mysql_select_db($database, $conid);
    if (!$select_db) { die('Cannot use Database '.$database.' : ' . mysql_error($conid)); }
    [/php]mit dieser $conid kannst du dann weiter arbeiten.. Wichtig ist nämlich auch das die Verbindung auch wieder geschlossen wird - das hast du aber auch vergessen zu tun.


    Den ersten SELECT Abfrage scheinst du ja derzeit gar nicht zu verwenden - also kannst du die eigentlich raus löschen... Also geht es dann nur noch so weiter im Text:
    [code=php]
    ?>
    <html>
    </head>
    <title><?php include '../../include/title/name.php'; ?></title>
    <link rel="stylesheet" type="text/css" href="../../include/css/footer.css" />
    </head>
    <body>
    <h3>l&ouml;schen</h3>
    <h4>Bitte Ausw&auml;len:</h4>
    [/php]


    Nun käme die Stelle an der du die letzten 5 ID's aus der Datenbank anzeigen lassen möchtest, mit Auswahlmöglichkeit diese zu löschen. Damit das funktioniert musst du, wie bereits erwähnt, vorher ein <form> öffnen - du hast dies leider erst danach erstellt was aber nichts bringt, da die Informationen dann ja nicht innerhalb dieses Formulars vorliegen.
    Ich zeig dir jetzt auch eine andere Schreibweise, die ich persönlich bevorzuge - das kannst du aber auch auf die deine ( $row->id ) umschreiben...
    [code=php]
    <form action="" method="POST">
    <?php
    $query = "SELECT id,title FROM news ORDER BY id DESC LIMIT 0,5";
    $result = mysql_query($query);


    while ($row = mysql_fetch_array($result)) {
    echo "<input type='submit' name='delete' value='" . $row['id'] . "'/> ' . $row['title'] . ' <br/>";
    }


    mysql_close($conid);
    ?>
    <br />
    </form>
    [/php]


    Und dann eben den Rest des HTML Codes unten drunter:
    [code=php]
    </body>
    </html>
    <?php
    } else {
    ?>
    Bitte erst anmelden, <a href="<?php include'../../include/link-login.php'; ?>">hier</a>.
    <?php
    }
    ?>
    [/php]


    Nun würde aber noch das fehlen was auf ein 'submit' reagieren soll - also das eigentliche löschen. Sobald man auf einer der 'submit's klickt werden die Daten an die selbe PHP Datei mit der Methode POST übergeben. Dies sollte man bereits am Anfang des Scripts auswerten/prüfen und verarbeiten damit beim neu laden der Seite auch aktuelle Informationen, also nicht mehr die bereits gelöschten Einträge, angezeigt werden.


    Wir nehmen uns also noch mal den obersten Block zu Brust, in dem session_start(); steht, und fügen in diesem Block ans Ende (unterhalb der $select_db Prüfung) noch folgendes ein:
    [code=php]
    $Delete = isset($_POST["delete"]) ? $_POST["delete"] : "";
    [/php]
    Dies macht im Grunde folgendes:
    Falls es eine POST Übergabe mit dem Schlüssel "delete" gab dann wird dessen Inhalt (also value) in die Variable $Detele hinterlegt. Falls es aber keine gab dann wird $Delete mit "" gesetzt, also leer.
    "delete" ist der 'name' vom Submit.
    Man könnte das auch wie folgt schreiben, was vielleicht einfacher zu verstehen ist:
    [code=php]if (isset($_POST["delete"]) AND !empty($_POST["delete"])) {[/php]... Wäre eine Zeile kürzer da man sich die erste Zeile vom folgenden Block sparen könnte - aber dann muss man erneut $_POST["delete"] über all da aufrufen wo mans benötigt und hat keine einfache $Delete Variable... Von daher bevorzuge ich ersteres anstelle dieses.


    Nun prüfen wir also ob $Delete nicht leer ist und vollziehen das Löschen der übergebenen ID:
    [code=php]if (!empty($Delete)) {
    $result = $conid->mysql_query("DELETE FROM news WHERE id='" . $Delete . "'");
    }
    [/php]


    Allerdings ist bei dem ganzen der Nachteil das du immer nur ein Eintrag löschen kannst. Das ist auf Dauer ein wenig nervig wenn es mehrere Einträge gibt... Besser wäre hier mit checkbox zu arbeiten, allerdings ist der Umgang bezüglich der Übergabe usw dann auch etwas komplizierter.



    Wenn du Fragen hast dann frag bitte gezielt was du nicht verstehst.

  • Was bei meigrafd's 'Bauanleitung' (der sich wieder richtig Mühe gemacht hat :thumbs1:) noch fehlt, ist die Abfrage auf den 'username' der ja nach dem 'login' bereitstehen müsste. Den 'username' würde ich in einem Hidden Field in der POST Form mit übergeben und dann die 'löschen' Query entspechend erweitern. Letzteres wäre nicht nötig, wenn die 'id' Spalte in der Datenbank eine 'UNIQUE' Verknüpfung zwischen 'id' und 'username' aufweist.


    Wenn das Ganze im Netz zugänglich sein sollte - BITTE denk an MySQL Injection Protection! Dafür muss eine Überprüfung der übergebenen POST Parameter in das auswertende Script rein, da dir sonst jeder (der weiß wie) in der MySQL Datenbank herumtoben kann!

    Edited once, last by doing ().