[PHP] Array aus Listen-String

  • hi, mal was wohl einfaches.

    Code
    $zahlen = array($_POST["zahlen"]);

    funktioniert leider nicht.

    Code
    $zahlen = array(1, 2, 3);

    jedoch schon.

    WARUM?
    ich gebe in ein Formular auch 1, 2, 3 ein.

    Einmal editiert, zuletzt von DosAmp (17. April 2017 um 11:02)

  • Unabhängig von der Fragestellung: Niemals $_GET und $_POST verarbeiten, ohne vorher zu escapen! Du holst dir sonst Sicherheitslücken ins Script..


  • WARUM?
    ich gebe in ein Formular auch 1, 2, 3 ein.

    So viel Syntax-Magie hat PHP zum Glück nicht. ;) Das von dir angedachte Verhalten kann nur durch die explizite evaluierung eines Strings erreicht werden, was aber aufgrund der möglichen Inklusion von PHP-Code nicht sicher zu bewerkstelligen ist.
    Der erste Aufruf in dieser Form erstellt wie von dir angefordert nur ein Array mit genau einem String-Element:

    PHP
    $zahlen = array("1, 2, 3");

    Der richtige Ansatz ist entweder explode (die schnellere Lösung, wenn du genau weißt, dass z. B. immer ein Komma bzw. ein Komma und ein Leerzeichen das Trennzeichen sind) oder preg_split (Teilen anhand von beliebigem regulären Ausdruck) zu nutzen.

    PHP
    // akzeptiert Komma mit beliebiger Menge an nachfolgendem Leerraum (Leerzeichen, Tabulatoren etc.)
    $zahlen = preg_split('/,\s*/', '1, 2, 3');


    preg_split erlaubt auch die Mitgabe von Flags, mit denen z. B. leere Strings aus dem Ergebnis-Array ausgelassen werden können.


    Niemals $_GET und $_POST verarbeiten, ohne vorher zu escapen! Du holst dir sonst Sicherheitslücken ins Script..

    Ich weiß nicht, was der Sinn hinter dieser Binsenweisheit sein soll, aber Escaping als erster Schritt in der Eingabe ist grundsätzlich der falsche Ansatz zur sicheren Datenverarbeitung und häufig als Fehlerquelle für doppelt escapte Datensequenzen auf Websites zu finden.
    Man will eine situationsabhängige Validierung (z. B. alle Zeichen aus einem Nachnamen entfernen, die nicht zum lateinischen Zeichensatz gehören) in der Eingabe und Escaping abhängig vom Medium in der Ausgabe (z. B. mit htmlspecialchars auf einer Webseite oder wenn man den irischen Namen „O'Hare“ in der Datenbank speichern will, und aus unbekannten Gründen keine Prepared Statements benutzt).

  • Ich meine nicht nur htmlspecialchars, sondern zum Beispiel auch mysqli_real_escape_string. Man will nicht mit irgendwas verseuchtem weiter arbeiten, sondern sicherstellen, dass man sich ja nichts schädliches einspeichert. Das kann einem sonst im Nachhinein das Genick brechen.

  • Genau das habe ich auch geschrieben. Nur sollte man eben von vorherein vermeiden, dass man vergiftete Eingaben annimmt und passende APIs verwenden, die im Zweifelsfall auch vergiftete Eingaben sauber annehmen (was eben bei MySQL z. B. mysqli_prepare und mysqli_stmt_bind_param sind, die im Zweifelsfall auch schneller sind, als die Datenbank eine SQL-Anfrage parsen zu lassen, die – durch mysqli_real_escape_string gefilterte – und möglicherweise sehr lange Benutzerdaten enthält), dann kann man sich das Escapen beim Einlesen sparen.

  • Code
    $history = explode(",", $_POST["zahlen"]);
    $history = preg_split('/,\s*/', "$_POST[zahlen]");
    $zahlen = array($history);

    Datenbanken sind garnicht im spiel deswegen muss ich nicht auf sicherheit achten allerdings funktionieren diese beiden ansätze leider nicht.

  • $history ist bereits ein Array. Alles was die dritte Zeile macht, ist dieses Array in ein weiteres Array zu stecken.

    Pro-Tip: Die print_r-Funktion gibt dir rekursiv den Typ und Aufbau jedes PHP-Ergebnisses aus.

    PHP
    $history = explode(",", "1,2,3");
    print_r($history);
    Code
    Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
    )
  • Danke und ich hab grad noch sowas hier gebastelt was auch nicht besser funktioniert :D

    Code
    $history = explode(",", $_POST["zahlen"]);
    foreach ($history as $value) {
    $arrayin .= "$value[0],";
    }
    $arrayin = substr($arrayin, 0, -1);
    $zahlen = array($arrayin);

    Das hier geht natürlich einwandfrei:

    Code
    $zahlen = explode(",", $_POST["zahlen"]);
  • Hmmm

    Im JS fügst du dem String noch zwei geschweifte Klammern hinzu, sodass du '{1, 2, 3}' und damit ein JSON bekommst. Das schickst du in deinem Formular oder halt AJAX weiter und wandelst das dann im PHP von JSON in eine Liste um.


  • Im JS fügst du dem String noch zwei geschweifte Klammern hinzu, sodass du '{1, 2, 3}' und damit ein JSON bekommst.

    Das ist schon mal syntaktisch falsch. ;) In JSON hast du als strukturierte Datentypen entweder das "Array"

    Code
    [1, 2, 3]


    welche wie das PHP-Array eine bestimmte Reihenfolge einer beliebigen Menge von Daten abbildet, aber auf diese nur über einen Ganzzahl-Index ab 0 zugreifen kann, oder das Objekt

    Code
    {"eins": 1, "zwei": 2, "drei": 3}


    was wie das PHP-Array assoziativ ist (allerdings nur mit Strings als Schlüsseln), aber für deren Schlüssel keine bestimmte Reihenfolge definiert.

    Wenn man eine dieser Strukturen korrekt zusammengebaut hat (was schon vom Namen her kein Problem in Javascript darstellen sollte), kann man diese in der Tat auf PHP-Seite mit json_decode in eine Variable umwandeln. Allerdings werden JSON-Objekte nur zu assoziativen Arrays konvertiert, wenn man den zweiten Parameter auf TRUE setzt, ansonsten zu Instanzen von anonymen PHP-Klassen.

    PHP
    print_r(json_decode('[1, 2, 3]'));
    Code
    Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
    )

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!