Sigge: Einträge werden nach dem aufrufen gelöscht

Hej,
erstmals beschäftuge ich mich mit mysql. Daher habe ich eine Beispieldatei genommen und für meine Zwecke verändert zu einem Terminkalender.
Eingetragene Termine werden auch "ein mal" ausgegeben, aber dabei in der Datenbank gelöscht.
Irgend wo scheine ich da einen dicken Hund eingebaut zu haben.

Hier mein Quelcode:

<html>
<head>
<title>Terminkalender:</title>

<link rel="stylesheet" type="text/css" href="../termin.css">

<?php

function loesch($dat){  
	$loeschen = "DELETE FROM termine WHERE id = $dat";  
	mysql\_query($loeschen);  
}  

?>

</head><body>
<h1>Demnächst:</h1>

<table style="border-width:1; border-style:none;" width="575">
<tr>
<td height="32px" align="center" width="80"><h2>Datum</h2></td>
<td align="center" width="100" align="center"><h2>von - bis</h2></td>
<td width="300"><h2>Veranstaltung</h2></td>
<td align="center" width="95"><p>&nbsp;</p></td>
</tr>
<?php
$dp = @mysql_connect ("localhost", "root", "");
@mysql_select_db ("terminkalender", $dp);
$sql = "select * from termine";
$result = mysql_query ($sql);
while ($row =mysql_fetch_assoc($result)){
?>
<tr>
<td align="center" height="32px"><p><?php echo "$row[Datum]"; ?></p></td>
<td align="center"><p>
<?php $vobi = "$row[von] - $row[bis]";
if($vobi == " - "){
echo "ganzt&auml;gig";
}else{
echo "$vobi";
} ?></p>
</td>
<td><p><?php echo "$row[Veranstaltung]"; ?></p>
</td>
<td>
<div class="fenster">
<div class="vorher">
<p>&nbsp;weitere Infos</p>
</div>
<div class="nachher">
<p><?php $nr = $row[id]; echo "weitere Infos zum Eintrag: $nr"; ?></p>
<table width="650">
<tr>
<td align="center" width="90">
<p class="feld">Datum</p>
  <p><?php echo "$row[Datum]"; ?></p>
</td>
<td align="center" width="110" align="center">
<p class="feld">von - bis</p>
<p><?php
if($vobi == " - "){
echo "ganzt&auml;gig";
}else{
echo "$vobi";
} ?></p>
</td>
<td width="300" colspan="2">
<p class="feld">Veranstaltung</p>
<p><?php echo "$row[Veranstaltung]"; ?>
</td>
<td class="grau" align="center" width="150">
<p class="vit">Flyer</p>
</td>
</tr>
<tr>
<td width="500" colspan="4">
<p class="feld">Beschreibung</p>
<p><?php echo "$row[Beschreibung]"; ?>
</td>
<td class="grau" width="150" align="center">
<p class="vit">Termin<br>bearbeiten</p>
</td>
</tr>
<tr>
<td width="200" colspan="2">
<p class="feld">Ort</p>
<p><?php echo "$row[Ort]"; ?></p>
</td>
<td width="150">
<p class="feld">Ersteller</p>
<p><?php echo "$row[Ersteller]"; ?></p>
</td>
<td width="150">
<p class="feld">E-mail</p>
<p><a style="color:blue;" href="mailto:<?php echo "$row[mail]"; ?>?subject=Terminkalender SeniorKompetenzTeam"><?php echo "$row[mail]"; ?></a></p>
</td>
<td class="grau" width="150" align="center">
<p class="vit"><a href="<?php loesch($nr) ?>">Termin<br>löschen</a></p>
</td>
</tr>
</table>
</div>
</div>
</td>
           </tr>
<?php  }
mysql_close($dp);
?>
</table>
</body>

</html>

