先日、TwitterAPIのツイートに添付している画像をデータベースに格納するという記事の続きです。問題点をSNS上に投げて「ひとりつっこみ」をしていたところ、親切な方からアドバイスをいただくことができました。
問題のおさらい
テストだよ~ん。 pic.twitter.com/QnmnS5aGaR
— えちぜんや よーた (@echizenya_yota) 2015, 1月 20
Twitterの仕様である最大4枚の画像取得に対して、2枚の画像添付があるツイートを格納することを想定しています。問題となっている箇所のコードは、以下の通りです(詳しくはこちら)。
[php]
$stmt->execute(
array(
":tw_txt" => $tweet->text,
":tw_img0" => $tweet->extended_entities->media[0]->media_url,
":tw_img1" => $tweet->extended_entities->media[1]->media_url,
":tw_img2" => $tweet->extended_entities->media[2]->media_url,
":tw_img3" => $tweet->extended_entities->media[3]->media_url
)
);
[/php]
上の画像はコードを実行したときの、テーブルの中身です。画像が入っていないところにNULL値が入っています。一方、下の画像はブラウザ上での表示です。2つのNotice: Undefined offsetが表示されています。
調べていると、NULL値やエラーの問題については、isset,is_null,emptyなどのPHPの変数操作関数を使えば良いことが分かってきました。
isset関数
issetは変数がセットされていること、そして NULL でないことを検査します。
issetをそのまま使う
[php]
":tw_txt" => (isset($tweet->text) ? $tweet->text : ""),
":tw_img0" => (isset($tweet->extended_entities->media[0]->media_url) ? $tweet->extended_entities->media[0]->media_url : ""),
":tw_img1" => (isset($tweet->extended_entities->media[1]->media_url) ? $tweet->extended_entities->media[1]->media_url: ""),
":tw_img2" => (isset($tweet->extended_entities->media[2]->media_url) ? $tweet->extended_entities->media[2]->media_url :""),
":tw_img3" => (isset($tweet->extended_entities->media[3]->media_url) ? $tweet->extended_entities->media[3]->media_url : ""),
[/php]
取得した画像は2枚だけなので、tw_img2とtw_img3は何も入りません。従って、それぞれ空文字になっています。ブラウザ上でもエラーは表示されません。
!issetにする
[php]
":tw_txt" => (!isset($tweet->text) ? "" : $tweet->text),
":tw_img0" => (!isset($tweet->extended_entities->media[0]->media_url) ? "": $tweet->extended_entities->media[0]->media_url ),
":tw_img1" => (!isset($tweet->extended_entities->media[1]->media_url) ? "": $tweet->extended_entities->media[1]->media_url ),
":tw_img2" => (!isset($tweet->extended_entities->media[2]->media_url) ? "" : $tweet->extended_entities->media[2]->media_url),
":tw_img3" => (!isset($tweet->extended_entities->media[3]->media_url) ? "" : $tweet->extended_entities->media[3]->media_url ),
[/php]
ちなみに、”!(びっくりマーク)“を使ってissetを否定し、三項演算子内の中身を逆にすると、同じ結果が返ります。
is_null
is_nullは、変数が NULL かどうか調べます。
[php]
":tw_txt" => (is_null($tweet->text) ? "" : $tweet->text),
":tw_img0" => (is_null($tweet->extended_entities->media[0]->media_url) ? "" : $tweet->extended_entities->media[0]->media_url),
":tw_img1" => (is_null($tweet->extended_entities->media[1]->media_url) ? "" : $tweet->extended_entities->media[1]->media_url),
":tw_img2" => (is_null($tweet->extended_entities->media[2]->media_url) ? "" : $tweet->extended_entities->media[2]->media_url),
":tw_img3" => (is_null($tweet->extended_entities->media[3]->media_url) ? "" : $tweet->extended_entities->media[3]->media_url),
[/php]
is_nullで調べるのはNULL値だけなので、ブラウザ上では、”Notice: Undefined offset”が返ってきます。
empty
emptyは変数が空であるかどうかを検査します。
[php]
":tw_txt" => (empty($tweet->text) ? "" : $tweet->text),
":tw_img0" => (empty($tweet->extended_entities->media[0]->media_url) ? "" : $tweet->extended_entities->media[0]->media_url),
":tw_img1" => (empty($tweet->extended_entities->media[1]->media_url) ? "" : $tweet->extended_entities->media[1]->media_url),
":tw_img2" => (empty($tweet->extended_entities->media[2]->media_url) ? "" : $tweet->extended_entities->media[2]->media_url),
":tw_img3" => (empty($tweet->extended_entities->media[3]->media_url) ? "" : $tweet->extended_entities->media[3]->media_url),
[/php]
issetと同じくNULL値は表示されず、エラーも表示されません。ただ、個人的にはiset関数の方が見慣れていますので、emptyではなくissetを使いたいと思います。
〔参考サイト〕