Ratlos: Zeilen aus Tabelle löschen...

Hallo Coummunity,

ich habe per PHP Daten aus meiner Datenbank in eine Tabelle eingelesen. Hinter jeder Tabellenspalte möchte ich nun einen Löschen und einen Bearbeitungsbutton machen, bzw sind diese angelegt aber funktionieren nicht bzw. nicht richtig. Meine Tabellenreihen und Buttons haben jeweils die selbe id, diese id entspricht ist die selbe, welche in der Datenbank vergeben wird. Hier mal ein kleiner Ausschnitt aus meinem Code zum löschen...

  
echo "\t<td><input type=\"Button\" name=\"Bearbeiten\" value=\"Bearbeiten\"></td>\n";  
		echo "\t<td><input type=\"submit\" name=\"loeschen\" id=\"$line[id]\"  value=\"Löschen\"></td>\n";  
		echo "\t<td>$line[id]</td>\n";  
		echo "\t<input type=\"hidden\" name=\"id\" value=\"$line[id]\">";  
		echo "\t</tr>\n";  
	}  
		echo "</table>\n";  
		$weg = "DELETE FROM meine_tabelle WHERE id = $_POST[id]";  
		$result = pg_query($weg);  
		if ($_POST['loeschen'])  
		{  
			$result;	  
		}  

