1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

MySQL-Frage

  • PWL
  • 6. September 2008 um 23:32
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • PWL
    Punkte
    240
    Beiträge
    31
    • 6. September 2008 um 23:32
    • #1

    hi,

    hab mir mit php und mysql ein gästebuch programmiert, jetz will ich über ein admin-formular die einträge verwalten.
    hier mein code:

    PHP
    <html>
    <head>
    <title></title>
    
    
    </head>
    <body text="#000000" bgcolor="#FFFFFF" link="#000000" alink="#000000" vlink="#000000">
    <form method="post" action="gbadmin.php">
    <?php
    
    
    $link = mysql_connect("localhost", "bn", "pw");
    mysql_select_db("Datenbank");
    $abfrage = "SELECT * FROM Tabelle ORDER BY id";
    $ergebnis = mysql_query($abfrage);
    
    
    while($row = mysql_fetch_object($ergebnis))
    {
    
    
    
    
    $id = $row->id;
    $name = $row->name;
    $inhalt = $row->inhalt;
    $comment = $row->comment;
    $id_new = $_POST['id$id'];
    $name_new = $_POST['name$id'];
    $inhalt_new = $_POST['inhalt$id'];
    $comment_new = $_POST['comment$id'];
    echo"
    
    
    <table>
    <tr>
    <td valign=\"top\"><input type=\"text\" value=\"$id\" size=\"7\" name=\"id$id\"></td>
    <td valign=\"top\"><input type=\"text\" value=\"$name\" name=\"name$id\"></td>
    <td valign=\"top\"><textarea cols=\"20\" rows=\"10\" name=\"inhalt$id\">$inhalt</textarea></td>
    <td valign=\"top\"><textarea cols=\"20\" rows=\"10\" name=\"comment$id\">$comment</textarea></td>
    </tr>
    </table>";
    
    
    
    
    
    
    
    
    
    
    }
    
    
    echo "
    <input type=\"submit\" name=\"eintragen\">";
    
    
    if ($_REQUEST['eintragen'])
    {
    
    
    
    
    
    
    for ($i=0; $i < mysql_nuw_rows($ergebnis); $i++)
    {
    $eintrag = "UPDATE Tabelle SET id = '$id_new', name = '$name_new', inhalt = '$inhalt_new', comment = '$comment_new'";
    $insertgb = mysql_query($eintrag);
    }
    echo"ge&auml;ndert";
    
    
    
    
    
    
    }
    
    
    
    
    ?>
    </form>
    </body>
    </html>
    Alles anzeigen

    ich nehme mal an der fehler liegt an der for-schleife...
    wenn ich mein skript ausführ setzt er nur den ersten eintrag gleich null sonst macht er nichts. er soll aber alle einträge updaten.

    danke

  • maciek
    Punkte
    2.805
    Beiträge
    434
    • 6. September 2008 um 23:50
    • #2

    Keine Lösung Deines Problems (wahrscheinlich), aber paar Kommentare dazu:
    1) Code ist sehr unübersichtlich. Musste ihn zuerst formatieren um überhaupt irgendwas sagen zu können.
    2) Diese Art von SQL-Parameterquoting ist sehr gefährlich, weil SQL-Injections ohne Probleme möglich sind. Es gibt in PHP eine Funktion für Parameter quoting, die mir jetzt auf die schnelle aber nicht einfällt.
    3) Schau Dir mal arrays von Parametern an. Dann ist die Concatenation von name + $id nicht notwendig.
    4) In der WHILE-Schleife setzt Du x-mal die Variablen, aber am Ende kommt nur ein Wert heraus (beim letzten Durchlauf). Oder aber es kommt gar kein Wert heraus, wenn die SELECT Query nichts zurückliefert. Dann versuchst Du in der FOR-Schleife den (gleichen!) Wert x-mal in die Datenbank zu schreiben. Verstehe das Konzept nicht.
    5) Die Funktion soll wohl mysql_num_rows() heißen.

  • Paulchen
    Gast
    • 6. September 2008 um 23:52
    • #3

    Brrrr.

    Wenn du $variable in einem String durch den Wert ebendieser Variablen ersetzen willst, musst du Double Quotes verwenden statt Single Quotes. $_POST['id$id'] liefert nämlich aus dem Array $_POST genau das Element mit Index id$id und nicht id1, id2, usw. $_POST['id$id'] könnte besser funktionieren.

    Davon mal abgesehen versuchst du, jedes Mal, wenn du das UPDATE-Statement ausführst, alle Tabellenzeilen zu verändern (es fehlt eine WHERE-Bedingung). Daher wird nur die erste Zeile "aktualisiert", beim Rest kollidieren die Werte des (hoffentlich vorhandenen) Primärschlüssels.

    Was fällt mir sonst noch auf?

    • SQL-Injections sind was Schönes. Braucht nur wer die POST-Daten manipulieren und kann interessante Datenbankabfragen absetzen.
    • Zugangsdaten zur Datenbank in jedem Skript separat sind ein Käse. Das Datenbankpasswort irgendwann mal zu ändern, wird ziemlich aufwändig.
    • Hast du irgendwo eine Überprüfung, ob der Benutzer, der den POST-Request abgeschickt hat, überhaupt die Berechtigung besitzt, die Datenbankdaten zu manipulieren?
    • Trennung von HTML und PHP ist natürlich auch was Schönes, Templates und so.
  • spinball
    Punkte
    1.192
    Beiträge
    223
    • 6. September 2008 um 23:57
    • #4

    So wie ich das nachvollziehen kann, hast du einen großen Strukturfehler: Die Variablen $id_new, $name_new, $inhalt_new und $comment_new kriegen beim zweiten Aufruf der Seite die Inhalte des untersten Eintrags aus der Liste. Du überschreibst sie nämlich bei jedem Schleifendurchlauf immer - und immer wieder. Ist das Absicht? :confused:

    Folgender Denkansatz möge dich auf die richige Bahn führen: Die oben genannten Variablen brauchst du in der zweiten Schleife! Dort musst du die korrigierten Gästebucheinträge aus $_POST auslesen. Nicht in der While-Schleife.

    Und die zweite Abfrage sollte so aussehen:

    PHP
    $eintrag = "UPDATE Tabelle SET name='$name_new', inhalt='$inhalt_new', comment='$comment_new' WHERE id='$id_new'";

    Ich gehe hierbei davon aus, dass die Spalte id der sich selbst automatisch erhöhender Primärschlüssel ist. Den solltest du also nicht verändern, sondern als Filterbedingung in der WHERE-Klausel benutzen.

    Viel Erfolg mit deinem Gästebuch wünscht dir DJ spinball!

  • beefy
    Punkte
    1.683
    Beiträge
    304
    • 8. September 2008 um 11:44
    • #5
    Zitat von maciek

    2) Diese Art von SQL-Parameterquoting ist sehr gefährlich, weil SQL-Injections ohne Probleme möglich sind. Es gibt in PHP eine Funktion für Parameter quoting, die mir jetzt auf die schnelle aber nicht einfällt.

    mysql_real_escape_string()

  • Paulchen
    Gast
    • 8. September 2008 um 12:02
    • #6

    Mit mysqli gibt's Prepared Statements mit Parametern. Meiner Meinung nach die schönere Variante. :)

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum