[GastForen Programmierung/Entwicklung PHP und MySQL Löschen von Daten aus einer Tabelle

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Löschen von Daten aus einer Tabelle

fromNZ
Beiträge gesamt:

24. Sep 2007, 10:43
Beitrag # 1 von 7
Bewertung:
(1978 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi,

Ich habe eine Mysql Datenbank mit Mitgliedern eingegeben, und als Tabelle dargestellt. Ein separates Formular um neue Daten einzugeben funktioniert auch. Aber ich bekomme es nicht hin, Einträge zu löschen.

Ich habe die Tabelle verkürzt zur besseren Übersicht. Im oberen Teil der Datei ist auch ein Formular dass sich selbst aufrufen soll was nicht klappt, aber das ist nicht meine Sorge. Ich habe diesen Teil dringelassen, für den Fall, dass dort der Fehler liegt.

Ich wäre sehr dankbar wenn mir jemand sagen könnte, wo der Fehler beim Code liegt in dem Teil, wo man Mitglieder löschen kann. Habe ich eine Variable nicht ordentlich bestimmt oder an die falsche Stelle geschrieben?

Nach etlichen Beispielen aus Büchern, die ich ausprobiert habe, weiss ich jetzt keine Lösung mehr.

Gruss aus Neuseeland

<html>
<head>

<title>Eintrag aus Form löschen</title>
</head>
<body>

<?php
// Um ein neues Mitglied hinzuzufügen
if (isset($addmember)):
?>
<FORM ACTION="<?php echo($PHP_SELF); ?>" METHOD="POST">
<P>Mitglied hinzufügen:<BR>
<table width="450" border="0" cellpadding="1" cellspacing="1" bordercolor="#0000FF">
<tr>
<td>Msnumber</td>
<td>
<input name="msnumber" type="text" size="3" />
<?php echo $_POST["msnumber"]; ?></td>
</tr>
<tr>
<td> Name </td>
<td>
<input name="Name" type="text" size="60" />
<?php echo $_POST["Name"]; ?></td>
</tr>
</table>
</FORM>
<?php
else:
// Connect to the database server
$status = @mysql_connect("localhost", "root", "password");
if (!$status)
{
echo( "<p>Unable to connect to the database server at this time.</p>" );
exit();
}
// Select the training database
if (! @mysql_select_db("training") )
{
echo( "<p>Unable to locate the training database at this time.</p>" );
exit();
}

// Ein neues Mitglied wird in die Datenbank eingetragen.
if ("SUBMIT" == $submitmember)
{
$sql = "INSERT INTO memberslist SET Name='$name', Joindate=CURDATE()";
if (mysql_query($sql))
{
echo("<P>Your member has been added.</P>");
} else
{
echo("<P>Error adding submitted member: " .
mysql_error() . "</P>");
}
}
// Wenn ein Mitglied gelöscht ist, wird es aus der Datenbank entfernt.
if (isset($deletemember))
{
$sql = "DELETE FROM memberslist WHERE msnumber = $deletemember";

if (mysql_query($sql))
{
echo("<P>Das Mitglied ist entfernt worden.</P>");
}
else
{
echo("<P>Fehler beim Entfernen vom Mitglied: " . mysql_error() . "</P>");
}
}
echo("<P> Hier sind alle Mitglieder in der Datenbank: </P>");

// Information aller Mitglieder abfragen
$result = mysql_query("SELECT * FROM memberslist ORDER BY Name ASC");
if (!$result)
{
echo("<P>Fehler beim Aufruf aller Mitglieder: " .
mysql_error() . "</P>");
exit();
}
// Information in einer Tabelle darstellen mit delete link neben jedem Mitglied

$num = mysql_num_rows($result);

// Tabellenbeginn
echo "<table border>";

// Überschrift
echo "<tr><td>No</td> <td>msnumber</td> <td>Name</td>";
echo "<td>Address</td>";
echo "<td>member since</td><td>Delete</td>
</tr>";

for ($i=0; $i<$num; $i++)
{
$ID = mysql_result($result, $i, "msnumber");
$name = mysql_result($result, $i, "Name");
$pn = mysql_result($result, $i, "Address");
$ms = mysql_result($result, $i, "joindate");

$lf = $i + 1;

// Tabellenzeile mit -zellen
echo "<tr> <td>$lf</td>";
echo "<td>$ID</td>";
echo "<td>$name</td>";
echo "<td>$pn</td>";
echo "<td>$ms</td>";

echo "<td><a href='$PHP_SELF?deletemember=$ID'>Delete</a></td>
</tr>";
}

// Tabellenende
echo "</table>";

//dies mit der Namen Variable vorneweg funktioniert auch nicht
//echo("<P>$name<A HREF='$PHP_SELF?deletemember=$ID'>Delete this member</A></P>");

// dieser link ruft die Seite auf (klappt aber nicht)
// mit der Mitgliedsform zum Eingeben neuer Mitglieder.
echo("<P><A HREF='$PHP_SELF?addmember=1'>" .
"Add a member!</A></P>");
endif;
?>

</body>
</html>
X

Löschen von Daten aus einer Tabelle

flobaer
Beiträge gesamt: 317

24. Sep 2007, 11:03
Beitrag # 2 von 7
Beitrag ID: #313771
Bewertung:
(1973 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

du übergibst die Variable per GET, prüfst aber auf eine lokale Variable, wenn ich das so auf die Schnelle richtig gesehen habe. Ich denke da liegt der Fehler.

Viele Grüße,
Florian


als Antwort auf: [#313764]

Löschen von Daten aus einer Tabelle

Marc Sidon
Beiträge gesamt: 262

24. Sep 2007, 11:12
Beitrag # 3 von 7
Beitrag ID: #313775
Bewertung:
(1972 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ fromNZ ] $sql = "DELETE FROM memberslist WHERE msnumber = $deletemember";


Da Du den Parameter als GET übergibst (also als Teil der URL) musst Du diesen auch als GET Parameter auslesen. In früheren Versionen konnte man die Parameter so auslesen, wie Du es jetzt gemacht hast. (In alten Büchern steht es auch noch so)

Bei neueren PHP Versionen muss man diese Parameter aber meist mit $_GET["Parametername"] auslesen. (Stichwort: SUPERGLOBALS)

In Deinem Fall musst Du die obige Zeile also ändern in
Code
$sql = "DELETE FROM memberslist WHERE msnumber = " . $_GET["deletemember"]; 


Man kann PHP zwar aus Kompatibilitätsgründen zu alten Programmen auch so einstellen, dass es auch weiterhin auf die von Dir genutzte Weise funktioniert (Stichwort: register_globals), sollte jedoch auch aus Sicherheitsgründen die neue Schreibweise verwenden.

Lies Dir mal folgendes durch:
http://phpforum.de/...ecurity.globals.html

Gruß,
Marc sidon


als Antwort auf: [#313764]

register_globals

fromNZ
Beiträge gesamt:

25. Sep 2007, 07:07
Beitrag # 4 von 7
Beitrag ID: #313934
Bewertung:
(1941 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

Vielen Dank für die prompte Hilfe. Es klappt! Allerdings nur auf dem remote Server, den ich auf gut Glück ausprobierte und nicht auf meinem Testserver. Ich bin euch sehr dankbar.

Dies wirft in mir eine weitere Frage auf und ich hoffe, dass ihr mir die beantworten könnt.

Wenn ich es richtig verstehe, ist register_globals eine Funktion (?) die älter ist, seit PHP 4 oder 5 auf "off" eingestellt ist und irgendwann ungültig werden soll.

Ist es weiterhin richtig: Die Variablen in ein Array, wie $_GET[variable] zu schreiben ist eine neuere Variante, die sich SUPERGLOBAL nennt und mit register_global weiter nichts zu tun hat?
Diese Formulierung sollte dann mit der Einstellung register_globals "off" funktionieren?

Ich stellte nun fest, dass in meinem Paket von XAMPP die register_global Funktion "off" ist, aber beim remote Server auf "on". Ich dachte, das wäre andersherum um zu funktionieren.

Oder geht es um eine ganz andere Einstellung, die unterschiedlich ist bei den beiden Servern? Ich habe die beiden Dateien info.php verglichen, wobei mir das meiste nichts sagt.

Die Datei php.ini in meinem XAMPP Testserver zu ändern hat nicht geklappt. Ich habe 4 Dateien gefunden, je zwei von PHP 4 und 5 und zum Testen bei allen die Einstellung von "off" auf "on" geändert, aber in der info.php Datei ist sie immer noch als "off" aufgeführt.

Das ist natürlich tödlich wenn ich nicht sicher sein kann, ob mein Testserver nun fehlerhafte Einstellungen hat oder ich als Anfänger mit dem Programmiercode nicht zurecht komme.

würde mich über eine Erleuchtung sehr freuen.

Liebe Grüsse aus Neuseeland

Birgit


als Antwort auf: [#313775]

register_globals

Marc Sidon
Beiträge gesamt: 262

25. Sep 2007, 07:31
Beitrag # 5 von 7
Beitrag ID: #313935
Bewertung:
(1937 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ fromNZ ] Wenn ich es richtig verstehe, ist register_globals eine Funktion (?) die älter ist, seit PHP 4 oder 5 auf "off" eingestellt ist und irgendwann ungültig werden soll.

register_globals ist nur eine Einstellung in der php.ini, die den internen Umgang mit globalen Variablen "regelt.

Antwort auf [ fromNZ ] Ist es weiterhin richtig: Die Variablen in ein Array, wie $_GET[variable] zu schreiben ist eine neuere Variante, die sich SUPERGLOBAL nennt und mit register_global weiter nichts zu tun hat?

Du SCHREIBST NIE bewusst in die SUPERGLOBALS! In dem Array $_GET steht automatisch ALLES, was in der URL als Parameter übergeben wurde; in $_POST das, was über ein POST Formular übergeben wurde.... Dort kannst Du es dann ausLESEN!
Wenn register_globals auf on steht, dann wird der Inhalt der Superglobals ($_GET, $_POST, ...) zusätzlich in lokale Variablen kopiert, ist also auf dem von Dir bislang bekannten Wege nutzbar.

Antwort auf [ fromNZ ] Diese Formulierung sollte dann mit der Einstellung register_globals "off" funktionieren?

Diese "neue" Schreibweise sollte in beiden Fällen funktionieren! Auch wenn register_globals auf on steht.

Antwort auf [ fromNZ ] Ich stellte nun fest, dass in meinem Paket von XAMPP die register_global Funktion "off" ist, aber beim remote Server auf "on". Ich dachte, das wäre andersherum um zu funktionieren.

Bei XAMPP gibt es genau drei php.ini Dateien (wenn ich nicht irre)! Eine für PHP4, eine für PHP5 und eine Aktive (wird von der jeweiligen Version kopiert)!
Such mal auf Deinem !Laufwerk! nach php.ini. Wenn ich mich nicht irre, stand eine davon im Windows Verzeichnis oder so. Das wäre dann die AKTIVE und DORT muss die Einstellung vorgenommen werden, damit es funktioniert.

Antwort auf [ fromNZ ] Oder geht es um eine ganz andere Einstellung, die unterschiedlich ist bei den beiden Servern? Ich habe die beiden Dateien info.php verglichen, wobei mir das meiste nichts sagt.

Wenn das mit den SUPERGLOBALS nicht klappt, müsste ich auch nochmal überlegen, was es noch sein könnte.....

Antwort auf [ fromNZ ]
Die Datei php.ini in meinem XAMPP Testserver zu ändern hat nicht geklappt. Ich habe 4 Dateien gefunden, je zwei von PHP 4 und 5 und zum Testen bei allen die Einstellung von "off" auf "on" geändert, aber in der info.php Datei ist sie immer noch als "off" aufgeführt.

Das ist natürlich tödlich wenn ich nicht sicher sein kann, ob mein Testserver nun fehlerhafte Einstellungen hat oder ich als Anfänger mit dem Programmiercode nicht zurecht komme.

Eigentlich brauchst Du register_globals nicht auf ON stellen. Es MUSS eigentlich reichen, wenn Du die neue SChreibweise für GET und POST Variablen benutzt!

Grüße aus Köln,
Marc Sidon

P.S.: Du musst natürlich auch
Code
if (isset($deletemember)) 

in
Code
if (isset($_GET["deletemember"])) 

ändern, damit es bei register_globals=off klappt!!! Also überall ändern, wo Du es benutzt! Oder alternativ am Anfang des Codes mal
Code
$deletemember = $_GET["deletemember"]; 

einfügen!


als Antwort auf: [#313934]
(Dieser Beitrag wurde von Doc am 25. Sep 2007, 07:37 geändert)

register_globals

fromNZ
Beiträge gesamt:

25. Sep 2007, 07:58
Beitrag # 6 von 7
Beitrag ID: #313937
Bewertung:
(1923 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Vielen vielen Dank,

diese Auskunft ist ja super. Es hat auf meinem Testserver geklappt.
Natürlich habe ich in meiner Verwirrung nicht daran gedacht, die Zeile
if (isset($_GET["deletemember"]))
zu ändern.

Ich hoffe, dass ich irgendwann die vielen neuen Fachausdrücke im Griff habe und mich mit sinnvollen Antworten als Hilfe revanchieren kann.

Liebe Grüsse
Birgit


als Antwort auf: [#313934]

register_globals

swisscheese
Beiträge gesamt: 387

25. Sep 2007, 08:03
Beitrag # 7 von 7
Beitrag ID: #313940
Bewertung:
(1923 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ fromNZ ] Die Datei php.ini in meinem XAMPP Testserver zu ändern hat nicht geklappt. Ich habe 4 Dateien gefunden, je zwei von PHP 4 und 5 und zum Testen bei allen die Einstellung von "off" auf "on" geändert, aber in der info.php Datei ist sie immer noch als "off" aufgeführt.

Das Ändern der ini-Datei erfordert ein Neustart von Apachee, sonst ändert sich nichts. Aber wie oben aufgeführt: register_globals sollte "off" bleiben, und das Skript sollte angepasst werden.
Gruss swisscheese


als Antwort auf: [#313934]
X