Open Source Software

PHP Bug in json-c gefunden

Momentan arbeite ich an einem kleinen privaten Projekt. Um mir dabei das Programmieren bzw. Debuggen einfacher zu machen, verwende ich eine PHP printR Klasse. Diese funktioniert wie var_dump() und print_r() zusammen, ist aber übersichtlicher und umfangreicher gestaltet. Als ich dann mein neues Formular mit der Klasse debuggt habe, gab es ein Problem: Das Datum stimmte nach der Ausgabe nicht mehr.

Zuerst dachte ich, es liegt an dem CSS Framework Materialize. Denn hier wird ein eigener Datepicker verwendet, der das Datum wie folgt ausgibt: 13 June, 2016. Im Zusammenhang mit der printR Klasse wurde allerdings int(2016), anstatt (string) „13 June, 2016“ ausgegeben.

Ein Fehler im CSS Framework oder doch in der printR Klasse? Die Ausgabe mit „<?php echo $_POST[‚date_bye‘]; ?>“ ergab das gewünschte Ergebnis. Am Framework lag es also nicht. Sobald ich aber die Ausgabe mit <?php printR( $_POST[‚date_buy‘ ); ?> überprüfe, wurde jedes mal ein „int(2016)“ zurückgegeben. Eine andere Ausgabe als erwartet. Ist die printR Klasse schuld? Nein!

Eine Fehlerhafte Ausgabe von json_decode()

In der besagten Methode wurde nur json_decode() aufgerufen. Das ist eine gewöhnliche Funktion im json zu dekodieren. Da die Ausgabe nicht wie erwartet war, habe ich mir ein kleines Test Script geschrieben, um die besagte Funktion etwas genauer zu prüfen.

Das habe ich dann auch ausführlich getestet. Zusammen mit den Ergebnissen habe ich eine PHP Bug Meldung (Bug #72389 json_decode output date as (int)) eröffnet.

json-c commit c24fdc695810f16f57f6ca1b4dda11f7a8b74310

In dieser wurde mir heute bestätigt, dass es sich hierbei um einen Bug in der Pear Extension json-c handelt. Ein Pull Request für den Master existiert bereits. Sobald dieser Bugfix im Master gelandet ist, wird die Ausgabe NULL sein. Den genauen Commit findet man unter github.com/remicollet/pecl-json-c/commit/c24fdc695810f16f57f6ca1b4dda11f7a8b74310.

Mein PHP Test Script

<?php 
$theDate = '21 June, 2016';

var_dump( $theDate );
// output: string(13) "21 June, 2016"

echo '<hr>';

$myDate = json_decode($theDate, true);
var_dump($myDate);
// output: NULL

echo '<hr>';

$dt = new DateTime( $theDate );
$myDate = $dt->format('Y-m-d');
var_dump( $myDate );
// output: string(10) "2016-06-21"

echo '<hr>';

$dt = new DateTime( $theDate );
$myDate = $dt->format('Y-m-d');
var_dump( json_encode($myDate, true) );
// output: string(12) ""2016-06-21""

echo '<hr>';

// false output? : 

$dt = new DateTime( $theDate );
$myDate = $dt->format('Y-m-d');
var_dump( json_decode($myDate, true) );
// output: int(2016)

?>