• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Wie ändere ich einen Datenbank-Eintrag mit einem Link statt Auswahl

marcelgerard

Mitglied
Moin Leute,

ich bin noch ganz neu in der Materie PHP und lese mich Stück für Stück durch meine Bücher und lerne täglich Neues dazu. Doch leider ist nicht alles so optimal erklärt oder die Beispiele nicht sofort einleuchtend. Ich habe ein eigenes Formular gebaut, mit dem ich Daten eintragen kann, die in der Datenbank gespeichert werden.

Dazu hab ich eine kleine Test-Tabelle gebaut, die die Daten anzeigt. Funktioniert alles super! In meinem Buch wird nun erklärt, wie man Datenbank-Inhalte ändert, also über das Formular und hier bleibe ich hängen. Denn im Beispiel reagiert die Aktion auf ein "type=radio" und ich hätte gerne, dass dies mit einem Link passiert. Also statt, dass ich den Button auswähle, welchen ich ändern möchte, will ich einen Link z.B "Ändern".

Hier der Code mit Type-Radio: (ist alles lokal)

PHP:
<form action = "db_einzel_b.php" method = "post">
<?php
   $con = mysqli_connect("", "root", "", "firma");
   $res = mysqli_query($con, "SELECT * FROM personen");

   // Tabellenbeginn
   echo "<table border='1'>";

   // Überschrift
   echo "<tr> <td>Auswahl</td> <td>Name</td>";
   echo "<td>Vorname</td> <td>P-Nr</td>";
   echo "<td>Gehalt</td> <td>Geburtstag</td> </tr>";

   while ($dsatz = mysqli_fetch_assoc($res))
   {
      echo "<tr>";
      echo "<td><input type='radio' name='auswahl'";
      echo " value='" . $dsatz["personalnummer"] . "'></td>";
      echo "<td>" . $dsatz["name"] . "</td>";
      echo "<td>" . $dsatz["vorname"] . "</td>";
      echo "<td>" . $dsatz["personalnummer"] . "</td>";
      echo "<td>" . $dsatz["gehalt"] . "</td>";
      echo "<td>" . $dsatz["geburtstag"] . "</td>";
      echo "</tr>";
   }

   // Tabellenende
   echo "</table>";
  
   mysqli_close($con);
?>
<p><input type="submit" value="Datensatz anzeigen"></p>
</form>
 
Werbung:
Du kannst dann natürlich kein Formular einsetzen, sondern einen Link, an den du die ID des Users dranhängst.
Also <form ....> und </form> raus und statt
PHP:
echo "<td><input type='radio' name='auswahl'";
      echo " value='" . $dsatz["personalnummer"] . "'>
schreibst du
PHP:
echo "<td><a href='db_einzel_b.php?id=" . $dsatz["personalnummer"] . "'>Ändern</a>";</td>";
In db_einzel_b.php nimmst du dann die Personalnummer mit $_GET['id'] entgegen.

Dein echo-Marathon ist nicht schön, schreibe das besser so, da auch übersichtlicher:
PHP:
while ($dsatz = mysqli_fetch_assoc($res))
   {
      echo "<tr>
             <td><input type='radio' name='auswahl' value='" . $dsatz["personalnummer"] . "'></td>
             <td>" . $dsatz["name"] . "</td>
             <td>" . $dsatz["vorname"] . "</td>
             <td>" . $dsatz["personalnummer"] . "</td>
             <td>" . $dsatz["gehalt"] . "</td>
             <td>" . $dsatz["geburtstag"] . "</td>
            </tr>";
   }

Beim Einsatz von SQL-Datenbanken sollte das Abrufen aller Spalten eines Datensatzes per SELECT * vermieden werden. Stattdessen sollten die gewünschten Spaltennamen explizit aufgelistet werden (SELECT col1, col2 FROM …). Einige Vorteile:
  • Häufig werden in einer Abfrage nicht alle Spalten benötigt, die aktuell existieren oder in Zukunft existieren könnten, sodass unnötige Daten übertragen werden.
  • Bei expliziter Angabe der gewünschten Spalten können Datenbanksysteme unter Umständen Indizes zur Beantwortung von Abfragen nutzen.
  • Eine Auflistung der Spaltennamen macht den Code verständlicher, da die Tabellenstruktur nicht erst im Datenbankschema nachgelesen werden muss.
  • Bei Änderungen am Datenbankschema (etwa bei Entfernung oder Umbenennung einer Spalte) schlägt eine Query, die kein SELECT * nutzt, sofort fehl. Das ist hilfreich, da so keine Stelle im Code übersehen werden kann, an der wahrscheinlich auch die PHP-Datenstrukturen an das neue Schema angepasst werden müssen.
 
Moin @m.scatello,

danke für deine ausführliche Hilfe. Der Code ist mehr oder weniger von dem Buch. Ich habe nur meine eigenen Daten eingegeben und es etwas umgeschrieben, damit es auf meine Wünsche bez. Ideen passt. Im Grunde will ich einfach eine Liste erzeugen (erster Code), bei der ich die Inhalte jeder Zeit ändern kann.

