TwitterAPIで画像付きのツイートを、データベースに格納するとこんな感じになります。テーブル作成のクエリ文は以下の通り。
create table tweet_img ( id int(11) not null auto_increment primary key, tw_id text, tw_screen varchar(16), tw_date varchar(25), tw_txt text, tw_img0 varchar(256) default "", tw_img1 varchar(256) default "", tw_img2 varchar(256) default "", tw_img3 varchar(256) default "" );
今回は、これらのテーブルから読み込んでツイートの画像を表示させるときに、感じたことをいくつか書いてみたいと思います。
画像の有無に関わらずimgタグは表示
テーブルのレコードからツイートを表示させるために、PDOStatement::fetchAllを使うことになります。まず何も考えずに書くとこんな感じ。foreachから上の詳しいコードはこちらどうぞ。
[php]
<?php foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $user) { ?>
<?php echo $user[‘tw_screen’]."<br/>"; ?>
<?php echo $user[‘tw_date’]."<br/>"; ?>
<?php echo $user[‘tw_txt’]."<br/>"; ?>
<img src="<?php echo $user[‘tw_img0’]; ?><?php echo ‘:thumb’;?>"></br>
<img src="<?php echo $user[‘tw_img1’]; ?><?php echo ‘:thumb’;?>"></br>
<img src="<?php echo $user[‘tw_img2’]; ?><?php echo ‘:thumb’;?>"></br>
<img src="<?php echo $user[‘tw_img3’]; ?><?php echo ‘:thumb’;?>"></br>
<?php echo "<br/>"; ?>
<?php } ?>
[/php]
ですが、無条件でimgタグが表示されるため、src属性がないタグもしっかり表示されます。
画像があるときのみimgタグを表示
では、ifを使って画像の配列(tw_img0からtw_img4)に値がない場合、imgタグを表示させないという条件をつけます。
[php]
<?php foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $user) { ?>
<?php echo $user[‘tw_screen’]."<br/>"; ?>
<?php echo $user[‘tw_date’]."<br/>"; ?>
<?php echo $user[‘tw_txt’]."<br/>"; ?>
<!– 配列に値がない場合はimgタグを表示させない–>
<?php if (!empty($user[‘tw_img0’])): ?>
<img src="<?php echo $user[‘tw_img0’]; ?><?php echo ‘:thumb’;?>"></br>
<?php endif; ?>
<?php if (!empty($user[‘tw_img1’])): ?>
<img src="<?php echo $user[‘tw_img1’]; ?><?php echo ‘:thumb’;?>"></br>
<?php endif; ?>
<?php if (!empty($user[‘tw_img2’])): ?>
<img src="<?php echo $user[‘tw_img2’]; ?><?php echo ‘:thumb’;?>"></br>
<?php endif; ?>
<?php if (!empty($user[‘tw_img3’])): ?>
<img src="<?php echo $user[‘tw_img3’]; ?><?php echo ‘:thumb’;?>"></br>
<?php endif; ?>
<?php echo "<br/>"; ?>
<?php } ?>
[/php]
これで配列に値がないときは、imgタグが表示されなくなりました
ifの種類について
実はこのコードに行きつくまで、条件文についてハマってしまいました。その条件文には、次の3つがあります。
- 波括弧を使ったif
- コロンを使ったif
- 三項演算子
上の例では、コロンを使ったifを用いています。波括弧を使ったifでも、同様に実行できます。
[php]
<?php if(!empty($user[‘tw_img0’])) { ?>
<img src="<?php echo $user[‘tw_img0’]; ?><?php echo ‘:thumb’;?>"></br>
<?php } ?>
<?php if(!empty($user[‘tw_img1’])) { ?>
<img src="<?php echo $user[‘tw_img1’]; ?><?php echo ‘:thumb’;?>"></br>
<?php } ?>
<?php if(!empty($user[‘tw_img2’])) { ?>
<img src="<?php echo $user[‘tw_img2’]; ?><?php echo ‘:thumb’;?>"></br>
<?php } ?>
<?php if(!empty($user[‘tw_img3’])) { ?>
<img src="<?php echo $user[‘tw_img3’]; ?><?php echo ‘:thumb’;?>"></br>
<?php } ?>
[/php]
ですが三項演算子を用いると、文法エラーが指摘されます。
[php]
<?php if (!empty($user[‘tw_img0’])) ? "" : "<img src="<?php echo $user[‘tw_img0’]; ?><?php echo ‘:thumb’;?>">"; ?></br>
<?php if (!empty($user[‘tw_img1’])) ? "" : "<img src="<?php echo $user[‘tw_img1’]; ?><?php echo ‘:thumb’;?>">"; ?></br>
<?php if (!empty($user[‘tw_img2’])) ? "" : "<img src="<?php echo $user[‘tw_img2’]; ?><?php echo ‘:thumb’;?>">"; ?></br>
<?php if (!empty($user[‘tw_img3’])) ? "" : "<img src="<?php echo $user[‘tw_img3’]; ?><?php echo ‘:thumb’;?>">"; ?></br>
[/php]
三項演算子がスッキリとして良さげなんですが、エラーの原因は分かりません(汗
追記(2015/1/27)
後日、PHPタグ(<?php ?>)の中では、入れ子ができないことが分かりました。三項演算子の前に<?phpを使って、かつimgタグの中でも<?phpでも使うというのは不可ということです。
〔参考サイト〕