Ankündigung

Einklappen
Keine Ankündigung bisher.

Tabelle für INPUT erzeugen und Daten in MySQL updaten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Tabelle für INPUT erzeugen und Daten in MySQL updaten

    Hallo und guten Tag,
    ich arbeite seit ein paar Wochen intensiv mit PHP und habe immerhin schon was hinbekommen , aber nun scheitere ich.

    Situation:
    Ich lasse Daten aus MySQL direkt in einer Tabelle ausgeben/anzeigen, die aus Eingabefeldern besteht, also so:

    $sql="SELECT nachname, vorname FROM tabelle";
    $result=mysql_query($sql) or exit ("Fehler im SQL-Kommando: $sql");

    echo "<table>";
    echo "<form method=\"post\" action=\"neu.php\">";
    while ($row=mysql_fetch_row($result))
    {
    echo "<tr>";
    echo "<td><input type=\"text\" size=\"10\" name=\"nachname\" value=\"$row[0]\"></td>";
    echo "<td><input type=\"text\" size=\"10\" name=\"vorname\" value=\"$row[1]\"></td>";
    echo "</tr>";
    }
    echo "</table>";
    echo "<input type=\"submit\" name=\"new\" value=\"SENDEN\">";

    Das ist ja dasselbe Prinzip, mit dem ich eine Tabelle unbekannter Zeilenzahl sonst auch erzeuge, nur eben jetzt mit Eingabefeldern.
    Wenn ich diese Daten jetzt an new.php senden würde und in dieser Folgendes steht ...

    if (isset($_POST['new']))
    {
    $sql="UPDATE tabelle SET nachname='$_POST[nachname]', vorname='$_POST[vorname]'";
    mysql_query($sql) or exit ("Fehler im SQL-Kommando: $sql");
    }

    ... würde das ja kläglich scheitern, weil ich nur ein "Wertepaar" (das erste?) erfasse.
    Vermutlich muss in new.php ja wieder eine WHILE-Schleife sein, die den UPDATE-Vorgang steuert und der ich zuvor übergeben muss, wie lang sie ist, indem ich die Zeilen zähle.
    Aber wie geht das?

    Vermutlich lässt sich das alles auch innerhalb ein und derselben Datei regeln, oder?

    Ich würde mich über Tipps/Hilfe freuen, damit ich nicht tricksen muss und 100 solche Ausgabe- und Eingabeprozeduren tippe um eine armselige Primitivlösung zu schaffen ...

    Vielen Dank!
    JoeLio

  • #2
    bitte setze deinen code in code/php tags, damit man ihn lesen kann.

    Kommentar


    • #3
      Und dann bitte der Reihe nach:

      - PDO oder mysqli verwenden, die mysql-extension ist veraltet.
      - SQL Injection
      [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

      Kommentar


      • #4
        Guten Tag und Entschuldigung!

        @moma:
        Ich habe nun alles in php-tags gesetzt (und es hoffentlich richtig gemacht).

        @ChristianK:
        Das Thema Sicherheit habe ich mit den Rückstrichen schon aufgegriffen, denke ich. Ansonsten sind meine Daten nicht sensibel und nur für den Hausgebrauch. Insofern lasse ich das zunächst außen vor. Erst mal möchte ich etwas haben, das funktioniert, damit ich die Sache grundsätzlich kapiere. Ich bin ja noch am lernen ...
        Wenn man im Internt die diversen Einführungen zu PHP studiert, stößt man dort überall noch (insbesondere in den Beispielen) auf die mysql-extension, deshalb konnte ich das nicht wissen. Gibt es denn irgendwo einen "modernen" Kurs?
        Aber ich werde mich dazu gleich mal informieren.

        Ich würde mich freuen, wenn ihr auf meine eigentlich Frage schon eingehen könnt (siehe oben).

        Abfrage der Daten und Ausgabe in eine Tabelle mit Eingabefeldern:
        PHP-Code:
        <?php
        $sql
        ="SELECT nachname, vorname FROM tabelle";
        $result=mysql_query($sql) or exit ("Fehler im SQL-Kommando: $sql");

        echo 
        "<table>";
        echo 
        "<form method=\"post\" action=\"neu.php\">";
        while (
        $row=mysql_fetch_row($result))
        {
        echo 
        "<tr>";
        echo 
        "<td><input type=\"text\" size=\"10\" name=\"nachname\" value=\"$row[0]\"></td>";
        echo 
        "<td><input type=\"text\" size=\"10\" name=\"vorname\" value=\"$row[1]\"></td>";
        echo 
        "</tr>";
        }
        echo 
        "</table>";
        echo 
        "<input type=\"submit\" name=\"new\" value=\"SENDEN\">";
        ?>
        Mein Code für das Updaten der Datenbank, der eben nicht alle Zeilen updatet, weil er dazu ja wissen muss, wieviele Zeilen vorher ausgegeben wurden. Hier muss man sicher mit Variablen arbeiten (die schon bei der Abfrage/Ausgabe gesetzt werden), die in die jeweiligen Befehle eingefügt sind und daran scheitere ich ...
        PHP-Code:
        <?php
        if (isset($_POST['new']))
        {
        $sql="UPDATE tabelle SET nachname='$_POST[nachname]', vorname='$_POST[vorname]'";
        mysql_query($sql) or exit ("Fehler im SQL-Kommando: $sql");
        }
        ?>
        Danke und freundliche Grüße
        JoeLio

        Kommentar


        • #5
          Zitat von JoeLio Beitrag anzeigen
          $sql="UPDATE tabelle SET nachname='$_POST[nachname]', vorname='$_POST[vorname]'";
          mysql_query($sql) or exit ("Fehler im SQL-Kommando: $sql");

          Der Klassiker. Schön, wenn man noch ROLLBACK sagen kann.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Das Thema Sicherheit habe ich mit den Rückstrichen schon aufgegriffen, denke ich. Ansonsten sind meine Daten nicht sensibel und nur für den Hausgebrauch. Insofern lasse ich das zunächst außen vor. Erst mal möchte ich etwas haben, das funktioniert, damit ich die Sache grundsätzlich kapiere. Ich bin ja noch am lernen ...
            Wenn man im Internt die diversen Einführungen zu PHP studiert, stößt man dort überall noch (insbesondere in den Beispielen) auf die mysql-extension, deshalb konnte ich das nicht wissen. Gibt es denn irgendwo einen "modernen" Kurs?
            Aber ich werde mich dazu gleich mal informieren.
            Schön, dass du den Tipp ernst nimmst. Am besten siehst du dir die PHP Dokumentation an: http://php.net/manual/de/book.pdo.php

            Oder das:
            http://wiki.hashphp.org/PDO_Tutorial...SQL_Developers

            Gib bei google am besten mal so was, wie "PHP PDO Tutorial" ein...

            LG
            https://github.com/Ma27
            Javascript Logic is funny:
            [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

            Kommentar


            • #7
              Der Klassiker. Schön, wenn man noch ROLLBACK sagen kann.
              Also falls du mit Rollback die Transactions-Geschichte meinst:
              Die gibts in mysql_* nicht mal^^

              LG
              https://github.com/Ma27
              Javascript Logic is funny:
              [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

              Kommentar


              • #8
                Zitat von Ma27 Beitrag anzeigen
                Also falls du mit Rollback die Transactions-Geschichte meinst:
                Die gibts in mysql_* nicht mal^^

                LG
                Ich glaub, Du irrst. Solange Du SQL durchgeben kannst, kannst auch ein BEGIN hinschicken. Aber darum ging es gar nicht so unbedingt.
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  Hinweise:

                  Die original mysql-Erweiterung ist veraltet (mysql_*-Funktionen) und wird in den kommenden Versionen aus PHP entfernt. Aktuell wirft sie schon E_DEPRECATED-Fehler bei einer Verbindung zur Datenbank. Des Weiteren stehen dir sehr viele tolle Features von mysql mit diesen Funktionen nicht zur Verfügung! Weiterführende Links:
                  Choosing an API
                  Warum man mysql* generell nicht (mehr) nutzen sollte.
                  Wie man von mysql* auf PDO umsteigt

                  Der Code offenbart kritische Sicherheitsprobleme: Wissenswertes zum Thema SQL-Injection

                  Es ist nicht mehr zeitgemäß, Anwendungslogik und Ausgabelogik zu kombinieren. Dadurch leidet die Wartbarkeit beider Komponenten. In der Regel folgen in PHP geschriebene Applikationen daher dem EVA-Muster, welches einen leicht nachvollziehbaren Datenfluss ermöglicht, besser wartbare Applikationen erzeugt und leichter von anderen Entwicklern verstanden wird. In der PHP-Welt hat sich hierauf aufbauend das (häufig falsch interpretierte) MVC-Muster [1] etabliert (siehe auch DCI oder ADR). Ganz einfach gesagt handelt es sich bei dem EVA-Muster um eine Aufteilung der Aktionen "Auswertung der Eingabeparameter", "Verarbeitung der damit verknüpften Anwendungslogik" und "Erzeugung und Übermittlung der Ausgabe". Oder vereinfacht: Erst Daten sammeln, dann daraus die Darstellung erzeugen und ausgeben. Die Verwendung einer Templateengine (mit Layout-Support) ist dafür Empfehlenswert - jedoch aber keine Voraussetzung.

                  Kommentar


                  • #10
                    Zitat von rkr Beitrag anzeigen
                    Des Weiteren stehen dir sehr viele tolle Features von mysql mit diesen Funktionen nicht zur Verfügung!
                    --verbose, please
                    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                    Kommentar


                    • #11
                      Zitat von akretschmer Beitrag anzeigen
                      --verbose, please
                      Der Link darunter: https://php.net/manual/en/mysqlinfo.api.choosing.php

                      Kommentar


                      • #12
                        Du brauchst etwas, um die Datensätze eindeutig identifizieren zu können.

                        z.B.
                        PHP-Code:
                         <?php
                        $sql
                        ="SELECT nachname, vorname, ID FROM tabelle"// ID mit in die Abfrage
                        $result=mysql_query($sql) or exit ("Fehler im SQL-Kommando: $sql");

                        echo 
                        "<table>";
                        echo 
                        "<form method=\"post\" action=\"neu.php\">";
                        while (
                        $row=mysql_fetch_row($result))
                        {
                        echo 
                        "<tr>";
                        echo 
                        "<td><input type=\"text\" size=\"10\" name=\"nachname[".$row[3]."]\" value=\"$row[0]\"></td>"// damit behandelt PHP das Element in $_POST['nachname'] als Array
                        echo "<td><input type=\"text\" size=\"10\" name=\"vorname[".$row[3]."]\" value=\"$row[1]\"></td>";
                        echo 
                        "</tr>";
                        }
                        echo 
                        "</table>";
                        echo 
                        "<input type=\"submit\" name=\"new\" value=\"SENDEN\">";
                        ?>
                        Aus den Namensfeldern solltest du Arrays machen. Für die ID könntest du auch noch nen input mit Attribut hidden nehmen, dann könntest du im nächsten Schritt darüber die Schleife laufen lassen.
                        PHP-Code:
                        <?php
                        if (isset($_POST['new']))
                        {
                            foreach(
                        $_POST['nachname'] as $id => $value){
                                
                        $sql 'UPDATE tabelle SET nachname = "'.$_POST['nachname'][$id].'", vorname = "'.$_POST['vorname'][$id].'" WHERE ID = '.$id;
                                
                        mysql_query($sql) or exit ("Fehler im SQL-Kommando: $sql");
                            }
                        }
                        ?>

                        Gute Seite PDO näher kennenzulernen: http://www.peterkropff.de/site/php/pdo.htm
                        [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                        [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                        Kommentar


                        • #13
                          Hallo VPh
                          und vielen Dank für deine sehr verständliche Antwort!
                          Deine Erklärungen und die ergänzenden Kommentare in meinem Code haben mich das als Anfänger tatsächlich verstehen lassen. DANKE!
                          Insofern hat mir deine Info jetzt weitergeholfen und ich werde das heute abend mal so testen und dir dann Rückmeldung geben.
                          Die Seite von Peter Kropff zu PDO habe ich auch inzwischen entdeckt und lese mich gerade ein.
                          Die deiner guten Antwort vorausgehenden Antworten anderer Forumsteilnehmer haben mir gezeigt, dass hier viele sehr kluge Leute sind, die auch viel über Sicherheit nachdenken, denen es aber nicht gut gelingt, sich einem Anfänger gegenüber informativ auszudrücken ...

                          Dank und Gruß
                          JoeLio

                          Kommentar


                          • #14
                            Das ist ein gutes Beispiel dafür warum man fetch_row nicht benutzen sollte und wie eine Anwendung aussieht wo der Entwickler nix mit den Begriff escapen und validierung anfangen kann. Die Anwendung kann weder mit ' oder " umgehen. Bei ersteren schlägt das Update fehl, bei zweiteren zerstört es den Datensatz beim erneuten bearbeiten.

                            Kommentar


                            • #15
                              So, getestet, funktioniert ... im Prinzip ...

                              Jetzt kann ich mich als nächstes den (teilweise zu Recht) hier monierten Aspekten der Sicherheit und Validierung widmen.

                              @VPh:
                              Ich sehe das richtig, dass der Zahlenwert in der eckigen Klammer hinter $row angibt, an welcher "Position" die id abgerufen wurde?
                              Wenn ich die Abfrage also so vornehme ...
                              PHP-Code:
                              $sql="SELECT id, nachname, vorname FROM tabelle"
                              Dann muss es entsprechend so ...
                              PHP-Code:
                              echo "<input type=\"hidden\" name=\"id[".$row[0]."]\" readonly value=\"$row[0]\">";
                              echo 
                              "<td><input type=\"text\" size=\"10\" name=\"nachname[".$row[0]."]\" value=\"$row[1]\"></td>"
                              ... weitergehen. Richtig?

                              Was ich mit der Syntax nicht hinbekommen hatte, war die Schleife. Ich hatte da mit WHILE rumprobiert. Die Lösung mit FOREACH kann ich nachvollziehen, aber ich frage mich, woher die Variable $value in deinem Code kommt und was sie bezweckt?

                              @erc:
                              Was ist hier denn das Problem mit fetch_row?
                              Mir ist schon klar, dass man bei der Eingabe der Werte eine Validierung vornehmen muss, aber ich weiß noch nicht, wie das geht. Kann mir jemand für die schlimmsten Dinge einen Tipp geben? Bei http://www.peterkropff.de/site/php/pdo.htm bin ich noch nicht ganz durch ...

                              Nun noch eine ganz andere Frage, die hier vielleicht gar nicht hergehört:
                              Wenn die Tabelle mit der Eingabemöglichkeit dem Benutzer nun im Browser zur Verfügung steht, dann wäre das für den ENORM praktisch, wenn er mit der Tabulatortaste von Feld zu Feld springen kann - und zwar vertikal (nach unten). Leider springt die Tab-Taste z.B. in Firefox unter Win7 aber horizontal weiter (nach rechts). Deshalb muss man hier dauernd zur Maus greifen, wenn man eine Spalte editieren will.
                              Gibt es da eine Möglichkeit, das zu steuern?

                              Herzlichen Dank für die Hilfe und Tipps bis hierhin ...!
                              JoeLio

                              Kommentar

                              Lädt...
                              X