Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Anfänger: Datensatz löschen





Frage

Hallo, in meinem unten aufgeführten Script möchte ich Datensätze aus der Tabelle training ausgeben und über einen Link auf "löschen" die Möglichkeit geben einzelne Datensätze zu löschen.Um trotz Löschens auf der gleichen Seite bleiben zu können, habe ich die Fuktion $_SERVER['PHP_SELF'] benutzt. Beim Anklicken des Links wird entrydel auf "yes" gesetzt. Wird die Seite dann ein zweites Mal geladen, so wird am Anfang abgefragt ob entrydel=yes und wenn ja, dann wird die Funktion zum Löschen des Datensatzes (mit der übergebenen ID) ausgeführt.Das Problem ist, dass beim Anklicken des Links rein garnichts passiert.Hat von euch jemand eine Ahnung wo der Fehler liegen könnte?? <?php echo ' <html> <head> <title>Admin Area: Trainingsplan</title>'; $db = mysql_connect("localhost", "root", "xxx"); mysql_select_db("avalon",$db); // wenn entrydel==yes, dann Datenbankeintrag löschen if ($entrydel == yes) { $löschen = mysql_query('DELETE FROM training WHERE id =id'); } echo ' <table border=1> <tr> '; $abfrage = "SELECT id, day, start, end, description FROM training"; $ergebnis = mysql_query($abfrage); while($row = mysql_fetch_object($ergebnis)) { echo '<td width="10%">'; echo $row->day; echo '</td>'; echo '<td width="10%">'; echo $row->start; echo '</td>'; echo '<td width="10%">'; echo $row->end; echo '</td>'; echo '<td width="10%">'; echo $row->description; echo '</td>'; echo '<td width="10%">'; $id = $row->id; echo '<a href="'.$_SERVER['PHP_SELF'].'?entrydel=yes&id='.$id.'">löschen</a>'; echo '</td></tr>'; } echo ' </table> '; echo '</html>'; ?> Danke, Udo

Antwort 1 von semi

WHERE id=$id

:)

Antwort 2 von Udo1981

Hallo semi,

danke - hast recht! Aber klappt trotzdem noch nicht. Wenn ich mit der Maus über den Link fahre ohne zu klicken, zeigt es im Browser auch die richtige ID an, das muss also jetzt passen....

Gruss, Udo

Antwort 3 von semi

Ist dieses yes eine definierte Konstante?
Wenn nicht, dann fählen Anführungszeichen.

if ($entrydel == 'yes')
{
  echo "Here I am";
  $loeschen = ...
}
oder

if (strcmp($entrydel, 'yes')==0)
{
  $loeschen = ...
}
Verwende auch keine Umlaute im Code. Ansonsten fehlt noch die Fehlerbehandlung für den Fall, dass die Verbindung oder die Abfragen scheitern. (Datenbank nicht verfügbar, Server wech :) etc.)



Antwort 4 von TombDevil

Hallo Udo,

Du musst Deine Lösch-Anweisung in doppelte Hochkommas stellen, da ansonst der Text $id und nicht der Inhalt der Variable $id in Deinem SQL-Call steht, also

"DELETE FROM training WHERE id=$id"

oder auch möglich als Verknüpfung

'DELETE FROM training WHERE id='.$id


Hoffe so funktionierts

Gruss, TombDevil

Antwort 5 von Udo1981

Hallo semi und TombDevil,

danke auch euch für euere Antworten, aber leider passiert bei mir immer noch nichts.Die id müsste auch richtig übermittelt werden, da sie bei MouseOver wie gesagt im Browser angezeigt wird...

Ich hab euere Verbessereungsvorschläge eingebaut und hier nochmal meinen Code:

<?php

//$name = $_POST['name'];
//$pass = $_POST['pass'];

$name = "admin";
$pass = "avalon";

if ($name <> "admin" OR $pass<>"avalon")

