コロンを使ったifと波括弧を使ったifでimgタグの出力を管理。三項演算子は使えなかった…
目次
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 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 } ?>
ですが、無条件でimgタグが表示されるため、src属性がないタグもしっかり表示されます。
画像があるときのみimgタグを表示
では、ifを使って画像の配列(tw_img0からtw_img4)に値がない場合、imgタグを表示させないという条件をつけます。
<?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 } ?>
これで配列に値がないときは、imgタグが表示されなくなりました
ifの種類について
実はこのコードに行きつくまで、条件文についてハマってしまいました。その条件文には、次の3つがあります。
- 波括弧を使ったif
- コロンを使ったif
- 三項演算子
上の例では、コロンを使ったifを用いています。波括弧を使ったifでも、同様に実行できます。
<?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 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>
三項演算子がスッキリとして良さげなんですが、エラーの原因は分かりません(汗
追記(2015/1/27)
後日、PHPタグ(<?php ?>)の中では、入れ子ができないことが分かりました。三項演算子の前に<?phpを使って、かつimgタグの中でも<?phpでも使うというのは不可ということです。
〔参考サイト〕