Die Ausführung mit GET hab ich noch nicht ganz verstanden, ich verstehe zwar den Unterschied, aber noch nicht wie man es einsetzt. Ich hab jetzt einfach den weiteren Code von dem Buch genommen und ihn so umgeändert wie ich denke das er richtig wäre, ist aber sicher noch was falsch, denn bisher, wenn ich wie du oben geschrieben hast auf den Link "Ändern" klicke, sagt er immer nur das "else" von der Datei, aber nicht das if. Hab ich das mit dem GET falsch gemacht?

PHP:
<?php
if (isset($_GET["CoverID"]))
{
   $conf = mysqli_connect("", "root", "", "artistfytest");
   $res = mysqli_query($conf, "SELECT * FROM coverwall");
   $dsatz = mysqli_fetch_assoc($res);

   echo "<p>Bitte neue Inhalte eintragen und speichern:</p>";
   echo "<form action = 'db_einzel_c.php' method = 'post'>";

   echo "<p><input name='nn' value='" . $dsatz["Head"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["Product"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["Genre"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["Text"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["RelDate"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["Amazon"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["iTunes"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["Spotify"] . "'> Nachname</p>";
   echo "</form>";
  
   mysqli_close($con);
}
else
   echo "<p>Keine Auswahl getroffen</p>";
?>
 
Werbung:
Ich hab jetzt das hier eingebaut

HTML:
<a href='coveredit.php?id=" . $dsatz["CoverID"] . "'>Ändern</a>

Wenn ich die Links anklicke dann erscheint immer der Link mit der jeweiligen ID. Aber öffnen tut er immer

PHP:
else
   echo "<p>Keine Auswahl getroffen</p>";
 
der erste Code ist vom Buch kopiert, CoverID ist Datenbanksatz. Ich weiß nur nicht wie ich ihn überhaupt ausgeben soll, ob das überhaupt richtig ist was ich gemacht habe. Hier nochmal richtig:

Die Übersicht mit dem Link:

PHP:
<?php

$conf = mysqli_connect("", "root", "", "artistfytest");
$res = mysqli_query($conf, "SELECT * FROM coverwall ORDER BY CoverID DESC");       


echo "<table border='1'>";
echo "<tr><td>Artist</td><td>Produkt</td><td>Genre</td><td>Art</td></tr>";

while ($dsatz = mysqli_fetch_assoc($res))

{
    echo "<tr><td>" . $dsatz["Head"] . "</td><td>" . $dsatz["Product"] . "</td><td>" . $dsatz["Genre"] . "</td><td>" . $dsatz["Platte"] . "</td><td><a href='coveredit.php?id=" . $dsatz["CoverID"] . "'>Ändern</a></td></tr>";
}

echo "</table>";

?>

Zweite wie oben (etwas abgeändert):

PHP:
<?php

$conf = mysqli_connect("", "root", "", "artistfytest");
$res = mysqli_query($conf, "SELECT * FROM coverwall");
$dsatz = mysqli_fetch_assoc($res);

if (isset($_GET["CoverID"]))
{

   echo "<p>Bitte neue Inhalte eintragen und speichern:</p>";
   echo "<form action = 'db_einzel_c.php' method = 'post'>";

   echo "<p><input name='nn' value='" . $dsatz["Head"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["Product"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["Genre"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["Text"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["RelDate"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["Amazon"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["iTunes"] . "'> Nachname</p>
         <p><input name='nn' value='" . $dsatz["Spotify"] . "'> Nachname</p>";
   echo "</form>";
  
}
else
   echo "<p>Keine Auswahl getroffen</p>";

   mysqli_close($conf);
?>
 
Werbung:
Hinter dem Fragezeichen muss immer das stehen was man abfragt? Mein Ziel ist es, dass wenn ich bei einem der Einträge auf "Ändern" klicke, dass dann ein Formular aufgeht, in dem die gespeicherten Daten drin stehen und ich sie ändern kann. Bisher ist es so, dass wenn ich auf ändern klicke, dass zwar das Formular aufgeht und auch die jeweilige ID im Link steht, aber die Inhalte sind immer die vom ersten Eintrag. Ist wohl doch alles komplizierter als ich dachte -.-
 
Okay, jetzt hab ich es verstanden, hab den Fehler gefunden und was du meinst:

PHP:
$res = mysqli_query($conf, "SELECT * FROM coverwall WHERE CoverID = " . $_GET["CoverID"]);

Das hat in meiner zweiten Datei gefehlt und wenn das GET nicht das selbe ist wie im Link. So langsam kommts hehe
 
Hinter dem Fragezeichen muss immer das stehen was man abfragt?
Die Ausführung mit GET hab ich noch nicht ganz verstanden, ich verstehe zwar den Unterschied, aber noch nicht wie man es einsetzt.
Deswegen hier noch eine genauere Erklärung, falls du es immer noch nicht genau verstanden hast:
Kurz zum Unterschied Get / Post:
Post sind die Daten eines Abgesendeten Formulars während Get-Daten Teil der URL sind.
Auch Formulare können Get-Daten erzeugen. Dazu wird das Attribut "method" auf "Get" geändert
Erzeugung von Get-Daten:
Get-Daten werden an die normalerweise schon fertige URL angehängt. Dabei wird das erste mit einem "?" von der URL abgegrenzt, alle weiteren durch ein "&" abgegrenzt an diese angefügt. Eine URL mit zwei Gets schaut dann z.B. so aus:
test.php?gete=test&getz=test2
Dabei gilt Name=Wert.
Verarbeitung von Get-Daten:
In PHP kommt man durch die Variable $_GET["Name"] an die Werte hinter dem "=" oben. In deinem Beispiel wären das test bzw. test2, wenn du $_GET["gete"] bzw. $_GET["getz"] abfragst.
Ich hoffe, das hat dir noch weitergeholfen.
Grüße,
Felixprogram
 
Zuletzt bearbeitet:
Werbung:
Dazu wird das Attribut "method" auf "Get" geändert
Das ist so nicht ganz richtig. Ein Formular kann auch Get-Daten senden, obwohl method="post" benutzt wird:
PHP:
<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="utf-8">
    <title>Test</title>
</head>
<body>
<?php
   if (isset($_POST['field']))
   {
      var_dump($_GET);
      echo "<br><br>";
      var_dump($_POST);
   }
?>
<form action="test.php?id=1234" method="post">
Field: <input type="text" name="field"><br>
<input type="submit" name="submit">
</form>
</body>
</html>
 
Moin Leute,

erst Mal danke für eure ausführliche Hilfe. Finde es immer wieder toll, wie gut man in diesem Forum Hilfe bekommt. Ich bin ja noch am Anfang von PHP und lerne mich da Stück für Stück rein.

@Felixprogram: Danke für deine Erklärung. Ich hab es schon grob gelesen gehabt, nur in meinem Buch macht der Autor das meiste nur mit POST und erwähnt GET nur kurz. Daher war mir noch nicht ganz klar wie man das macht, den Unterschied kannte ich aber schon einigermaßen. Ich lerne natürlich gerne Neues dazu.

@m.scatello: Das mit dem mysqli_real_escape_string kenne ich leider noch nicht, also ich wüsste jetzt nicht was genau du damit meinst oder wie das aussehen würde. Du hast ja schon einen Beitrag weiter oben dieses hier (SELECT col1, col2 FROM …) geschrieben, das sagt mir jetzt auch noch nichts.
 
Werbung:
Das mit dem mysqli_real_escape_string kenne ich leider noch nicht, also ich wüsste jetzt nicht was genau du damit meinst oder wie das aussehen würde.
Und was hindert dich daran mal in der Doku nachzusehen? Siehe http://php.net/manual/de/mysqli.real-escape-string.php
Du hast ja schon einen Beitrag weiter oben dieses hier (SELECT col1, col2 FROM …) geschrieben, das sagt mir jetzt auch noch nichts.
Das ist aber traurig!
PHP:
$query = "Select
             `Head`,
             `Product`,
             `Genre`,
             `Text`,
             `RelDate`,
             `Amazon`,
             `iTunes`,
             `Spotify`
          from
             `coverwall`
          where
             `CoverID`=" . mysqli_real_escape_string($_GET["CoverID"]);

$res = mysqli_query($conf, $query)
   or die ("MySQL-Error: " . mysqli_error($conf));
 
Das ist so nicht ganz richtig. Ein Formular kann auch Get-Daten senden, obwohl method="post" benutzt wird:
PHP:
<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="utf-8">
    <title>Test</title>
</head>
<body>
<?php
   if (isset($_POST['field']))
   {
      var_dump($_GET);
      echo "<br><br>";
      var_dump($_POST);
   }
?>
<form action="test.php?id=1234" method="post">
Field: <input type="text" name="field"><br>
<input type="submit" name="submit">
</form>
</body>
</html>
Damit sendest du aber keine Daten des Formulars per Get.
Eine URL kann man, wie gesagt, immer mit Get-Daten aufrufen, wie bei einem Link auch.
Wenn du das Formular absendest, ruft der Browser ja, wie bei einem Link, die Seite auf, wodurch natürlich die Get-Daten gelesen werden können. Er sendet dann natürlich auch zusätzlich die POST-Daten mit.
Mir ging es oben nur darum, zu erklären, wie rein nur Get-Daten gesendet werden können. Mir ist klar, dass die Definition unvollständig ist.
 
Zuletzt bearbeitet:
@m.scatello: Warum ist das traurig? Ich bin doch Anfänger und das kam einfach noch nicht vor. Langsam ernährt sich das Eichhörnchen. Ich bin froh, dass ich das was ich bis jetzt geschafft habe hinbekommen habe. Das heißt mit dem SELECT * ist es unsicherer?
 
Werbung:
Zurück
Oben