{
echo 'Falscher Benutzername oder falsches Passwort';
echo '<meta http-equiv="refresh" content="0; URL=admin.html">';
die;
}
else
{


echo '
<html>

<head>
<title>Admin Area: Avalon Trainingsplan</title>';

$db = mysql_connect("localhost", "root", "xxx");
mysql_select_db("avalon",$db);



// wenn entrydel==yes, dann Datenbankeintrag löschen
if ($entrydel == 'yes')
{
$loeschen = mysql_query('DELETE FROM training WHERE id =$id');
}




echo '
<table border=1>
<tr> ';
$abfrage = "SELECT id, day, start, end, description FROM training";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
echo '<td width="10%">';
echo $row->day;
echo '</td>';
echo '<td width="10%">';
echo $row->start;
echo '</td>';
echo '<td width="10%">';
echo $row->end;
echo '</td>';
echo '<td width="10%">';
echo $row->description;
echo '</td>';
echo '<td width="10%">';
$id = $row->id;
echo '<a href="'.$_SERVER['PHP_SELF'].'?entrydel=yes&id='.$id.'">löschen</a>';
echo '</td></tr>';
}

echo '
</table>
';

echo '</html>';
}
?>

Gruss, Udo

Antwort 6 von f*euervogel

lesen kommt außer mode?

$loeschen = mysql_query('DELETE FROM training WHERE id =$id');

woher kommt $id??? ich sehs nirgends in deinem script übergeben.

variablen zwischen einfachen anführungszeichen werden nicht interpoliert. dies sagte dir schon TombDevil in antwort 4.

Antwort 7 von Udo1981

@f*euervogel:

Ich hab den Tip von TombDevil ja berücksichtigt und auch seine 2. Variante ausprobiert, aber an der id liegt es nicht. Ich seh ja bei Mouseover im Browser, dass die richtige ID übergeben wird.

Ich hab grad mal testweise HALLO ausgeben lassen, statt die Löschroutine auszuführen und es ist kein Hallo erschienen - sagt mir dann wohl dass die Schleife garnicht ausgeführt wird...

Gruss, Udo

Antwort 8 von semi

Lass mal das hier laufen.
<?php
print_r($_POST);
print_r($_GET);
?>
Was kommt?

Antwort 9 von Nitrosamin

Hi,
mal nen Anfängertip (bin ich ja noch), Lass Dir mal im Script alle Varis ausgeben. So ala echo. Vielleicht fehlt da was. Will ja nicht klug-protzen, aber hatte auch schon solche leichten Fehler.


Nitro

Antwort 10 von TombDevil

Hi Udo,

normalerweise müsste Dein Prog in die DELETE-Schleife gehen wenn Du auf den Link klickst, ausser Du hast in der php.ini folgende Einstellung:

register_globals = Off

dann werden nämlich die übergebenen Variablen nicht globalisiert, sondern sind nur in den sog. Superglobals als Array gespeichert. In Deinem Fall wären das dann die Variablen

$_GET['entrydel'] statt $entrydel
$_GET['id'] statt $id

Wenn Du nicht unterscheiden willst ob die Variablen mittels GET (via Link) oder POST (via FORM) übergeben werden, dann kannst Du auch mit der Superglobalen $_REQUEST arbeiten.

Dein Prog müsstest Du also so umändern:

if ($_GET['entrydel'] == 'yes')
{
$loeschen = mysql_query('DELETE FROM training WHERE id='.$_GET['id']);
}


oder Du schaltest einfach in der php.ini "register_globals" auf On.


So müsste es nun auf alle Fälle klappen.

Gruss, TombDevil


Antwort 11 von f*euervogel

Zitat:
Ich hab den Tip von TombDevil ja berücksichtigt und auch seine 2. Variante ausprobiert, aber an der id liegt es nicht. Ich seh ja bei Mouseover im Browser, dass die richtige ID übergeben wird.


$loeschen = mysql_query('DELETE FROM training WHERE id =$id');

warum stehen dann immer noch einfache anführungszeichen da??? wie gesagt, lesen kommt wohl außer mode: du bist dir schon bewusst, was "interpoliert" bedeutet? demnach ist deine aussage sinnfrei. nun weil eine variable in einem url oben drin steht, heißt es nicht, dass sie im script existiert. selbst wenn, würde der inhalt der variablen in deinem sql-statement nicht ausgegeben werden, da du ' benutzt.

Zitat:
woher kommt $id???


wie kommt die variable von dem url in dein script? diese frage besteht noch.

Zitat:
oder Du schaltest einfach in der php.ini "register_globals" auf On.


REGISTER_GLOBALS auf ON zu schalten ist ein großes sicherheits risiko!!!

Antwort 12 von TombDevil

@f*euervogel

Udo bekommt seine Variablen durch den Link
<a href="'.$_SERVER['PHP_SELF'].'?entrydel=yes&id='.$id.'">löschen</a>