Würde mich freuen wenn mir hier jemand weiter hilft.

  1. Hallo,

    Irgend wo scheine ich da einen dicken Hund eingebaut zu haben.

    offensichtlich

    Hier mein Quelcode:

    Quälcode schreibt sich mit ä

    <?php

    function loesch($dat){
    $loeschen = "DELETE FROM termine WHERE id = $dat";
    mysql_query($loeschen);
    }
    ?>

    das riecht doch schon mal sehr nach dickem Hund, der wo genau aufgerufen wird?:

    8<--- Quälcode weggeschnippelt ----->8

    <a href="<?php loesch($nr) ?>">Termin<br>löschen</a>

    Bessere Frage: wann genau wird der dicke Hund aufgerufen bzw. ausgeführt? Sobald nämlich PHP die Seite zusammenbaut.

    Gruß
    Kalk

  2. <a href="<?php loesch($nr) ?>">Termin<br>löschen</a></p>

    Du gibst <a href=" aus und dann wird PHP Code aktiviert, der loesch() aufruft. Dann wirds gelöscht. Danach wird Termin... usw. zum Browser ausgegeben.
    Was du willst ist ein Link im href auf ein Script, das loesch() aufruft.

    1. Tach!

      Was du willst ist ein Link im href auf ein Script, das loesch() aufruft.

      Nein, sowas will man nicht. Nicht nur Suchmaschinen folgen Links, ohne sich bewusst zu sein, was sie damit auslösen. Daten verändernde Aktionen sollten sich nicht hinter einfachen Links verstecken, sondern über einen POST-Request ausgeführt werden.

      dedlfix.

  3. Hallo,

    Würde mich freuen wenn mir hier jemand weiter hilft.

    Oh je... was für Code

    Bei <?php loesch($nr) ?> rufst du jedesmal auch deine Löschroutine auf. Deshalb wird der Eintrag immer gelöscht.

    Ich hoffe Du stellst das Script so nicht ins öffentliche Web, das wäre in dem Scriptstadium eine recht einladende Sicherheitslücke. ;-)

    Viele Grüße
    Helmut

  4. Danke für die schnellen Reaktionen.
    Im Moment versuche ich mich erst ein mal in die Materie einzuarbeiten (xampp).
    Euren Anmerkungen nach gehe ich davon aus, dass es datenbankmässig richtig ist und der Fehler in der Löschroutine zu finden ist.
    Ich würde ungern auf Javascript ausweichen, deshalb sei mir die Frage erlaubt wie der Löschvorgang einzelner Einträge zu bewerkstelligen ist.

    1. Mahlzeit Sigge,

      Euren Anmerkungen nach gehe ich davon aus, dass es datenbankmässig richtig ist und der Fehler in der Löschroutine zu finden ist.

      Nein, der Fehler liegt in Deinem bisher ungenügenden Verständnis bezüglich was wann wo passiert. Eigne Dir DRINGEND die Grundlagen von HTTP an. Mache Dir klar, wann und wo PHP-Code ausgeführt wird und was anschließend mit dem Ergebnis passiert. Überlege, was passieren muss, damit Du (bzw. Dein Webserver) mitbekommst, wenn auf dem Rechner des Anwenders im Browser irgendeine Aktion ausgelöst wird.

      Ich würde ungern auf Javascript ausweichen, deshalb sei mir die Frage erlaubt wie der Löschvorgang einzelner Einträge zu bewerkstelligen ist.

      Wie dedlfix bereits schrieb durch einen gesonderten Request an den Server (der z.B. ausgelöst werden kann, indem der Anwender auf irgendetwas klickt), bei dem es sich allerdings um einen POST-Request handelt sollte, da immerhin Daten manipuliert/geschrieben und nicht nur abgeholt (GET) werden.

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:& n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  5. Hallo Sigge!

    Dass beim geposteten Code die Löschfunktion schon beim Seitenaufbau aufgerufen wird und es somit zu einem DELETE kommt, wurde Dir ja schon gesagt.

    erstmals beschäftuge ich mich mit mysql.

    Wenn Du wirklich _völlig neu_ bist bei der Thematik dann empfehle _ich persönlich_, von Anfang an PDO zu verwenden. Dedlfix hat hier mal darauf hingewiesen, dass es bestimmte Dinge gibt, die sich mit PDO nicht machen lassen. Aber für die Standardarbeit wie Erstellen, Verändern und Löschen von Daten einer MySQL Datenbank in Verbindung mit php ist PDO in meinen Augen das simpelste und das am schnellsten zu verstehende System.

    Als ich noch die mysql-Funktionen und später die mysqli Funktionen genutzt habe, habe ich an einem einzigen Tag mehr Probleme (Wieso geht das nicht? Wieso kommt eine Fehlermeldung? Wieso kommt kein Ergebnis?) gehabt als seither in über einem Jahr mit PDO.

    Ich finde, PDO ist einfach simpler und verständlicher. Früher habe ich die Arbeit mit MySQL gehasst. Seit PDO ist das anders. Abgesehen davon ist PDO ja eine Schnittstelle für die verschiedensten Datenbanksysteme, nicht nur für MySQL.

    Als ersten Einstieg empfehle ich Dir zB. folgende Seiten:

    PHP Data Objects – Eine Einführung in PDO
    Why you Should be using PHP’s PDO for Database Access
    PHP, PDO und Prepared Statements Schritt für Schritt verstehen
    Introduction to PHP PDO
    PHP Data Object/PDO Tutorial

    Mit lieben Grüßen

    Melvin Cowznofski

    --

    Melvin Cowznofski
    What – me worry?
    1. Wenn Du wirklich _völlig neu_ bist bei der Thematik ...

      ... Verändern und Löschen von Daten einer MySQL Datenbank in Verbindung mit php ist PDO in meinen Augen das simpelste und das am schnellsten zu verstehende System.

      Hallo Melvin,

      danke für deine Anregung. Klingt interessant.
      Werd mir deine Links zu PDO mal anschauen.

      Sigge