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

  • #16
    ...das kannst du mit dem HTML-Attribut "tabindex" beeinflussen.

    Kommentar


    • #17
      Zitat von JoeLio Beitrag anzeigen

      @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 ...
      Jo, die Zahl gibt den Index des Arrays an. Ich hol mir die Daten aber lieber mit fetch_assoc, da hat man dann ein assoziatives Array und kann mit den Spaltennamen als Index arbeiten. Lässt sich in PDO beim Verbindungsaufbau als Standard-Fetch-Methode einstellen.

      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?
      $value ist der Wert der aus dem Input-Feld ans Post-Array übergeben wurde.

      z.B.

      PHP-Code:
      <html>
          <
      form action="" method="POST">
              <
      input type="text" name="Tier[1]"><!-- EingabeHund -->
              <
      input type="text" name="Tier[2]"><!-- EingabeKatze -->
              <
      input type="submit">
          </
      form>
      </
      html
      PHP-Code:
      foreach($_POST['Tier] as $key => $value){
          echo '
      Tier Nummer '.$key.''.$value.'<br/>';
      }
      // Tier Nummer 1: Hund
      // Tier Nummer 2: Katze 

      In dem Beispiel vorhin habe ich $value nicht benutzt, weil ichs einheitlicher fand wenn ich für den Nachnamen auch übers Array mit den Index auf den Wert zugreif.
      [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


      • #18
        Zitat von rkr Beitrag anzeigen
        ...das kannst du mit dem HTML-Attribut "tabindex" beeinflussen.
        Danke, rkr! Das war ein super Tipp!
        Und ich habe wieder viel dabei gelernt, als ich versucht habe, den tabindex in Abhängigkeit von der Dimension der Tabelle über entsprechende Variablen zu setzen. Ihr werdet darüber bestimmt schmunzeln, weil sowas ja tägliche Arbeit für die Profis hier ist. Aber ... ich hab's hinbekommen!
        Für den Benutzer ist das später eine ERHEBLICHE Erleichterung bei der Eingabe. Der muss dann nämlich ewig lange Kolonnen einstelliger Zahlen eintippen - und wenn man da jedesmal zur Maus greifen muss, wird man bekloppt.
        JoeLio

        Kommentar


        • #19
          Zitat von JoeLio Beitrag anzeigen
          Was ist hier denn das Problem mit fetch_row?
          Die Übersicht geht verloren. Natürlich ist das bei 2 Feldern noch nicht unbedingt das Problem, aber es wird zu einen Problem. Schau dir den Code von VPh an, da hat sich durch das fetch_row ein Fehler eingeschlichen. Statt die ID (Index 2) verwendet er ein undefinierten Wert (Index 3). Nimm fetch_assoc() und sowas passiert nicht so einfach.

          Da sprichst du die Felder dann so an:
          PHP-Code:
          $row['id']
          $row['name']
          $row['vorname'
          Zitat von JoeLio Beitrag anzeigen
          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
          Du musst zwischen Validierung und Escapen unterscheiden. Bei der Validierung prüfst du ob die Eingaben deinen Vorstellungen entsprechen. Z.B.: name muss angegeben sein, name darf maximal 20 Zeichen lang sein, name darf nur Zeichen wie A-Z enthalten usw...
          Beim Escapen wird sichergestellt das Eingaben nicht die Ausführung/Darstellung beeinflussen. Ansonsten kann das einseits dazu führen das die Anwendung Daten nicht richtig verarbeitet und/oder Sicherheitsprobleme verursachen. Z.B. geb mal ein Test"test in ein Eingabefeld ein. Das führt zu einen SQL Fehler, weil der Query dann so aussieht:
          PHP-Code:
          UPDATE tabelle SET nachname "Test"test", vorname = ... 
          Deswegen musst du escapen (z.B. mit mysql_real_escape_string), dann kommt das raus:
          PHP-Code:
          UPDATE tabelle SET nachname "Test\"test"vorname = ... 
          Nächstes Problem ist der HTML Code, nachdem nun Test"test in der Datenbank steht passiert folgendes:
          PHP-Code:
          <input type="text" value="Test"test"> 
          Der Browser wird dir damit nur ein Eingabefeld mit Test anzeigen. Somit gehen die Datensätze kapput. Daher muss auch da escapt werden. Z.B. mit htmlentities(). Damit kommt dann folgendes raus:
          PHP-Code:
          <input type="text" value="Test&quote;test"
          und der Browser zeigt dir ein Eingabefeld mit Test"test an.
          Auch wenn du jetzt sagst >ich will da kein "< eingeben, das interessiert später die Anwender nicht.

          Kommentar


          • #20
            Moment, wieso sollte es keinen undefinierten Index geben, wenn du assoziative Arrays nimmt? Es kann ja gut sein, dass eine Spalte anders heisst als du dir das vorstellst.

            Die Gefahr, ob assoziativ oder numerisch, auf einen ungültigen Index zu treffen ist gleich hoch.
            [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


            • #21
              Das hab ich nicht gesagt, ich sagte das die wahrscheinlichkeit geringer ist. Statt sich das Feld und die Position zu merken, die in jedem Query anderes ist, reicht es sich den Feldnamen zu merken, der immer gleich ist.

              Kommentar


              • #22
                Hallo erc,
                danke für die Infos und Tipps! Ich lerne dazu.
                Ich bleibe erstmal bei fetch_row, denn im Moment bin ich noch konzentriert genug, um richtig zu zählen. Grundsätzlich leuchten mir aber auch die Vorteile von fetch_assoc ein.
                Das mit dem escapen sieht mir nach Arbeit aus. Ich habe auch noch nicht zu ganz kapiert, an welcher "Stelle" ich escapen muss. Habe ich das richtig verstanden, dass beim escapen der Benutzer grundsätzlich "falsche" Eingaben machen kann, die dann aber beim UPDATE korrigiert werden? Wenn ja, dann verstehe ich noch nicht ganz, wie. Hast du ein ausführlicheres Beispiel für mich?
                Zitat von erc Beitrag anzeigen
                Du musst zwischen Validierung und Escapen unterscheiden. Bei der Validierung prüfst du ob die Eingaben deinen Vorstellungen entsprechen.
                Meine Logik sagt mir, dass ich das Problem mit dem escapen ja auch schon vorher durch eine Validierung lösen kann, indem ich bestimmt Zeichen einfach gar nicht erst erlaube. Wenn Anführungszeichen und Schrägstriche gefährlich sind, dann würde ich die als Eingabe einfach gar nicht akzeptieren.
                Also müsste ich doch einfach nur so validieren, dass der Benutzer hier eine Fehlermeldung bekommt, oder?
                Kann ich nicht eine Abfrage vorschalten, die auf das Vorkommen bestimmter Zeichen prüft und den Benutzer dann anmeckert, dass er die gefälligst nicht verwenden soll?

                Danke und Gruß
                JoeLio

                Kommentar


                • #23
                  VIELEN DANK FÜR EURE HILFE! Es wird langsam ...
                  Mannomann, da ist aber 'ne Menge zu lernen. Macht aber Spaß!

                  An VPh, aber vielleicht auch die anderen Experten hier:
                  In deinem Post vom 12.8., 13:44, schreibst du mir folgendes FOREACH:
                  PHP-Code:
                  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"); 
                  Später, um 18:13, schreibst du dann, dass $value aus dem Input-Feld übergeben wird, aber du $value zuvor nicht benutzt hast.
                  Häh? Bin ich blöd? In deinem ersten Code-Beispiel steht doch aber $value ...?
                  PHP-Code:
                  foreach($_POST['Tier] as $key => $value){
                      echo '
                  Tier Nummer '.$key.''.$value.'<br/>;

                  Und hier verstehe ich nicht, wie $key größer als $value werden kann, wenn $value Text enthält. Zudem tauchen weder $key noch $value ja als Variable vorher beim "form-action-post" irgendwo auf.
                  Wahrscheinlich ist dein Beispiel einfach nur allgemein gehalten und ich bin noch nicht genug geübt, das zu kapieren ...

                  Ich habe dieses Update mit FOREACH jetzt jedenfalls so realisiert:
                  PHP-Code:
                  foreach($_POST['id'] as $id => $value)
                      {
                          
                  $sql 'UPDATE tabelle SET al1 = "'.$_POST['al1'][$id].'", al2 = "'.$_POST['al2'][$id].'", al3 = "'.$_POST['al3'][$id].'",
                          al4 = "'
                  .$_POST['al4'][$id].'", al5 = "'.$_POST['al5'][$id].'" WHERE id = '.$id;
                          
                  mysql_query($sql) or exit ("Fehler im SQL-Kommando: $sql");
                      } 
                  Es sollen hier die Spalten al1 bis al5 geupdatet werden, was auch funktioniert.
                  Den Teil "as $id => $value" habe ich einfach beibehalten, aber $value gibt es bei mir sonst nirgends (also ist dieser Variablen ja vermutlich Null zugewiesen). Wozu ist die da dann drin, wozu überhaupt das "as $id => ..." ???
                  Auch verstehe ich noch nicht, was die Hochkommata ('), Anführungszeichen (") und Punkte (.) jeweils genau bezwecken. Die kann man offensichtlich hier und da auch mal weglassen ...?
                  Insbesondere verwundert mich das Ende der Anweisung $sql, nämlich:
                  WHERE id = '.$id;
                  Warum steht hinter dem Gleichheitszeichen "nichts" mehr? Wird da dann die $id zugewiesen?
                  Irgendwie scheint mir das mit den " und den ' nicht einheitlich.

                  Also, mein Script funktioniert zwar, ich will das doch auch verstehen!
                  Könnt ihr mir nochmal auf die Sprünge helfen?

                  Dank & Gruß
                  JoeLio

                  Kommentar


                  • #24
                    PHP-Code:
                    foreach($_POST['id'] as $id => $value
                    Das ist einfach die Syntax einer foreach...
                    PHP-Code:
                    foreach( ARRAY as $KEY => $VALUE
                    Wobei das Array durchlaufen wird und bei jedem durchlauf KEY und $VALUE mit den aktuellen Werten gesetzt werden.

                    PHP-Code:
                    WHERE id '.$id; 
                    Da wird $id an den String angehängt, Stichwort String-Konkatenation (Google kann dir da noch mehr zu sagen).
                    [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                    Kommentar


                    • #25
                      Hallo tkausl, hallo VPh,
                      die Sytax der FOREACH-Anweisung habe ich schon kapiert, aber ich verstehe nicht, wie das in dem Beipsiel von VPh funktionieren soll:
                      PHP-Code:
                      <html>
                          <
                      form action="" method="POST">
                              <
                      input type="text" name="Tier[1]"><!-- EingabeHund -->
                              <
                      input type="text" name="Tier[2]"><!-- EingabeKatze -->
                              <
                      input type="submit">
                          </
                      form>
                      </
                      html
                      [...]
                      PHP-Code:
                      foreach($_POST['Tier] as $key => $value){
                          echo '
                      Tier Nummer '.$key.''.$value.'<br/>;
                      }
                      // Tier Nummer 1: Hund
                      // Tier Nummer 2: Katze 
                      Und vor allem ist mir nach wie vor unklar, was $value im Post #12 bewirken soll:
                      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");
                          }
                      }
                      ?>
                      String-Konkatenation hab ich mir jetzt fleißig angeeignet. Da muss man erst mal drauf kommen, dass ' und " FAST gleich nutzbar sind.
                      Ist jemand so nett und erklärt mir, warum man hier
                      UPDATE tabelle SET al1 = "'.$_POST['al1'][$id].'" ...
                      das al1 mit Hochkommata einschließt. Die könnte man doch auch weglassen, oder?
                      (Dazu habe ich im Netz nichts gefunden ...)

                      Und mag auch nochmal jemand auf meine Frage zur Validierung, mit der man dem Escapen vorbeugen kann, in Post #22 eingehen?

                      Gruß & Dank
                      JoeLio

                      Kommentar


                      • #26
                        PHP-Code:
                        <input type="text" name="Tier(1)[1(2)]"><!-- Eingabe: Hund(3) -->

                        <?php
                        foreach($_POST['Tier](1) as $key(2) => $value(3)){
                            echo '
                        Tier Nummer '.$key.''.$value.'<br/>;
                        }
                        (1) = Der Name vom Element, das im $_POST-Array landet
                        Da das Element in diesem Fall ein Array ist:
                        (2) = Der Index dieses Elements im Array, das dem $_POST-Array übergeben wird. Wenn man da nichts einträgt, wird das wie üblich bei 0 beginnend für jedes Element höher gezählt
                        (3) = Der Wert des Elements


                        Und vor allem ist mir nach wie vor unklar, was $value im Post #12 bewirken soll:
                        Es sollte nichts bewirken, das ist die Syntax um einfach an den Index des Arrays zu kommen.


                        PHP-Code:
                        UPDATE tabelle SET al1 "'.$_POST['al1'][$id].'" // Der Index ist der String 'al1'
                        UPDATE tabelle SET al1 "'.$_POST[al1][$id].'"  // Der Index ist die Konstante al1, wurde die Konstante nicht definiert, wird es als String interpretiert, wirft aber ne notice 
                        Meintest du das?



                        Und mag auch nochmal jemand auf meine Frage zur Validierung, mit der man dem Escapen vorbeugen kann, in Post #22 eingehen?
                        Nicht gut, Manchmal will jemand eben ein Sonderzeichen irgendwo schreiben und speichern, ich würds nicht gut finden wenn man mir einfach Möglichkeiten klaut. Zudem sollte es sich im Aufwand nicht viel nehmen, Prepared Statements konsequent nutzen und escapen ist kein Thema mehr.
                        [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


                        • #27
                          Vielen Dank für deine ausführliche Hilfe, VPh!
                          Ich werde mich damit heute nachmittag mal in Ruhe befassen.
                          Zitat von VPh Beitrag anzeigen
                          Manchmal will jemand eben ein Sonderzeichen irgendwo schreiben und speichern, ich würds nicht gut finden wenn man mir einfach Möglichkeiten klaut.
                          Schon klar.
                          In meinem Fall geht es aber gerade darum, dass ich nur ganz bestimmte Daten erfassen will. Es sollen z.B. Zahlenwerte von 1 bis 9 eingetragen werden (und alles andere wäre sowieso Unsinn, weil es bei der späteren Verarbeitung dieser Daten Probleme machen würde). In einem solchen Fall wäre es doch sinnvoll, von vornherein über die Validierung nur diese Eingaben zu erlauben (wie eigentlich?) und dann kann ich mir das Escapen ersparen, oder?

                          Gruß
                          JoeLio

                          Kommentar


                          • #28
                            Hallo und vielen, vielen Dank für eure Hilfe bisher!
                            Meine Kenntnisse wachsen und meine ersten Lösungen sind auch schon da.

                            Ich erlaube mir mal ausnahmsweise, mich selbst zu zitieren, denn mich würde interessieren, wie ihr das seht:
                            Zitat von JoeLio Beitrag anzeigen
                            In meinem Fall geht es aber gerade darum, dass ich nur ganz bestimmte Daten erfassen will. Es sollen z.B. Zahlenwerte von 1 bis 9 eingetragen werden (und alles andere wäre sowieso Unsinn, weil es bei der späteren Verarbeitung dieser Daten Probleme machen würde). In einem solchen Fall wäre es doch sinnvoll, von vornherein über die Validierung nur diese Eingaben zu erlauben (wie eigentlich?) und dann kann ich mir das Escapen ersparen, oder?
                            Wie ich hier im Forum schon öfter lesen konnte, sind die Profis unter euch sehr streng, was Sicherheit angeht - und das bestimmt zu recht!
                            Ich würde gern wissen, wie ihr meinen oben geschilderten Fall einschätzt und freue mich über Antworten dazu. (Oder gehört das nicht mehr unter "Datenbanken"?)
                            Gruß
                            JoeLio

                            Kommentar


                            • #29
                              Ich bleib dabei, benutz durchgehend Prepared Statements, dann kann dir escaping egal sein und die Frage erübrigt sich.
                              Ansonsten, User-Input immer escapen -> Nr.sicher
                              [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


                              • #30
                                Hi JoeLio,

                                vielleicht noch als Anmerkung/Ergänzung:

                                Um bei einer großen Tabelle nicht alle Datensätze (Tabellenzeilen) aktualisieren zu müssen, sondern nur die, die in der Tabelle geändert wurden,

                                kannst du den Datensätzen in der Tabelle noch ein CheckboxArray "spendieren":

                                PHP-Code:
                                <?php
                                error_reporting 
                                (E_ALL); 
                                ini_set ('display_errors'true);
                                $conn = new PDO("mysql:host=localhost;dbname=test""guenni""guenni");
                                /*
                                * Tabelle abfragen
                                */
                                $query "select id, vorname, nachname from tabelle2 order by nachname";
                                $stmt $conn->prepare($query);
                                /*
                                * $stmt->execute() gibt true bei Erfolg, false bei Mißerfolg zurück
                                */
                                $ok $stmt->execute();
                                ?>
                                <!DOCTYPE HTML>
                                <html>
                                <head>
                                <title>Update Tabelle</title>
                                </head>
                                <body>
                                <?php
                                /*
                                * Enthält $ok false, Fehlerarray ausgeben
                                */
                                if($ok !== true){
                                 echo 
                                "<pre>";
                                 
                                print_r($stmt->errorInfo());
                                 
                                /*
                                 * Ansonsten Tabelle mit den Daten ausgeben
                                 */
                                }else{?>
                                            <form action="update_tabelle.php" method="post">
                                            <table border = "1">
                                            <tr>
                                            <th>Vorname</th><th>Nachname</th><th>Edit</th>
                                            </tr>
                                            <?php 
                                            
                                while($data $stmt->fetch(PDO::FETCH_ASSOC)){
                                             echo 
                                "<tr>";
                                             echo 
                                "<td><input type = \"text\" name = \"vorname[".$data['id']."]\" value = ".$data['vorname']."></td>";
                                             echo 
                                "<td><input type = \"text\" name = \"nachname[".$data['id']."]\" value = ".$data['nachname']."></td>";
                                             
                                /*
                                             * An jede Zeile eine Checkbox anhängen, um Datensätze auszuwählen
                                             */
                                             
                                echo "<td><input type = \"checkbox\" name = \"edit[".$data['id']."]\" value = ".$data['id']."></td>";
                                             echo 
                                "</tr>";
                                            }
                                            
                                ?>
                                            <tr>
                                            <td colspan="3">
                                            <input type="submit" name="cmd" value="Update">
                                            </td>
                                            </tr>
                                            </table>  
                                            </form>
                                            <?php }
                                ?>
                                </body>
                                </html>
                                Im Zielscript, siehe Form, kannst du dann die angewählten Datensätze aktualisieren

                                PHP-Code:
                                <?php
                                error_reporting 
                                (E_ALL); 
                                ini_set ('display_errors'true);
                                $conn = new PDO("mysql:host=localhost;dbname=test""guenni""guenni");
                                if(!isset(
                                $_POST['edit'])){
                                 echo 
                                "Es wurden keine Datensätze zum Ändern gesendet.";
                                 echo 
                                "<a href=\"javascript:history.back()\"> Zurück </a>";
                                 exit;
                                }
                                /*
                                * Prepared Statement mit Platzhalter
                                */
                                $query "update tabelle2 set vorname = ?, nachname = ? where id = ?";
                                $stmt $conn->prepare($query);
                                /*
                                * Jeden Datensatz, dessen Checkbox angewählt ist, aktualisieren
                                */
                                foreach($_POST['edit'] as $id){
                                 
                                $stmt->execute(array($_POST['vorname'][$id], $_POST['nachname'][$id], $id));
                                }
                                header("location: edit-user2.php");
                                exit;

                                Gruß
                                Günni

                                Kommentar

                                Lädt...
                                X