Hier wird "entrydel" und "id" definiert.

@Udo
Kleiner Zusatz noch, damit Deine Tabelle korrekt aufgebaut wird musst Du <tr> in die WHILE-Schleife reinnehmen. Ich nehm mal an Du willst jeden Datensatz in einer eigenen Zeile haben, oder?

Gruss, TombDevil

Antwort 13 von f*euervogel

sag mal...wollt ihr hier irgendwen herausfordern oder warum stellt ihr euch so dumm?

Zitat:
@f*euervogel

Udo bekommt seine Variablen durch den Link

<a href="'.$_SERVER['PHP_SELF'].'?entrydel=yes&id='.$id.'">löschen</a>


IRGENDWO im script muss es sich doch diese variable holen...

$id = $_GET[ 'id' ];

selbst wenn dies dort stehen würde - was ich nicht glaube - brächte

echo '$id';

gar nüscht.

sowas steht auf den ersten seiten jedes simplen tutorials. aber lesen kommt außer mode, langsam bin ich mir sicher.

Antwort 14 von f*euervogel

zudem würde ein link auf die aktuelle php-konfiguration ne menge helfen. denn ich hab keine glaskugel vor dem pc und könnte selbst dann nicht hellsehen.

Antwort 15 von Udo1981

Ok, bevor ich hier noch Streit ins Forum bringe :-) Gehn wir mal von der Sache mit dem Löschen weg - ich hab sämtliche Vorschläge bzgl. richtiger id-Schreibweise ausprobiert und es wird auch im Browser, wenn ich über den Link "Löschen" mit der Maus fahre richtigerweise "id=3", "id=4" usw. angezeigt. Das Problem ist, dass das Programm nicht an die Stelle kommt, wo die Löschfunktion ausgeführt werden soll. Ich hab jetzt die Löschoperation auskommentiert und durch ein Echo ersetzt - das müsste mir ja sagen, dass die Programmstelle nicht erreicht wird, wenn HALLO nicht ausgegeben wird...?!



if ($entrydel == yes)
{
//$löschen = mysql_query('DELETE FROM training WHERE id =id');

echo 'TEST TEST: Wenn das hier ausgegeben wird, dann wird die Programmstelle erreicht';
}

Gruss, Udo

Antwort 16 von Udo1981

Achja, und hier noch wie gewünscht meine PHP-Konfiguration (hab mich auf wichtige Teile beschränkt, da es sonst zu lang ist, es handelt sich aber um die reine Grundkonfiguration von PHP 4.3.1)

PHP Version 4.3.1

System Linux ued 2.4.20-4GB-athlon #1 Mon Apr 26 16:40:46 UTC 2004 i686
Build Date Apr 18 2003 09:11:44

Directive Local Value Master Value
allow_call_time_pass_reference On On
allow_url_fopen On On
always_populate_raw_post_data Off Off
arg_separator.input & &
arg_separator.output & &
asp_tags Off Off
auto_append_file no value no value
auto_prepend_file no value no value
browscap no value no value
default_charset no value no value
default_mimetype text/html text/html
define_syslog_variables Off Off
disable_functions no value no value
display_errors On On
display_startup_errors Off Off
doc_root no value no value
docref_ext no value no value
docref_root http://www.php.net/ http://www.php.net/
enable_dl On On
error_append_string no value no value
error_log no value no value
error_prepend_string no value no value
error_reporting 2039 2039
expose_php On On
extension_dir /usr/share/extensions/no-debug-non-zts-20020429 /usr/share/extensions/no-debug-non-zts-20020429
file_uploads On On
gpc_order GPC GPC
highlight.bg #FFFFFF #FFFFFF
highlight.comment #FF8000 #FF8000
highlight.default #0000BB #0000BB
highlight.html #000000 #000000
highlight.keyword #007700 #007700
highlight.string #DD0000 #DD0000
html_errors On On
ignore_repeated_errors Off Off
ignore_repeated_source Off Off
ignore_user_abort Off Off
implicit_flush Off Off
include_path .:/usr/share/php .:/usr/share/php
log_errors Off Off
log_errors_max_len 1024 1024
magic_quotes_gpc On On
magic_quotes_runtime Off Off
magic_quotes_sybase Off Off
max_execution_time 30 30
max_input_time 60 60
memory_limit 8M 8M
open_basedir no value no value
output_buffering no value no value
output_handler no value no value
post_max_size 8M 8M
precision 12 12
register_argc_argv On On
register_globals Off Off
report_memleaks On On
safe_mode Off Off
safe_mode_exec_dir no value no value
safe_mode_gid Off Off
safe_mode_include_dir no value no value
sendmail_from me@localhost.com me@localhost.com
sendmail_path /usr/sbin/sendmail -t -i /usr/sbin/sendmail -t -i
short_open_tag On On
SMTP localhost localhost
smtp_port 25 25
sql.safe_mode Off Off
track_errors Off Off
unserialize_callback_func no value no value
upload_max_filesize 2M 2M
upload_tmp_dir no value no value
user_dir no value no value
variables_order EGPCS EGPCS
xmlrpc_error_number 0 0
xmlrpc_errors Off Off
y2k_compliance On On

