kostenloser Webspace werbefrei: lima-city


php Daten aus Tabelle entnehmen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    sidezockinglp

    sidezockinglp hat kostenlosen Webspace.

    Hey liebe Community,

    Möchte mir gerne php beibringen und stehe vor einem Problem :( Folgendes:

    Ich habe eine Tabelle generiert mit einem select input control und 2 Buttons sowie ein paar einfache Textfelder. Ich möchte jetzt erreichen dass ich beim klicken eines Buttons Code ausführen kann der mit den Werten aus der Tabellen Zeile arbeiten kann. Da es ja 2Buttons sind müssten dass auch 2 unterschiedliche Aktionen seit.

    Ich hoffe jemand von euch hat hier eine Idee :)

    Grüße
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. sidezockinglp schrieb:
    Ich habe eine Tabelle generiert mit einem select input control und 2 Buttons sowie ein paar einfache Textfelder. Ich möchte jetzt erreichen dass ich beim klicken eines Buttons Code ausführen kann der mit den Werten aus der Tabellen Zeile arbeiten kann. Da es ja 2Buttons sind müssten dass auch 2 unterschiedliche Aktionen seit.
    Das hängt stark davon ab, wie das ganze aufgebaut und übertragen wird. Grundsätzlich werden Daten, die an PHP übergeben werden über die Variablen aus Externen Quellen gehandhabt. Darunter speziell $_GET und $_POST. Welche dieser beiden Variablen verwendet wird, hängt davon ab, wie das Formular übertragen wird - angegeben im HTTP-Form-Tag, zum Beispiel
    <form method="GET">
    für Variablen, die über die URL weiter gegeben werden oder
    <form method="POST">
    für Variablen, welche im HTTP-Content-Bereich übertragen werden. Für Formulardaten verwendet man im Regelfall die POST-Variante, da dies unübersichtliche URLs vermeidet und bei der Verwendung von SSL automatisch verschlüsselt wird. Es gibt jedoch auch Fälle, wo die Übertragung über GET sinnvoll sein kann - das hängt immer vom Anwendungsfall ab.

    Der Zugriff auf diese Variablen gestaltet sich relativ einfach: Über
    $_GET['feldname'];
    bekommt man Zugriff darauf.
    Wenn man nun eine Tabelle hat, hängt die Art des Zugriffs auf die Daten stark davon ab, wie das Formular organisiert ist. Du könntest sie beispielsweise mit
    <input name="feldname[]">
    unsortiert in ein Array übertragen - wobei sich nicht sicher feststellen lässt, welche Zeile nun an welcher Stelle steht. Hat man nun eine Zweidimensionale Tabelle, kann man weiter mit
    <input name="feldname[][]">
    und so weiter arbeiten. Wenn die Positionen der Zellen wichtig sind, kann man mit etwas wie
    <input name="feldname[zeile1][spalte1]">
    arbeiten.

    Der Zugriff innerhalb von PHP gestaltet sich dann wie bei jedem anderen Array.
    <?php
    foreach($_GET['feldname'] as $zeilenname => $zeileninhalt){
        foreach($zeileninhalt as $spaltenname => $spalteninhalt){
            echo "In Zeile " . $zeilenname . " in Spalte " . $spaltenname . " steht " . $spalteninhalt . "<br/>";
        }
    }
    
    // Alternativ
    
    echo $_GET['feldname']['zeile1']['spalte1'];
    ?>

    (Natürlich sollte man im realen Anwendungsfall niemals ungefiltert Variablen ausgeben, welche über POST oder GET übertragen werden!)

    Ohne den speziellen Fall zu kennen, kann man leider nicht genauer darauf eingehen.

    Ein einfaches, vollständiges Beispiel mit einer 5x5-Tabelle:
    <!DOCTYPE html>
    <html lang="de">
        <head>
            <title>Tabellentest</title>
            <meta charset="utf-8">
        </head>
        <body>
            <form method="post">
                <?php
                    for($zeile = 1; $zeile < 6; $zeile++){
                        for($spalte = 1; $spalte < 6; $spalte++){
                            echo '<input type="text" name="feldname[zeile'. $zeile .'][spalte' . $spalte . ']"/>';
                        }
                        echo "<br/>";
                    }
                ?>
                <input type="submit" value="senden"/>
            </form>
    
            <?php
    
            if(array_key_exists('feldname', $_POST)){
                foreach($_POST['feldname'] as $zeilenname => $zeileninhalt){
                    foreach($zeileninhalt as $spaltenname => $spalteninhalt){
                        echo "In Zeile " . $zeilenname;
                        echo " in Spalte " . $spaltenname;
                        echo " steht " . $spalteninhalt;
                        echo "<br/>";
                    }
                }
                // Alternativ
    
                echo "In Zeile 1, Spalte 1 steht : " . $_POST['feldname']['zeile1']['spalte1'] . "<br/>";
            }
            ?>
        </body>
    </html>
    Auch hier gilt wieder: Dies ist ein reiner Übungsfall - für reale Anwendungen sollten NIEMALS ungeprüft irgendwelche Benutzergenerierten Eingaben als Augabe verwendet werden.

    Beitrag zuletzt geändert: 16.11.2018 10:37:26 von noxious
  4. Autor dieses Themas

    sidezockinglp

    sidezockinglp hat kostenlosen Webspace.

    Hey @noxious , wow danke für die tolle und ausführliche Antwort. Viel neues gelernt und funktioniert soweit. Ein Frage noch: Du sagst ja öfter dass man die im realen nicht einfach so ausgeben sollte. Wie sollte man dass dann machen? Ist das weil man den Datentyp erst checken muss, oder kann man darüber bösartige scripts ausführen? Als konkretes Beispiel mal ein Loginsystem, bei dem ich nach erfolgreichen Login den Namen anzeigen will..

    Grüße
  5. h***********r

    Die Eingabe muss unbedingt bei so etwas wie einem Login System geprüft werden. Setzt du sonst das einfach so in deine SQL Abfrage ein, kann man mit der passenden Eingabe die Datensätze auslesen, anpassen, oder die ganze Tabelle löschen.
    Deswegen benutzt man dafür SQLI und PreparedStatements http://php.net/manual/de/book.mysqli.php http://php.net/manual/de/mysqli.quickstart.prepared-statements.php
    Bei anderen Eingaben kann man auch eigenen Code durch die Eingabe ausführen womit dann so ziemlich alles möglich sein kann.
    Also all das was NIEMALS passieren sollte.

    Bei dem Beispiel mit der Tabelle wäre es z.Bsp möglich das der Nutzer einfach Werte austauscht im geladenen Code und dann das mit seinem Inhalt zurück sendet.

    Beitrag zuletzt geändert: 16.11.2018 15:57:58 von horstexplorer
  6. sidezockinglp schrieb:
    Hey @noxious , wow danke für die tolle und ausführliche Antwort. Viel neues gelernt und funktioniert soweit. Ein Frage noch: Du sagst ja öfter dass man die im realen nicht einfach so ausgeben sollte. Wie sollte man dass dann machen? Ist das weil man den Datentyp erst checken muss, oder kann man darüber bösartige scripts ausführen? Als konkretes Beispiel mal ein Loginsystem, bei dem ich nach erfolgreichen Login den Namen anzeigen will..

    Grüße
    Wenn du beispielsweise in das von mir gepostete (vollständige) Beispiel in die Tabelle Werte wie
    <b>irgend</b> was <i>komisches</i>
    einträgst und das ein mal absendest, wird dir möglicherweise bewusst, worum es geht: Es öffnet Angriffen wie XSS und ähnlichem die Tür. Die Liste, was dort schief gehen kann, ist quasi endlos.

    Was man da genau machen sollte, ist vom Fall abhängig. In den meisten Fällen prüft man es so restriktiv wie mögich - sollte in einem Feld also nur eine Zahl drin stehen, könnte man dies mit intval sicher stellen. Ansonsten sind PCRE-Funktionen ein häufiges Mittel, um mittels Regulären Ausdrücken den Inhalt auf Validität zu überprüfen. Zudem gibt es die Funktion htmlspecialchars*, welche ich persönlich aber bestenfalls zur korrekten Darstellung von Sonderzeichen verwende. Ein weiterer, häufig gemachter Fehler ist die falsche Verwendung von Vergleichsoperatoren - PHP hat als untypisierte (Oder: Dynamisch typisierte) Sprache zwei unterschiedliche Vergleichsoperatoren: Den
    ==
    , welcher überprüft, ob beide Inhalte gleichwertig sind und
    ===
    welcher überprüft, ob beide Variablen den gleichen Wert und den gleichen Typ haben. Das Problem entsteht dann, wenn in einem Wert beispielsweise "0EinSTring" steht und dieser mit 0 verglichen wird, ergibt der
    ==
    -Operator einem true (wahr) zurück, während der
    ===
    -Operator false (falsch) zurück gibt. Das liegt daran, dass der
    ==
    -Operator den String "0String" versucht in eine Zahl umzuwandeln - und da eine 0 drin vorkommt, nimmt er an, dass es 0 ist. Das kann zu gefährlichen Ergebnissen führen.

    Das Problem an der Sache ist: Es gibt leider kein Universalrezept, welches man dort anwenden kann. Was genau du zu tun hast, hängt vom jeweiligen Anwendungsfall ab. Ich weiß, das ist ein deprimierende Antwort.
    Um es zu umschreiben: Sorge dafür, dass Dinge, die du ausgibst, nur das enthalten können, was auch darin stehen soll. Willst du einen Benutzernamen darstellen, setze fest, welche Zeichen für einen Benutzernamen erlaubt sind und validiere dagegen. Überprüfe am besten jede einzelne eingabe von Daten auf deren Validität. Nehme niemals an, dass Variablen von externen Quellen das enthalten, was du annimmst.

    Ein kleiner Disclaimer: Ich bin kein PHP-Sicherheits-Profi. Und das Thema ist unglaublich umfangreich - es gibt da so viel zu beachten, dass es nicht möglich ist, hier jede eventualität abzudecken. Abgesehen davon, kenne ich auch nicht jede Sicherheitslücke. Aber ich hoffe ich konnte einen kleinen Einblick in etwaige Problematiken liefern.

    *EDIT: Mir ist da ein kleiner Fehler unterlaufen: Ich habe htmlspecialchars mit htmlentities verwechselt. htmlspecialchars ist ausdrücklich dafür geschaffen HTML-Injection zu vermeiden, während htmlentities für Sonderzeichen verwendet wird.(Während letztere auch HTML-Injection vermeidet.) Dennoch bin ich mir nicht sicher, ob beide Funktionen wirklich sicher sind - ich würde sie also nur verwenden, wenn es unabwendbar ist, dass Sonderzeichen ausgegeben werden.

    Beitrag zuletzt geändert: 16.11.2018 16:17:28 von noxious
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!