QA@IT

if ($_GET['xxxxxx'] == 'A' or ‘B’)の記述のorについて

3310 PV

初歩的な質問で申し訳ございませんが、ご教授頂けませんでしょうか。

情報サイトを作成していて、下記の様なURLの情報によってその詳細ページの下位に配置したブロックに情報を抽出して表示する設定にしております。

http://xxxx/product/detail.php?product_id=1&class=スポーツ

if ($_GET['class'] == 'スポーツ' or '体育' or ‘Sports’) {
$arrval = Array(Aコース);

上記の様なURLに対してphpで記述するif ($_GET の構文で選択肢がひとつだけでは正しいものを抽出するのですが、上記の様にorを用いて選択肢を増やすと機能しなくなります(例えばURLのclass=に何もない状態、あるいは上記の3つの選択肢以外の文言でも回答を抽出する)。構文上問題があるのでしょうか。

  • 省略しすぎです、通常は
    if ( ($_GET['class'] == 'スポーツ') or ($_GET['class'] == '体育') or ($_GET['class'] == ‘Sports') ) {

    と記述するのではないですか?
    -

回答

== は or よりも優先順位が高いので

$_GET['class'] == 'スポーツ' or '体育' or ‘Sports’
$_GET['class'] == 'スポーツ'」 または 「'体育'」または 「‘Sports’
となります(体育とSportsは$_GETは関係なく評価されます 。
「または」と書いてますが実際には論理和なので文字から受ける感じとは振る舞いは異なります。
論理演算についてここで詳しく書きませんが、このため優先順位を変えて

$_GET['class'] == ('スポーツ' or '体育' or ‘Sports’)

と書いても期待する結果にはなりません。

akira_onozukさんが書いているように

if ( $_GET['class'] == 'スポーツ' or $_GET['class'] == '体育' or $_GET['class'] == ‘Sports' ) {

と書く必要があります。

質問に書いたように簡潔にしたい場合は 'スポーツ' '体育' ‘Sports’ を中身にもつ配列を用意して in_array関数を使うなどの方法をとる必要があります。

余談ですが、$_GETがそもそも'class'というキーを持っているかを最初にチェックしたほうが良いと思います。
(is_setをつかってチェックするかfilter_inputで値を取得するといいと思います)

編集 履歴 (0)

akira_onozuk 様、flied_onion様、

ご回答そしてご解説頂きまして感謝いたします。
回答の記述は見事に機能しております。素晴らしいです。

本件に直接関連したご質問になり、新たなスレッドをたてようかどうかと考えたのですが、
この質問の流れでご質問させて頂きます。

以下の様に$arrvalはその上の$where句の最後のT1.class IN ( ? )の?に当てはまる内容のものを抽出する設定になっております。これも同様に複数の選択肢を持たせたい場合のあらゆる書き方以下の様に試したのですが分かりません。(以下の$arrvalの設定では機能しておりません。)

$where = $GET['product_id'].'!= T1.product_id and T2.delflg = 0 and T1.class IN ( ? )';

if ( ($_GET['class'] == 'スポーツ') or ($_GET['class'] == '体育') or ($_GET['class'] == ‘Sports') ) {
$arrval = (Array(Aコース) or Array(aコース) or Array(A course));

この$arrvalが複数の選択肢から構成される場合の書き方をご教授頂けませんでしょうか。

編集 履歴 (0)
  • or 演算子について調べてみる事をお勧めします。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。