Antwort 17 von semi

Wie ist die Ausgabe aus 'Antwort 8'?
register_globals sollte bei dir On sein oder die Bedingung

if ($_GET['entrydel'] == 'yes')
{
$loeschen = mysql_query('DELETE FROM training WHERE id = ' . $_GET['id']);
}

Wenn register_globals Off ist, dann kannst Du auf übergebene Daten nur über die Arrays $_GET und $_POST zugreifen. Also statt $id $_GET['id']

Antwort 18 von f*euervogel

nur, weil du bei dem link bei mousehover die id siehst, heißt das nicht, dass sie im script vorhanden ist.

das ist das gleiche mit entrydel.

wie oft soll ich das noch wiederholen?

Zitat:
link auf die aktuelle php-konfiguration


aber das mit dem lesen hatten wir ja schon.

Antwort 19 von f*euervogel

wenn jetzt in einer halben stunde nicht die richtige lösung von tombdevil oder udo da steht, sag ich gar nichts mehr. die lösung liegt wirklich sowas von offen vor euch...

Antwort 20 von semi

@f*euervogel
?

Antwort 21 von TombDevil

@f*euervogel

Zitat:
IRGENDWO im script muss es sich doch diese variable holen...


Richtig, und zwar beim ersten Programmdurchlauf in der Zeile
$id = $row->id;

Diese id, z.B. 4 übergibt er dann mittels dem Link
<a href="'.$_SERVER['PHP_SELF'].'?entrydel=yes&id='.$id.'">löschen</a>

dem zweiten Programmdurchlauf als Superglobal $_GET['id'], wenn man auf [löschen] klickt.

Bei einer Einstellung von register_globals = On (was Udo allerdings laut seiner Config nicht hat) erledigt php den Rest, d.h. es wandelt alle Keys der Superglobals in Globals um, sprich $_GET['id'] stellt es auch als $id (ausserhalb einer Funktion) oder $GLOBALS['id'] (in einer Funktion) zur Verfügung.

So würde Antwort 4 funktionieren.

Bei register_globals = Off funktionieren Antwort 10 oder 17.

Probiers aus...


Gruss, TombDevil

Antwort 22 von f*euervogel

witzig.

$_GET['id']

klaro. mir musst du das nicth erzählen...

<?php

echo '
<html>

<head>
<title>Admin Area: Trainingsplan</title>';

$db = mysql_connect("localhost", "root", "xxx");
mysql_select_db("avalon",$db);



// wenn entrydel==yes, dann Datenbankeintrag löschen
if ($entrydel == yes)
{
$löschen = mysql_query('DELETE FROM training WHERE id =id');
}




echo '
<table border=1>
<tr> ';
$abfrage = "SELECT id, day, start, end, description FROM training";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
echo '<td width="10%">';
echo $row->day;
echo '</td>';
echo '<td width="10%">';
echo $row->start;
echo '</td>';
echo '<td width="10%">';
echo $row->end;
echo '</td>';
echo '<td width="10%">';
echo $row->description;
echo '</td>';
echo '<td width="10%">';
$id = $row->id;
echo '<a href="'.$_SERVER['PHP_SELF'].'?entrydel=yes&id='.$id.'">löschen</a>';
echo '</td></tr>';
}

echo '
</table>
';

echo '</html>';
?>


aber wo findet sich hier $_GET[ 'id' ] ??? nirgends vielleicht? oder siehst du was, was ich nicht sehe?

dass register_globals auf off sind, ist mittlerweile ein alter schuh.

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: