PHP json_decode

smallwall

Lt. Junior Grade
Registriert
Feb. 2014
Beiträge
446
Hi, ich habe mal wieder ein kleines Problem. Hier der Code

PHP:
$fav = filter_input(INPUT_COOKIE, "favorit", FILTER_SANITIZE_STRING);

echo $fav; // Output: {"462":"462","727":"727"}

$json = '{"462":"462","727":"727"}';
$object = json_decode($json, true);
var_dump($object);

$json = $fav;
$object = json_decode($json, true);
var_dump($object);

Das erste var_dump zeigt das Array wie gewünscht, das zweite NULL. Wieso?
 
Lass dir $fav mal mit var_dump ausgeben, echo bringt dir da nix wenn da irgendwelche Sachen escaped oder als htmlentities drin stehen.
 
PHP:
var_dump($fav);
echo "<br>\n";
$json = '{"293": "293"}';
$object = json_decode($json, true);
var_dump($object);
echo "<br>\n"; 
$json = $fav;
var_dump($json);
echo "<br>\n";
$object = json_decode($json, true);
var_dump($object);
echo "<br>\n";
HTML:
string(30) "{"293": "293"}" 
array(1) { [293]=> string(3) "293" } 
string(30) "{"293": "293"}" 
NULL
 
Zuletzt bearbeitet: (neuer cookie)
Woher kommt $fav? Ist das korrekt utf8 encodiert?

Ansonsten kannste hier mal gucken: http://stackoverflow.com/questions/2410342/php-json-decode-returns-null-with-valid-json

Kann vom BOM Header zu falsch encodeten Leerzeichen alles mögliche sein(achte mal aufs var_dump, ich für meinen Teil zähle da keine 30 Zeichen, da ist also irgendwelcher Müll in den Strings). Ich würd bei den Leerzeichen anfangen und die mal wie im Thread oben mit preg_replace rausschmeißen.

Wenn das nicht klappt kannste mal $fav per for Schleife durchlaufen und dir per echo chr($fav[$i]); die jeweiligen Positionen ausgeben lassen.
 
Zuletzt bearbeitet von einem Moderator:
PHP:
$fav = filter_input(INPUT_COOKIE, "favorit", FILTER_SANITIZE_STRING);
$fav2 = $_COOKIE["favorit"];

echo strlen($fav). " Zeichen <br>";
echo strlen($fav2). " Zeichen <br>";
Code:
30 Zeichen 
14 Zeichen

Das hat mal wieder 2 Stunden Kopfschmerzen bereitet. The hell?
 
Der Filter ersetzt die Anführungszeichen durch den Unicode-Code

Code:
&#034; // dezimale Repräsentation

(ich muss es in ein Code-Tag schreiben, sonst wird es im Forum wieder durch das Anführungszeichen ersetzt. Das gleiche ist dir auch beim Anschauen der Werte passiert, die Strings sehen ja optisch gleich aus).

json_decode kann damit aber nichts anfangen. Wende die Funktion direkt an (ohne Filter) und validiere dann halt die einzelnen Inhalte.

edit: lass dir im Browser mal den HTML-Quelltext deiner Seite anzeigen, dort solltest du das Problem erkennen können.
 
Zuletzt bearbeitet:
Ist die Frage ob man da überhaupt filtern muss. Ich mein du bekommst ein Array was du da später eh durchläufst und dessen Werte du im schlimmsten Fall per prepared Statement an die Datenbank gibst. Also ob du da jetzt filterst oder nicht macht im Endeffekt keinen Unterschied, selbst wenn man da validiert würde ich eher die Werte mit is_numeric testen, so wirklich ein Fall für sanitize_string ist das Imho sowieso nicht.

Falls du sowas mal wieder hast: ich mach da immer testweise noch ein htmlentities um den String beim echo oder wenns ganz arg kommt
Code:
for($i =0; $i<strlen($string);$i++) {
 echo(chr($string[$i]).'--'.$string[$i]);
}
 
PHP:
$fav = $_COOKIE["favorit"];
$obj = json_decode($fav);
Das funktioniert und ich lass es jetzt so. Netbeans meckert mich immer an "Don't use Superglobal ... directly", aber das ist mir jetzt egal.
Ergänzung ()

Nächstes Thema: Ich habe eine Seite auf der setze ich einen Cookie, diesen Cookie kann ich später in der Seite aber nicht auslesen. Ich bekomme immer den Wert des letzten Refresh.
PHP:
if (!empty($_POST["autoplaydelay"])) {    
    $apdelay = $_POST["autoplaydelay"];
    setcookie('settings_apdelay', $apdelay);
}

if (!empty($_POST["autoplay"])) {
    $ap = $_POST["autoplay"];
    setcookie('settings_ap', $ap);
}

?>

Ihre Einstellungen

<form action="settings.php" method="POST">
    
    <label for="autoplay">Autoplay</label>
    <input type="checkbox" name="autoplay" value="autoplay" checked>
    <br>
    <label for="autoplaydelay">Autoplay Geschwindigkeit (aktuell <?php echo $_COOKIE["settings_apdelay"];  ?>)</label>
    <select name="autoplaydelay">
        <option value="0,5">0,5 Sekunden</option>
        <option value="1">1 Sekunden</option>
        <option value="1,5">1,5 Sekunden</option>
        <option value="2">2 Sekunden</option>
        <option value="2,5">2,5 Sekunden</option>
        <option value="3">3 Sekunden</option>
        <option value="4">4 Sekunden</option>
        <option value="5">5 Sekunden</option>
        <option value="6">6 Sekunden</option>
        <option value="7">7 Sekunden</option>
        <option value="8">8 Sekunden</option>
        <option value="9">9 Sekunden</option>
        <option value="10">10 Sekunden</option>
    </select>
    <br>
    <label for="colors">Colors</label>
    <select name="colors">
        <option value="light">Light</option>
        <option value="dark">Dark</option>
        <option value="red">Red</option>
        <option value="blue">Blue</option>
        <option value="green">Green</option>
    </select>
    <br>
    
    <input type="submit" id="ok" value=" Speichern ">

</form>
 
Vielleicht verstehe ich dich falsch, aber genau so funktionieren Cookies nunmal. Mir scheint es so, als willst du im selben Request den Wert eines Cookies setzen und wieder auslesen. Wenn du aber in einem Request ein Cookie setzt, dann "siehst" du den gesetzten Wert erst beim nächsten Request des Benuters, denn das Cookie muss ja erstmal beim User landen, bevor es überhaupt zurück an den Server geschickt werden kann.

edit: willst du in deinem Formular den richtigen aktuellen Wert anzeigen, dann musst du prüfen, ob der Wert beim aktuellen Request über POST verändert wurde. Ist das nicht so, dann zeigst du den Wert aus dem Cookie an; ist es hingegen so, dann zeigst du stattdessen $apdelay an.
 
Zuletzt bearbeitet:
Da meckert Netbeans völlig zurrecht, mit dem Filter machst dus aber nicht besser sondern trickst nur Netbeans aus, der rallt an der Stelle schlicht nicht, dass du auch auf den Cookie zurückgreifst (glaube ich).
 
mambokurt schrieb:
Da meckert Netbeans völlig zurrecht, mit dem Filter machst dus aber nicht besser sondern trickst nur Netbeans aus, der rallt an der Stelle schlicht nicht, dass du auch auf den Cookie zurückgreifst (glaube ich).

Wie meinst du das? Auf das Cookie zugreifen ist doch gerade der kritische Punkt.
 
Ich glaube ich habe die Fehlermeldung missverstanden. Ich dachte der meckert da weil es kein guter Stil ist, in einer Funktion Post/Get usw zu benutzen, aber ich hab gerade mal gegoogelt und wie es aussieht will er da wirklich nur einen Filter.
Ich weiss nicht ob ich die Warnung nicht einfach abstellen würde, find ich eher meh.

Davon ab: ich hab gerade mal im Manual geschaut, so richtig erklärt was die Filter nun machen(was wird durch was wann ersetzt mit welchem encoding - gut wird immer Utf8 sein) wird da auch nicht, oder? Also ich hab da nur eine Liste gefunden mit 'filter_sanitize_string - räumt Strings auf', so in der Art zumindest. Finde ich etwas dürftig für eine Funktion, der ich meine Daten anvertraue und die da potentiell dran kapputtändert... :freak:
 
Zurück
Oben