PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   Datensätze löschen - kleines Script, große Kopfschmerzen (http://www.selfphp.de/forum/showthread.php?t=17561)

Tenhigo 01.09.2007 22:42:36

Datensätze löschen - kleines Script, große Kopfschmerzen
 
Hallo Allerseits!

Mit dem angehängten Script sollen Datensätze auf Wunsch gelöscht werden. Ein Link, der auch die ID übergibt, führt hierzu. Es wird dann Lösch-Link angezeigt und wenn man ihn klickt, bekommt man die Meldung, dass der jeweilige Datensatz gelöscht wurde.
Wird er aber nicht.

Geht man nur mit der Maus über diesen Lösch-Link, sieht man unten im Brwoser, dass hinter der ID der "&aktion=loeschen"-Aufruf mit angezeigt wird, womit die übergebene ID dann natürlich nicht mehr korrekt ist. Also statt "...id=3" steht dann da "...id=3&aktion=loeschen".

Im error.log wird der Fehler rund: In der Zeile 16 soll "aktion" undefiniert sein.

Es beschämend, wie lange ich nun vergeblich nach dem Fehler gesucht habe... ich gebe nun auf.
Kann mir bitte jemand helfen?

PHP-Code:

<?php
   
include("fern_kurs_ausgabe.php");
   
$db_verbindung mysql_connect($db_server$db_benutzer$db_passwort);

   echo 
"<h2>ID-Daten löschen</h2>";
   echo 
"Löschen kann nicht rückgängig gemacht werden!";
   echo 
"<a href=\"fern_kurs_ausgabe.php\">(Zur&uuml;ck zur &Uuml;bersicht)</a><br><br>";

   
$id = @$_GET['id'];
   if (!
$id) die ("Es wurde kein ID_Datensatz angegeben.");

   
$abfrage "SELECT * FROM fern_kurs WHERE id = $id";
   
$ergebnis mysql_query($abfrage$db_verbindung);
   
mysql_close($db_verbindung);    
  
   
$aktion $_GET['aktion'];                   <-------------------------------- Zeile 16
   
if ($aktion == "loeschen") {
       
$abfrage "DELETE FROM fern_kurs WHERE id = $id";
       
mysql_query($abfrage$db_verbindung);
       echo
"Der Datensatz mit der ID $id wurde gel&ouml;scht!";
       
mysql_close($db_verbindung);
       exit();
   }

   echo 
"<tr><td align =\"center\"><a href=\"fern_kurs_loeschen.php?id=$id&aktion=loeschen\">ID $id Datensatz löschen!</a></td></tr>";

?>

Vielen Dank schon mal...
LG
Tenhigo

MatMel 02.09.2007 00:38:19

AW: Datensätze löschen - kleines Script, große Kopfschmerzen
 
Das "'aktion' undefiniert" aus der error.log ist kein Fehler sondern eine Notice und stammt recht wahrscheinlich nicht von dem Aufruf, wenn der Link geklickt wurde, sondern von dem Aufruf vorher, wenn nur der Link angezeigt wird (dann ist ja noch keine aktion gesetzt).
Setze mal ein
PHP-Code:

error_reporting(E_ALL); 

ganz an den Anfang und überprüfe, ob meine Vermutung hinhaut. Die Notice wird dir dann auch während der Laufzeit wie ein normaler Fehler angezeigt.

Tenhigo 02.09.2007 11:28:02

AW: Datensätze löschen - kleines Script, große Kopfschmerzen
 
Hallo MatMel!

Deine Vermutung war korrekt.
Ich habe mich darauf hin auf die Suche begeben, wo genau der Fehler versteckt sein könnte. Dabei habe ich entdeckt, dass ich eine ID-Abfrage verschlampt habe. Aber nachdem ich sie eingesetzt habe, kam keine Rückmeldung mehr, dass die Daten übergeben wurden. Im Ausgabe-php wurden sie jedoch angezeigt.
Irgendwo muss in der ID-Übergabe der Fehler stecken....

Hier mal alle zum Projekt gehörigen phps, vielleicht ist das aufschlussreicher...
fern_kurs_tabelle.php:
PHP-Code:

<?php
   $db_server 
"localhost";
   
$db_benutzer "testnutzer";
   
$db_passwort "geheim";
   
$db_name "test";

   
$db_verbindung = @mysql_connect($db_server$db_benutzer$db_passwort);
   if (
$db_verbindung) {
     echo 
"Verbindung zur Datenbank $db_name erfolgreich aufgebaut!<br>";
   } else {
     echo 
"DB-Verbindung fehlgeschlagen! (MySQL-Server gestartet?)<br>";
   }


   
$ergebnis = @mysql_select_db($db_name$db_verbindung);
   if (
$ergebnis) {
     echo 
"Datenbank $db_name erfolgreich ausgewählt!<br>";
   } else {
     echo 
"Verbindung zur Datenbank $db_name fehlgeschlagen<br>";
   }


   
$abfrage "CREATE TABLE `fern_kurs`  (
         `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
                 `vorname` VARCHAR(50),
                 `nachname` VARCHAR(50),
                 `strasse` VARCHAR(50),
                 `nummer` VARCHAR(10),
                 `plz` INT,
                 `ort` VARCHAR(50),
                 `ausgabe1` VARCHAR(50),
                 `ausgabe2` VARCHAR(50),
                 `ausgabe3` VARCHAR(50),
                 `ausgabe4` VARCHAR(50),
                 `ausgabe5` VARCHAR(50));
             
              "
;

   
$ergebnis mysql_query($abfrage$db_verbindung);
   if (
$ergebnis) {
     echo 
"Anlegen der Tabelle erfolgreich!";
   } else {
     echo 
"Anlegen der Tabelle fehlgeschlagen! (2. Aufruf?)";
   }

?>

fern_kurs:
PHP-Code:

<?php
   $db_server 
"localhost";
   
$db_benutzer "testnutzer";
   
$db_passwort "geheim";
   
$db_name "test";

   
$fehlermeldung utf8_encode("&meldung=Ihre Daten sind leider nicht angekommen.<br>Bitte senden Sie das Formular erneut an uns oder setzen<br>Sie sich auf einem dieser Wege mit uns in Verbindung:<br><b>anmeldung@fernkurse.de<br>0221/456789<br></b>Vielen Dank.");

   
$db_verbindung mysql_connect($db_server$db_benutzer$db_passwort) or die ("$fehlermeldung <br>(Fehler 1)");
   
$ergebnis mysql_select_db($db_name$db_verbindung) or die ("$fehlermeldung <br>(Fehler 2)");
   
   
$vorname utf8_decode($_GET['vorname']);
   
$nachname utf8_decode($_GET['nachname']);
   
$strasse utf8_decode($_GET['strasse']);
   
$nummer utf8_decode($_GET['nummer']);
   
$plz $_GET['plz'];
   
$ort utf8_decode($_GET['ort']);

   
$ausgabe1 utf8_decode($_GET['ausgabe1']);
   
$ausgabe2 utf8_decode($_GET['ausgabe2']);
   
$ausgabe3 utf8_decode($_GET['ausgabe3']);
   
$ausgabe4 utf8_decode($_GET['ausgabe4']);
   
$ausgabe5 utf8_decode($_GET['ausgabe5']);

   
$abfrage "INSERT INTO fern_kurs (`id`, `vorname`, `nachname`, `strasse`, `nummer`, `plz`, `ort`, `ausgabe1`, `ausgabe2`, `ausgabe3`, `ausgabe4`, `ausgabe5`)
         VALUES (NULL, '$vorname', '$nachname', '$strasse', '$nummer', $plz, '$ort', '$ausgabe1', '$ausgabe2', '$ausgabe3', '$ausgabe4', '$ausgabe5');"
;

   
mysql_query($abfrage$db_verbindung) or die ("$fehlermeldung <br>(Fehler 3)");
   
   
$abfrage "SELECT LAST_INSERT_ID;";                                <----------------------- ab hier neu
   $db_ergebnis 
mysql_query($abfrage$db_verbindung) or die ("$fehlermeldung <br>(Fehler 4)");
   
$datensatz_id mysql_result($db_ergebnis0);
   
$erfolgsmeldung $erfolgsmeldung.$datensatz_id;                   <----------------------- bis hier

   $erfolgsmeldung 
utf8_encode("&meldung=Hallo $vorname $nachname!<br>Vielen Dank für Ihre Anmeldung!");
   echo 
$erfolgsmeldung;


   
mysql_close($db_verbindung);

?>

fern_kurs_ausgabe:
PHP-Code:

<?php
   $db_server 
"localhost";
   
$db_benutzer "testnutzer";
   
$db_passwort "geheim";
   
$db_name "test";

   
$db_verbindung mysql_connect($db_server$db_benutzer$db_passwort);
   
mysql_select_db($db_name$db_verbindung);
   
$abfrage "SELECT * FROM fern_kurs";
   
$ergebnis mysql_query($abfrage$db_verbindung);
   
mysql_close($db_verbindung);
   
$eintraege mysql_num_rows($ergebnis);
   echo 
"<h2>fern_kurs Datenausgabe</h2> Die Datenbank enthält $eintraege Einträge<br><br> ";

   if (
$eintraege == 0) {
         echo 
"<br><br>- leider keine Einträge zum Anzeigen vorhanden!";
         exit();
   }
 
   
$kopf "<table border =\"1\">
       <th>ID</th><th>Vorname</th><th>Nachname</th><th>Strasse</th>
    <th>Nummer</th><th>PLZ</th><th>Ort</th><th>Thema</th><th>Kurs</th>
    <th>Kursart</th><th>Zeitraum</th><th>Seminar</th><th>Löschen</th>"
;
   
$fuss "</table>";
   
$za "<tr>";
   
$ze "</tr>";
   
$da "<td>";
   
$de "</td>";
  
   
$spalten mysql_num_fields($ergebnis);

   echo 
$kopf;
   for (
$i 0$i $eintraege$i++) {
     echo 
$za;
     for (
$k 0$k $spalten$k++) {
       echo 
$da;
       echo 
mysql_result($ergebnis$i$k);
       echo 
$de;
     }
     
$id mysql_result($ergebnis$i,'id');
     echo 
"<td><a href=\"fern_kurs_loeschen.php?id=$id\">ID $id l&ouml;schen</a></td>";
     echo 
$ze;
   }
   echo 
$fuss;
?>

fern_kurs_loeschen:
PHP-Code:

<?php
error_reporting
(E_ALL);
   include(
"fern_kurs_ausgabe.php");
   
$db_verbindung mysql_connect($db_server$db_benutzer$db_passwort);

   echo 
"<h2>ID-Daten löschen</h2>";
   echo 
"Löschen kann nicht rückgängig gemacht werden!";
   echo 
"<a href=\"fern_kurs_ausgabe.php\">(Zur&uuml;ck zur &Uuml;bersicht)</a><br><br>";

   
$id = @$_GET['id'];
   if (!
$id) die ("Es wurde kein ID_Datensatz angegeben.");

   
$abfrage "SELECT * FROM fern_kurs WHERE id = $id";
   
$ergebnis mysql_query($abfrage$db_verbindung);
   
mysql_close($db_verbindung);    
  
   
$aktion $_GET['aktion'];
   if (
$aktion == "loeschen") {
       
$abfrage "DELETE FROM fern_kurs WHERE id = $id";
       
mysql_query($abfrage$db_verbindung);
       echo
"Der Datensatz mit der ID $id wurde gel&ouml;scht!";
       
mysql_close($db_verbindung);
       exit();
   }

   echo 
"<tr><td align =\"center\"><a href=\"fern_kurs_loeschen.php?id=$id&aktion=loeschen\">ID $id Datensatz löschen!</a></td></tr>";

?>

O.k., jetzt ist es nicht mehr so ein kleines Script... ;)
LG
Tenhigo

MatMel 02.09.2007 14:37:14

AW: Datensätze löschen - kleines Script, große Kopfschmerzen
 
Mach mal in dieser Zeile:
PHP-Code:

   $id = @$_GET['id']; 

das @ weg, damit du ne Notice bekommst, sollte id nicht übergeben werden.
Bekommst du keine Notice, dann lass dir $id mal per echo ausgeben und schau nach was drinsteht. Wenn das falsch ist hast du einen Ansatz...
Wenn die id korrekt ist, mach mal ein echo in dem if, bei dem $aktion geprüft wird. Ob er da überhaupt reinspringt. Wenn nicht gib dir $aktion aus und schau nach warum nicht.
Zu guter letzt kannst du noch den Query ausgeben lassen und überprüfen.

Tenhigo 02.09.2007 22:35:10

AW: Datensätze löschen - kleines Script, große Kopfschmerzen
 
Hi MatMel!

Ich hoffe, ich habe Dich richtig verstanden...
Für fern_kurs_loeschen.php, sowohl mit als auch ohne @, aus dem error.log:
In Zeile 17: PHP Notice: Undefined index: aktion
In Zeile 20: PHP Warning: mysql_query(): 5 is not a valid MySQL-Link resource
In Zeile 22: PHP Warning: mysql_close(): 5 is not a valid MySQL-Link resource
Was mir allerdings gar nichts sagt. Kannst Du was damit anfangen?

Ich habe ein Echo auf $id gesetzt, bekam jedoch keine Rückmeldung. Liege ich damit richtig, wenn ich vermute, dass da einfach nichts übergeben wird?

Also beim Setzen der ID in fern_kurs_tabelle kann nicht so wahnsinnig viel falsch laufen, denn die Nummern exstieren ja. Und alles, was mit $id eingesetzt wird, wird bei der Abfrage der php-Scripts mit einer entsprechenden Nummer ausgegeben.
Auch der Inhalt wird übertragen. Beides, ID und Inhalt, wird also zwar korrekt ausgegeben, aber vielleicht nicht richtig einander zugeordnet...?

Ich habe die letzten Stunden noch weiter gesucht.
In fern_kurs habe ich ja die vier Zeilen neu eingetragen. Könnte es sein, dass die ganzen Schwierigkeiten hierauf beruhen?
PHP-Code:

   $abfrage "SELECT LAST_INSERT_ID;";
   
$db_ergebnis mysql_query($abfrage$db_verbindung) or die ("$fehlermeldung <br>(Fehler 4)"); 

In meinem Flashend wird Fehler 4 ausgegeben. Ich habe testweise "or die" weggelassen, und wollte neben $vornamen und $nachnamen auch noch $id ausgeben lassen, was aber nicht funktionierte.
Also entweder wird die ID nicht richtig übergeben oder sie wird nicht richtig ausgelesen. Gibt es das: die fortlaufende Zahl wird ausgegeben, aber nicht als den jeweiligen Datensätzen zugehörige ID erkannt? Wenn das möglich wäre, dann würde sich auch das fehlerhafte Löschen erklären, oder?

Sorry, wenn meine Überlegungen hier völlig schwachsinnig wirken sollten - PHP ist für mich ein völlig neues Feld.

LG
Tenhigo

MatMel 03.09.2007 01:46:25

AW: Datensätze löschen - kleines Script, große Kopfschmerzen
 
Also gut ich glaub ich weiß was das Problem ist:
PHP-Code:

  $abfrage "SELECT * FROM fern_kurs WHERE id = $id";
   
$ergebnis mysql_query($abfrage$db_verbindung);
   
mysql_close($db_verbindung);    
  
   
$aktion $_GET['aktion'];
   if (
$aktion == "loeschen") {
       
$abfrage "DELETE FROM fern_kurs WHERE id = $id";
       
mysql_query($abfrage$db_verbindung);
       echo
"Der Datensatz mit der ID $id wurde gel&ouml;scht!";
       
mysql_close($db_verbindung);
       exit();
   } 

In diesem Codestück aus der Datei "fern_kurs_loeschen" wird die Verbindung zur Datenbank geschlossen, danach aber nochmal benutzt.
Daher kommen auch die zwei Warnings aus der error.log, die du geposted hast.
Die Verbindung wird nämlich in Form einer Zahl gespeichert, in deinem Fall wohl 5. Hinter dieser Zahl steckte aber keine gültige Verbindung mehr da sie ja schon in der 3. Zeile geschlossen wurde.
Also mach das mysql_close weg und es sollte wunderbar laufen.

Warum bei der Ausgabe von $id nichts herauskam wundert mich. Denn wenn wirklich nichts übergeben worden wäre, dann hätte in der error.log noch sowas auftauchen müssen:
In Zeile xx: PHP Notice: Undefined index: id
Ist es vielleicht möglich, dass du das echo gesetzt hast, bevor $id zugewiesen wurde?

@Work 03.09.2007 09:07:46

AW: Datensätze löschen - kleines Script, große Kopfschmerzen
 
Hallo zusammen,

wenn ich das richtig sehe, wird
PHP-Code:

$id 

in der url nicht richtig übergeben.

PHP-Code:

   echo "<tr><td align =\"center\"><a href=\"fern_kurs_loeschen.php?id=$id&aktion=loeschen\">ID $id Datensatz löschen!</a></td></tr>"

probier's mal so

PHP-Code:

   echo "<tr><td align =\"center\"><a href=\"fern_kurs_loeschen.php?id='.$id.'&aktion=loeschen\">ID '.$id.' Datensatz löschen!</a></td></tr>"

MfG

Tenhigo 03.09.2007 10:27:57

AW: Datensätze löschen - kleines Script, große Kopfschmerzen
 
@ MatMel

Die Fehlermeldungen im error.log verschwanden in der Tat, nachdem ich das erste mysql_close gelöscht habe.
Das freut mich schon mal sehr, auch wenn es nichts am fehlerhaften Löschen geändert hat.

Das echo habe ich jetzt nochmal gesetzt. Du hast Recht - ich muss es gestern in die falsche Zeile gepackt haben. Es kommt also nun die korrekte ID dabei heraus.
Trotzdem wird nichts gelöscht.

@@Work

Deine ID-Übergabe-Variation habe ich ausprobiert, das Problem bleibt aber auch hierbei leider bestehen.

LG
Tenhigo

MatMel 03.09.2007 14:02:50

AW: Datensätze löschen - kleines Script, große Kopfschmerzen
 
Mach bitte den Code von @Work wieder raus oder ersetze die ' die er geposted hat durch ". Sonst kommt nämlich sowas am Schluss raus:
Code:

<tr><td align ="center"><a href="fern_kurs_loeschen.php?id='.12.'&aktion=loeschen">ID '.12.' Datensatz löschen!</a></td></tr>
(id wäre jetzt 12)

Wenn id richtig übergeben wird kann es ja fast nur noch am Query liegen...
Also gib dir mal $anfrage in dem if per echo aus und schau was da drin steht.
Falls du phpMyAdmin zur Hand hast kannst du das Query da auch mal ausführen und schauen was es sagt.

Tenhigo 03.09.2007 16:02:53

AW: Datensätze löschen - kleines Script, große Kopfschmerzen
 
Stimmt, genau das ist dabei raus gekommen.

Das echo auf $abfrage ergibt (bei "Löschung" von Nr. 12):
DELETE FROM fern_kurs WHERE id = 12

Ein echo auf mysql_query($abfrage, $db_verbindung ergab, wie zu erwarten war,
mysql_query(DELETE FROM fern_kurs WHERE id = 12, Resource id #5)

PhpMyAdmin hatte ich noch nicht, habe es aber eben mal runter geladen. Erstaunlicherweise frage ich mich gerade, wie man das überhaupt ans Laufen kriegt...
Ich begebe mich mal dran...

LG
Tenhigo


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:02:23 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.