Neue Antwort schreiben 
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
[PHP] Array aus Listen-String
Michael_ Offline
Bier aus Hawaii

Beiträge: 1.510
Registriert seit: Feb 2011
Beitrag #1
[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.
(Dieser Beitrag wurde zuletzt bearbeitet: 17.04.2017 10:02 von DosAmp.)
17.04.2017 04:22
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
mrshadowtux
Unregistered

 
Beitrag #2
RE: array
Unabhängig von der Fragestellung: Niemals $_GET und $_POST verarbeiten, ohne vorher zu escapen! Du holst dir sonst Sicherheitslücken ins Script..
17.04.2017 09:00
Diese Nachricht in einer Antwort zitieren
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.219
Registriert seit: Jul 2008
Beitrag #3
RE: array
(17.04.2017 04:22)Michael_ schrieb:  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-Code:
$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-Code:
// 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.

(17.04.2017 09:00)mrshadowtux schrieb:  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).

CCITTグループ4またはZIP圧縮のモノクロ300dpiで最高の再現性
(Dieser Beitrag wurde zuletzt bearbeitet: 17.04.2017 09:58 von DosAmp.)
17.04.2017 09:55
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
mrshadowtux
Unregistered

 
Beitrag #4
RE: [PHP] Array aus Listen-String
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.
17.04.2017 10:15
Diese Nachricht in einer Antwort zitieren
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.219
Registriert seit: Jul 2008
Beitrag #5
RE: [PHP] Array aus Listen-String
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.

CCITTグループ4またはZIP圧縮のモノクロ300dpiで最高の再現性
(Dieser Beitrag wurde zuletzt bearbeitet: 17.04.2017 13:36 von DosAmp.)
17.04.2017 10:36
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Michael_ Offline
Bier aus Hawaii

Beiträge: 1.510
Registriert seit: Feb 2011
Beitrag #6
RE: [PHP] Array aus Listen-String
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.
17.04.2017 19:37
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.219
Registriert seit: Jul 2008
Beitrag #7
RE: [PHP] Array aus Listen-String
$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-Code:
$history explode(",""1,2,3");
print_r($history); 
Code:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

CCITTグループ4またはZIP圧縮のモノクロ300dpiで最高の再現性
(Dieser Beitrag wurde zuletzt bearbeitet: 17.04.2017 19:51 von DosAmp.)
17.04.2017 19:47
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Michael_ Offline
Bier aus Hawaii

Beiträge: 1.510
Registriert seit: Feb 2011
Beitrag #8
RE: [PHP] Array aus Listen-String
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"]);
17.04.2017 20:00
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
florida Offline
Erfahrener Benutzer

Beiträge: 543
Registriert seit: Feb 2010
Beitrag #9
RE: [PHP] Array aus Listen-String
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.
17.04.2017 20:20
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.219
Registriert seit: Jul 2008
Beitrag #10
RE: [PHP] Array aus Listen-String
(17.04.2017 20:20)florida schrieb:  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-Code:
print_r(json_decode('[1, 2, 3]')); 
Code:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

CCITTグループ4またはZIP圧縮のモノクロ300dpiで最高の再現性
17.04.2017 21:57
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste