下記のコードでは、sprintfにクエリを書いていますが、その中でも一部の行だけifを使って条件分岐で切り替えることができないものかと思いました? もちろん下記のコードでは動きませんが、イメージとしては、このような感じです。


try{

$sql = sprintf('SELECT '
. 'SQL_CALC_FOUND_ROWS %1$s.ID,'
. '%1$s.ID, '
. '%1$s.post_author,'
. '%1$s.post_title, '
. '%1$s.post_date, '
. '%1$s.post_status,'
. '(SELECT %2$s.name FROM %2$s WHERE %1$s.category = %2$s.term_id) AS category , '
. '(SELECT %2$s.name FROM %2$s WHERE %1$s.category_child = %2$s.term_id) AS category_child , '
. '%1$s.post_content , '
. '(SELECT count(%3$s.post_id) FROM %3$s WHERE %1$s.ID = %3$s.post_id) AS b_count, '
. '(SELECT count(%4$s.post_id) FROM %4$s WHERE %1$s.ID = %4$s.post_id) AS l_count, '
. '(SELECT count(%5$s.comment_ID) FROM %5$s WHERE %1$s.ID = %5$s.comment_post_ID) AS c_count '

if(isset($ID)){
. 'FROM %1$s WHERE %1$s.post_author = :post_author AND %1$s.post_status = 2 ORDER BY %1$s.post_date DESC LIMIT %6$s, %7$s', $this->posts, $this->category,$this->bookmark,$this->like,$this->comments,$limit, $offset);
}elseif(isset($ID) AND $ID==$user_id){
. 'FROM %1$s WHERE %1$s.post_author = :post_author AND %1$s.post_status = 3 ORDER BY %1$s.post_date DESC LIMIT %6$s, %7$s', $this->posts, $this->category,$this->bookmark,$this->like,$this->comments,$limit, $offset);
}else{
. 'FROM %1$s WHERE %1$s.post_author = :post_author AND %1$s.post_status = 1 ORDER BY %1$s.post_date DESC LIMIT %6$s, %7$s', $this->posts, $this->category,$this->bookmark,$this->like,$this->comments,$limit, $offset);
}


$stmt = $this->db->prepare($sql);
$stmt->bindValue('post_author', $user_id);
$stmt->execute();
$data['all'] = $stmt->fetchAll();

A 回答 (1件)

三項演算子でがんばってみては?



$flg=true;
$str="hogehoge".($flg?" fugafuga":" piyopiyo")." hogera";
print $str;

※ただし三項演算子で条件が3つになるとグルーピングを明確にしないといけませんが・・・
    • good
    • 0
この回答へのお礼

ありがとうこざいます。
三項演算子はこのような使い方もできるのですね。知りませんでした。
三項演算子はたまに見かけるものの、自分に限っては、ifばかりで分岐していたので勉強になります。

お礼日時:2017/05/15 23:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q$str=preg_replace('/\u3000/','  ',$str);

によってutf-8の空白文字をhtmlの空白文字に変換しようとしたのですがエラーになります
どうしたらいいのでしょうか?

Aベストアンサー

>そもそも?のところにコード表現で空白文字を入力する手段はないのでしょうか?
\xE3\x80\x80
で一応いいかと思いますが…

Q$str=mb_ereg_replace('goo','グッド',$str);

によって
$strの中の'good'を'グッド'に変更したいのですが
'good'は大文字と小文字を区別しないようにしたいのですがどうしたらいいでしょうか?
例えば
'goOd'も'グッド'にしたいのです。
PHPマニュアルには詳しい使い方が載っていないので困っています。

Aベストアンサー

大文字小文字を無視するなら
mb_eregi_replace
では?

参考URL:http://jp2.php.net/manual/ja/function.mb-eregi-replace.php

Qif (isset($_POST["body"]) && $_POST

if (isset($_POST["body"]) && $_POST["body"])の中の&& $_POST["body"]って必要ですか?
PHPのプログラムを読んでいて、以下のような部分を見つけました
if (isset($_POST["body"]) && $_POST["body"])

しかし、どうせisset($_POST["body"])でnullかどうか、値が入っているかどうかを確めているので、&& $_POST["body"]の部分は必要ないように思います。なぜこのような書き方をしているのでしょうか?

Aベストアンサー

 isset($_POST["body"])では値が入っているかどうかを調べていますが、値が何であるかは問いません。その値を判定しているのが二つ目の式です。
 PHPの論理判定では値が0の時に偽になり、それ以外の時は真になります。つまり、$_POST["body"]の値が0かどうかを判定しています。($_POST["body"] != 0)と同じです。

 判定式全体では、$_POST["body"]に0以外の値が入っている時に真になり、値が入っていないか0の時に偽になります。

Qformタグを使用した時の$_POST['example ']の受取り

今MySQLを使用して、サンプルのデータベースを構築して、HP上で条件検索して結果を表示できるようなプログラムを作っています。
そこで質問したいのですが、formタグの中でinputタグ等を記述し他のphpファイルにデータを送るとき、nameで"example"と記述したとしたら$_POST['example']のような形で受け取ると思うのですが、例えばwhile等でチェックボックスを複数作成(以前にとある処理があり、その結果によって作成される個数が変動するとすると)して、各チェックボックスのデータを送る場合、配列を使用してnameで指定した"example"の後部に0から順番に"example0","example1"…と付け加えてやることでチェックボックスを判別してデータを送ってやろうと思ったのですが、その場合データの受取り側も$_POST['example0'],$_POST['example1']…と受けたら無ければなりません。しかしexampleの後部の数字をカウントしながらデータを受け取るやり方が分かりません。
こういった場合どうすればよいのでしょうか?
分かりにくい説明で理解し辛いとは思いますが、どうかよろしくお願いします。

今MySQLを使用して、サンプルのデータベースを構築して、HP上で条件検索して結果を表示できるようなプログラムを作っています。
そこで質問したいのですが、formタグの中でinputタグ等を記述し他のphpファイルにデータを送るとき、nameで"example"と記述したとしたら$_POST['example']のような形で受け取ると思うのですが、例えばwhile等でチェックボックスを複数作成(以前にとある処理があり、その結果によって作成される個数が変動するとすると)して、各チェックボックスのデータを送る場合、配列を使用してnam...続きを読む

Aベストアンサー

<input type="checkbox" name="example[]" value="A">A<br>
<input type="checkbox" name="example[]" value="B">B<br>
<input type="checkbox" name="example[]" value="C">C<br>
<input type="checkbox" name="example[]" value="D">D
の様にチェックボックスを書いている時
foreach($_POST['example'] as $Index => $Value){

}
の様にして値を取り出すことができます。

Qpreg_match( '/^(\D+)(\d*)$/' , $変数 , $regs )

if( ! preg_match( '/^(\D+)(\d*)$/' , $変数1 , $regs ) )
{echo ( 'invalid dirname: ' . htmlspecialchars( $変数1 ) );}
$変数2 = $regs[2] === '' ? '' : intval( $regs[2] ) ;

正規表現だと思うのですが、どういう意味か教えてください。

□分からないなりに考えてみました…
▽1行目
$変数の内容が、'/^(\D+)(\d*)$/'にマッチしなければ、$regs へ代入。
▽2行目
マッチしていた場合は、htmlspecialchars関数を実行した後、'invalid dirname: '+その結果を表示する。
▽3行目
$regs配列変数の1番目を、何かして、$変数2 へ代入する。

……誰か教えてください…。

Aベストアンサー

>どこら辺に問題ありそうでしょうか?

まずpreg_matchで$regsを生成していますが、マッチしないケース
すなわち「数字からはじまる文字列」の場合、$regsが未設定になります。
したがって$regs[2] === ''で評価すると$regsが未設定エラーになります。
またエラーレベルを下げた場合でも、$regs[2] === ''はfalseなので
数字ではない文字列をintvalで評価するため$変数2には0が代入されます。

やはりif分岐である程度場合分けをしっかりしてやらないといけないでしょう。
総じて$変数1に代入される文字列の想定を広げて、チェックしてやる必要があります。

また、仮にデータがきちんと通ったとして、$変数2は空文字か数字という
データ型が確定しないフローになっています
たしかにPHPは変数定義がいい加減ではありますが、あまりなんでも
かんでも入れればいいというものではありませんので、ある程度
変数の型が一律になるような工夫が必要だとおもいます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報