$line[id] bezieht sich auf den Wert den ich mittels fetch_array aus der Datenbank gezogen habe... Wenn ich nun auf löschen gehe löscht es nach einem Doppelklick jedoch immer die letze zeile der Tabelle weg. Ich hab nun schon gegoogelt und rumprobiert, jedoch nichts gefunden. Mir fehlt der Bezug auf die "rowid".

  1. hi,

    nicht mit echo html ausgeben. Sonder PHP in HTML einbetten <p><?php echo $meineVar?></p> und ggfs. für if, while, switch, foreach PHPs alternative Syntax nutzen.

    Ansonsten gib Dir doch mal die fragliche ID erstmal aus in deine Rückmeldeskript, damit du siehst, welcher Wer übergeben wird ...;

    mfg

    tami

    1. hi,

      nicht mit echo html ausgeben. Sonder PHP in HTML einbetten <p><?php echo $meineVar?></p> und ggfs. für if, while, switch, foreach PHPs alternative Syntax nutzen.

      Soll ich aber zu Übung erstmal so machen, um alle Möglichkeiten in PHP kennen zu lernen...

      Ansonsten gib Dir doch mal die fragliche ID erstmal aus in deine Rückmeldeskript, damit du siehst, welcher Wer übergeben wird ...;

      Das bringt mir auch nicht viel, da ich ja bereits weiß, das immer der letze Wert übergeben wird...

  2. Du hast Deinen Code getestet?

    Variante 1:

    <?php
    $line[1]='foo';
    $id=1;
    echo "\t<input type="hidden" name="id" value="$line[id]">\n\n";
    ?>

    ...

    PHP Notice:  Undefined index: id in /tmp/test.php on line 4
            <input type="hidden" name="id" value="">

    Variante 2:

    <?php
    $line[1]='foo';
    $id=1;
    echo "\t<input type="hidden" name="id" value="$line[$id]">\n\n";
    ?>
    ...
    <input type="hidden" name="id" value="foo">

    Doch auch die Ausgabe mit den vielen Echos ist nicht optimal.

    Jörg Reinholz

    1. Nachtrag:

      Ich lese gerde, Du lernst noch. Dann noch ein Rat: Lerne das Error-Reporting zu nutzen:

      Jörg Reinholz

    2. Variante 2:

      <?php
      $line[1]='foo';
      $id=1;
      echo "\t<input type="hidden" name="id" value="$line[$id]">\n\n";
      ?>
      ...
      <input type="hidden" name="id" value="foo">

      Auch wenn ich mir bei folgender Frage ziemlich dumm vorkomme, weiß ich leider immer noch nicht, wie dein Code mir bei der Lösung meines Problemes helfen soll... auch wieso du die $id auf 1 setzt wird mir nicht klar..

      1. Auch wenn ich mir bei folgender Frage ziemlich dumm vorkomme, weiß ich leider immer noch nicht, wie dein Code mir bei der Lösung meines Problemes helfen soll

        Ganz einfach: In Deinem Code fehlt das $ vor id. Das führt zum Fehler.

        ... auch wieso du die $id auf 1 setzt wird mir nicht klar..

        Weil die Variable auch für meinen Test einen Wert haben muss - der dann auch benutzt werden kann um ein existierendes Element des Arrays $line[] zu adressieren.

        Jörg Reinholz

        1. Ganz einfach: In Deinem Code fehlt das $ vor id. Das führt zum Fehler.

          id ist in meinem Fall ja keine Variable sondern spricht lediglich den Datensatz "id" in meiner Datenbank an, welcher im array "$line" gespeichert wurde.

          Weil die Variable auch für meinen Test einen Wert haben muss - der dann auch benutzt werden kann um ein existierendes Element des Arrays $line[] zu adressieren.

          Die ids werden ja schon in meiner Datenbank vergeben und ich beziehe mich nur auf diese, deshalb kann ich doch keine neuen Werte in die variablen schreiben?

          1. Vlt hilft ja mein gesamter Code mal...

              
            <?php  
            	$db = pg_connect("host=******* port=**** dbname=***** user=**** password=******");  
            	$query = "SELECT vorname, nachname, straße, hausnummer, plz, ort, vorwahl, telefonnummer, durchwahl, handynummer, id FROM meine_tabelle";  
            	$result = pg_query($query);  
            	  
            	echo "<form name=\"files\" action=\"Dbfiles.php\" method=\"post\">";  
            	echo "\t<table border = 2>\n";  
            	echo "\t<th>Vorname</th>\n";  
            	echo "\t<th>Nachname</th>\n";  
            	echo "\t<th>Straße</th>\n";  
            	echo "\t<th>Hausnummer</th>\n";  
            	echo "\t<th>PLZ</th>\n";  
            	echo "\t<th>Ort</th>\n";  
            	echo "\t<th>Vorwahl</th>\n";  
            	echo "\t<th>Telefonnummer</th>\n";  
            	echo "\t<th>Durchwahl</th>\n";  
            	echo "\t<th>Handynummer</th>\n";  
            	  
            	while ($line = pg_fetch_array($result, null, PGSQL_BOTH))  
            	{  
            		  
            		if (($line[id] % 2) == 0)  
            		{  
            			$hintergrund = " style='background:#D0D0D0'";  
            			  
            		}  
            		elseif (($line["id"] % 2) == 1)  
            		{  
            			$hintergrund = " style='background:#808080'";  
            			  
            		}  
            		  
            		echo "\t<tr$hintergrund id = $line[id]>\n";  
            		echo "\t<td>$line[vorname]</td>\n";  
            		echo "\t<td>$line[nachname]</td>\n";  
            		echo "\t<td>$line[straße]</td>\n";  
            		echo "\t<td>$line[hausnummer]</td>\n";  
            		echo "\t<td>$line[plz]</td>\n";  
            		echo "\t<td>$line[ort]</td>\n";  
            		echo "\t<td>$line[vorwahl]</td>\n";  
            		echo "\t<td>$line[telefonnummer]</td>\n";  
            		echo "\t<td>$line[durchwahl]</td>\n";  
            		echo "\t<td>$line[handynummer]</td>\n";  
            		echo "\t<td><input type=\"Button\" name=\"Bearbeiten\" value=\"Bearbeiten\"></td>\n";  
            		echo "\t<td><input type=\"submit\" name=\"loeschen\" id=\"$line[id]\" value=\"Löschen\"></td>\n";  
            		echo "\t<td>$line[id]</td>\n";  
            		echo "\t<input type=\"hidden\" name=\"id\" value=\"$line[id]\">";  
            		echo "\t</tr>\n";  
            	}  
            		echo "</table>\n";  
            		echo $_POST["id"];  
            		$weg = "DELETE FROM meine_tabelle WHERE id = '$_POST[$id]'";  
            		$result = pg_query($weg);  
            		if ($_POST['loeschen'])  
            		{  
            			$result;	  
            		}  
            		  
            		echo "</form>\n";  
            		  
            		 pg_close($db);  
            ?>  
            
            
            1. Vlt hilft ja mein gesamter Code mal...

                $weg = "DELETE FROM meine\_tabelle WHERE id = '$\_POST[$id]'";  
              

              Dein Code ist viel zu unübersichtlich.

              Mach doch einfach mal ein die("<pre>$weg</pre>"); statt die Abfrage abzusenden und schau Dir an, was Du da wirklich erzeugst.

              Dein Code enthält keinerlei Fehlerbehandlung - was falsch ist - und vor allem sehe ich immer noch nichts davon, dass Du Dir Fehler und Notizen ausgeben lässt.

              Ohne das geht es nicht vorwärts.

              Das hier ist falsch:

              echo "\t<td>$line[plz]</td>\n";
              echo "\t<td>$line[ort]</td>\n";
              echo "\t<td>$line[vorwahl]</td>\n";

              Ändere das in etwas wie:

              echo "
              \t<td>" . htmlspecialchars($line['plz']) .     "</td>
              \t<td>" . htmlspecialchars($line['ort']) .     "</td>
              \t<td>" . htmlspecialchars($line['vorwahl']) . "</td>
              ";

              Noch besser: Trenne HTML und Programm. Stichwort "Templates". Bei Dir geht es durcheinander wie Kraut und Rüben. Du musst wahrscheinlich erst noch merken, wie ungünstig das ist.

              Jörg Reinholz

              1. hi,

                Noch besser: Trenne HTML und Programm. Stichwort "Templates". Bei Dir geht es durcheinander wie Kraut und Rüben. Du musst wahrscheinlich erst noch merken, wie ungünstig das ist.

                https://forum.selfhtml.org/?t=215053&m=1472220

                var_dump($_POST); könnte auch helfen helfen ...;

                mfg

                tami

          2. id ist in meinem Fall ja keine Variable sondern spricht lediglich den Datensatz "id" in meiner Datenbank an, welcher im array "$line" gespeichert wurde.

            Wenn es der String mit dem Wert 'id' ist, dann musst Du auch $line['id'] notieren.

            Jörg Reinholz

            1. Tach!

              id ist in meinem Fall ja keine Variable sondern spricht lediglich den Datensatz "id" in meiner Datenbank an, welcher im array "$line" gespeichert wurde.
              Wenn es der String mit dem Wert 'id' ist, dann musst Du auch $line['id'] notieren.

              Nein. In seinem Code steht sinngemäß "bla $array[key] fasel", und das ist nach PHP-Syntax-Regeln völlig korrekt. Die vorgeschlagenen Anführungszeichen innerhalb eines ""-Strings würden zwingend auch noch ein {}-Klammernpaar erfordern.

              dedlfix.

  3. Tach!

    [...] funktionieren nicht bzw. nicht richtig. [...]

    Präzisiere bitte diese Aussage! Was genau erwartest du und was tritt nicht ein. Bitte aus der Programmierersicht schauen, also inklusive Kontrollausgaben der beteiligten Variablen.

    Hier mal ein kleiner Ausschnitt aus meinem Code zum löschen...

    Ist es ein PHP-Problem? Sprich: hast du ein Problem mit der Verarbeitung oder dem Erstellen der Tabelle? Ist der erzeugte HTML-Code erwartungsgemäß? Kommt beim Formular-Absenden alles richtig im $_POST-Array mit?

      $weg = "DELETE FROM meine\_tabelle WHERE id = $\_POST[id]";  
    

    Was passiert wohl, wenn ich dir einen Request mit "0 or 1" sende? Kontextwechsel beachten und diese häufigste aller Sicherheitslücken (SQL-Injection) vermeiden!

    Ich hab nun schon gegoogelt und rumprobiert, jedoch nichts gefunden.

    Rumprobieren ist, ein Feuer zu löschen, indem man einfach mal alles mögliche draufwirft. Zielstebiger ist es, erst einmal nachzusehen, was da brennt um dann eine geeignete Gegenmaßname zu suchen. Programmieren im Labor ist sogar noch einfacher, weil einem da kein Zeitdruck im Nacken sitzt. Also bitte genau hinsehen und beschreiben, was im Detail wunschgemäß klappt und was nicht!

    dedlfix.

    1. hi,

      Rumprobieren ist, ein Feuer zu löschen, indem man einfach mal alles mögliche draufwirft. Zielstebiger ist es, erst einmal nachzusehen, was da brennt um dann eine geeignete Gegenmaßname zu suchen. Programmieren im Labor ist sogar noch einfacher, weil einem da kein Zeitdruck im Nacken sitzt. Also bitte genau hinsehen und beschreiben, was im Detail wunschgemäß klappt und was nicht!

      Das Problem isolieren, wäre auch nicht schlecht. Ist aber wohl das selbe, was du sagst. Mit Isolierung wäre aber auch gemeint, quasi eine Mini-Test-Umgebung nur für das Problem zu bauen. Eine Tabelle per HTML kurz schreiben, die ID per Post übergeben und dann gucken (einige kennen ja var_dump() nicht), was man mit var_dump($_REQUEST) erhält ...;

      mfg

      tami

      1. Tach!

        Das Problem isolieren, wäre auch nicht schlecht. Ist aber wohl das selbe, was du sagst. Mit Isolierung wäre aber auch gemeint, quasi eine Mini-Test-Umgebung nur für das Problem zu bauen.

        Der Aufwand lohnt sich eigentlich erst bei einigermaßen hartnäckigen Fällen, denen mit ein paar einfachen var_dump()s nicht auf die Schliche zu kommen ist. Soweit ist die Problem-Analyse aber noch gar nicht fortgeschritten. Erstmal klein anfangen, auch beim Debuggen.

        dedlfix.

        1. hi,

          Tach!

          Das Problem isolieren, wäre auch nicht schlecht. Ist aber wohl das selbe, was du sagst. Mit Isolierung wäre aber auch gemeint, quasi eine Mini-Test-Umgebung nur für das Problem zu bauen.

          Der Aufwand lohnt sich eigentlich erst bei einigermaßen hartnäckigen Fällen, denen mit ein paar einfachen var_dump()s nicht auf die Schliche zu kommen ist. Soweit ist die Problem-Analyse aber noch gar nicht fortgeschritten. Erstmal klein anfangen, auch beim Debuggen.

          Naja, wenn man den Code beim nächsten Mal aber auf diese Weise aufbaut? Und immer nur _einen_ Schritt macht! Dann weiß man immer, wo der Fehler liegen muss und wo er nicht liegen kann. Dazu zählt ja auch, den Code "lesbar" zu machen, was nur dann der Fall ist (außer mit speziellen Editoren), wenn PHP in HTML eingebettet ist und nicht umgekehrt. Etwas auszuechoen ist kein besonderes Merkmal von PHP. In HTML eingebettet zu seine und eine alternative Syntax extra für Kontrollstrukturen zu haben wohl.

          mfg

          tami