速報

imgproxyのICO処理にコード実行のおそれ|4.0.16だけでは残る問題を確認

CATEGORY

【PHP】json_decode()がnullを返す?解消するまでに試したこと

※本ページのリンクにはプロモーションが含まれています。

【PHP】json_decode()がnullを返す?解消するまでに試したこと

目次

本記事では、PHPでjson_decode()した結果「NULL」になった際に、解消するまでに試したことをご紹介しています。

「NULL」を返す原因はぞれぞれ異なると思いますので、こんなケースもあるんだな~くらいに見ていただいて、もし同じ方法で解決する内容であれば、私としてはうれしい限りです!

では、解説していきます。

スポンサーリンク

json_decode()するとnullになる?

今回発生したケースになります。

外部のURLのを取得し、取得した結果をダンプしてみます。内容を確認するつもりでダンプしているため、JSONを取得した後にやるべきことを頭の中でまとめながらブラウザの更新ボタンをぽちっとクリック。

$json = json_decode($url);
var_dump($json)

すると。

実行結果

NULL

ん? 「NULL」?

最近仕事でプロブラムばかり書いて目が疲れているのかもしれません。URLにアクセスしてJSONファイルがブラウザ上で表示されることを確認し、再度ブラウザの更新ボタンをクリックします。

実行結果

NULL

しかし、ブラウザには憎き「NULL」の文字が鎮座しています。何度更新しても「NULL」の文字が表示されます。

え、なんで「NULL」?

再度、ソースを見直します。ただ単に引数の指定が足りないだけかもしれません。

$json = json_decode($url);
var_dump($json)

あ、第二引数指定するの忘れてる……。

これが原因に違いない! とソースを下記の用に修正します。

$json = json_decode($url, true);
var_dump($json)

そして自信満々にブラウザの更新ボタンをクリックします。(実際には「F5」を押下しています。)

が。

実行結果

NULL

実行結果は変わりません。何回か「F5」を押下してみましたが、何度やっても「NULL」「NULL」「NULL」「NULL」「NULL」です。

しょうがないので、次の手を打ってみます。

JSONのエラーメッセージを確認する

PHPには便利な関数が用意されていて、直近で実行された「json_encode()」や「json_decode()」のエラーメッセージを表示することができるものがあります。json_last_error_msgです。(リンク先は「PHP.net」です。)

エラーメッセージを見れば何かわかるかもしれない。先ほどのソースに一行追加して、ブラウザの更新ボタンをクリックします。

$json = json_decode($url, true);
echo json_last_error_msg();

実行結果

Syntax error

小さい文字で控えめに「Syntax error」と教えてくれてます。かしこくて素敵! と褒めたいところですが、困ったことに……このJSON、私の方で手を加えることはできません。別の開発会社がサーバーもファイルも管理しています。急ぎの仕事なので今から連絡して待つ、という時間はありません。

で、ふと少し前に同じJSONを使用して作成したサイトを見に行きます。ブラウザで新しいタブを開いてURLを叩きます。なんと、そのサイトではうまく情報を取ることができているではありませんか。

試しに問題のJSONをまじまじと見てみます。JSONはエンコードされた状態で提供されています。

スポンサーリンク

問題のJSONさんの中身

下記は問題となっているJSONファイルの中身の抜粋です。キーや値は変更しています。

"[
    {
        \"id\":\"123\",
        \"name\":\"abc\",
        \"created_at\":\"2019-10-24 21:00:00\"
    },
    {
        \"id\":\"456\",
        \"name\":\"def\",
        \"created_at\":\"2019-10-24 22:00:00\"
    }
]"

何やら「バックスラッシュ(もしくは円マーク)」が大量に書き込まれています。文字ですね。

もしかして、JSONの値にエスケープ文字が含まれているのが原因かもしれない!

エスケープ文字を取り除いてデコードしてみる

PHPでスラッシュを取り除くことができる「stripslashes」という関数を通して、再度確認してみることにします。

$json = json_decode(stripslashes($url), true);
var_dump($json)

気になる実行結果は。

実行結果

string(xxx) "[{"id":"123","name":"abc","created_at":"2019-10-24 21:00:00"}{"id":"456","name":"def","created_at":"2019-10-24 22:00:00"}]"

ようやくJSONを正常に取得することができました。エスケープ文字が原因で「Syntax error」が発生していたんですね。とりあえず原因がわかってすっきりです!

開発元に今回のケースを伝えて、私は私で実装を進めていきます。

スポンサーリンク

最後に

いかがでしたでしょうか。

今回のようなケースはあまりないかと思いますが「json_decode()」の結果が「NULL」になる場合、一つ一つ確認していくことで原因を解消することができます。焦らずに一つ一つ原因を確かめることが、結局一番早い近道かもしれないですね。

以上、PHPでjson_decode()がnullを返す?解消するまでに試したことのご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / アプリ開発者 / 技術ブログ運営者

福岡のWeb制作会社に勤務するWebエンジニアです。10年以上にわたりWeb制作・開発に携わり、ヒアリングや進行管理から、コーディング、CMSの構築、システム開発、サーバーの構築・保守・運用まで、Webサイト制作の工程を幅広く担当しています。Webサイトは、これまでに100以上の構築・保守を手がけてきました。

個人でもWebサイトの制作・改修やWebアプリの開発・運用を行い、AIを活用した開発にも取り組んでいます。近年はWebセキュリティにも注力しています。

2015年から技術メディア「Into the Program」を運営し、実務や開発で得た知識をもとに、プログラミングの実装方法やWebサイトの運用・セキュリティ情報を発信しています。

主な分野
Webサイト構築・保守・運用 / HTML/CSS / JavaScript / PHP / WordPress / サーバー構築・保守・運用 / アプリ開発 / セキュリティ対策
資格・試験合格
情報セキュリティマネジメント試験
基本情報技術者試験
AWS認定ソリューションアーキテクト アソシエイト
PHP8技術者認定ウィザード
メディア運営
2015年〜

記事の作成・更新について

セキュリティ記事は、ベンダーの公式アドバイザリやCVE・JVNなどの一次情報を参照し、出典と情報確認日を記載します。実環境での検証を行った場合は、その環境と確認範囲を明示します。重要な追加情報や誤りを把握した場合は、内容を確認して追記・訂正します。

関連する記事

おすすめの書籍

キーワードから探す

スポンサーリンク

エスケープ

特別な意味を持つ記号を、ただの文字として扱われる形に変換すること。XSSやSQLインジェクションを防ぐ基本の対策。

詳しく見る

JSON

データを「名前と値」の組で表す、軽くて読みやすいテキストの形式。APIのデータのやりとりなどで広く使われる。

詳しく見る