PHPの不等式に変数を使って成り立たせる方法

このQ&Aのポイント
  • PHPの不等式に変数を使うことは可能でしょうか?左辺と右辺の間に変数を用いた不等式を成り立たせたい場合、どのような方法があるのでしょうか?
  • 変数を用いた不等式を成り立たせるためには、一時的に文字列として不等式を組み立てることが効果的です。例えば、変数$cに格納された不等式を解析し、条件分岐することで期待する結果を得ることができます。
  • 具体的な方法としては、strpos()やstrstr()を使って$cの内容を解析し、不等号の種類を特定して条件分岐する方法があります。例えば、$cに'=='が格納されている場合は左辺と右辺が等しいことを判定し、結果を出力するような処理を行うことができます。
回答を見る
  • ベストアンサー

PHPの不等式に変数を使う

いつもお世話になります PHPの不等式に変数を使うことは出来ますでしょうか? 例えば $a = 'huga'; $b = 'huga'; if($a == $b){ echo 'hoge'; } 結果 hoge 右辺と左辺の間、不等式を変数にしたいです $a = 'huga'; $b = 'huga'; $c = '==' if($a $c $b){ echo 'hoge'; } 期待する結果 hoge 上のソースはもちろんパースエラーとなり成り立ちません 型変換や考えられるキーワードで検索したのですが、出てきませんでした 下のように strpos()、strstr()等で$cの内容を解析して、条件分岐すれば期待の結果が出せるのは分かります if( strpos($c,'==') !== false && $a == $b){ echo 'hoge'; } (上記で成り立つのは分かります) 教えていただきたい内容は、「不等式を変数で成り立たせる方法」です $c= '=='; PHPに詳しい方お教えいただけると嬉しいです

  • PHP
  • 回答数5
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.5

evalの対象文字列が、すべてプログラム中のリテラルなら問題ないですが、それだとevalを使う意味が無い。そのまま書けば良いので。 evalの対象文字列の一部に、ファイルから読んだ文字列とか、ウェブで送信された文字列とかを含むならば、それらをevalしても安全かどうかを解析しないと、むやみにevalすると何が起こるかわかりません。いわゆる、脆弱性(攻撃されるとファイルを消されたり情報を盗まれたりする)です。 そこまで解析する手間を掛けてevalするくらいなら、質問文中にお書きのように $c を調べてif文で分岐するなどする方がずっと簡単です。

susan-styl
質問者

お礼

なるほどですね、納得です! evalの関数自体には問題がないことが分かったので安心しました。 1.$cはリテラルでないのではないかと仮定した 2.上の場合evalを使うのは乱暴である 初めに回答下さった方は、1番の説明を省略なさっていたので、僕には2番の意味が伝わらなかったのですね。 一応、preg_matchで通ったものを処理しますので 該当部分を悪意のあるユーザーに操作されることはないかと思います。 正規表現でやるか、全条件で分岐するか、あとは好みの問題ですかね。

その他の回答 (4)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

・毎度構文解析、コンパイルするのでパフォーマンスが落ちる。 文法間違いも実行時でないと判断できない。 ・悪意あるコマンドを実行されてしまう脆弱性がある。 ・なにをしているのかがよくわからない。 常に「eval」なので、関数名から直感的に連想しにくい。 eval はどうしても代替手段が無い時にだけにしておいた方がよいです。 例えば、関数compareでも作ってしまえば (中身は > if( strpos($c,'==') !== false && $a == $b){ とかでも構わない) > if(compare($a,$c, $b)){ > echo 'hoge'; > } とevalよりもはるかに直感的で安全なプログラムが書けます。 $cを()の外に出せる無名関数やクラスだと、より「二つの比較」であることがわかりやすくなります。

susan-styl
質問者

お礼

回答くださりありがとうございます notnot様の回答により、 なぜevalが否定されたのかが分かりました! kmee様が挙げてくださいました3つの条件で 2番、3番は僕には当てはまらないようです 僕にとって影響があるのは1番の「パフォーマンスが落ちる」 これが事実の場合はevalを使うのは控えなければなりません evalは特に遅くないという実験結果はあったのですが http://www.softel.co.jp/blogs/tech/archives/84 パフォーマンスが落ちる説明がされている実験結果などはございますでしょうか

回答No.3

まぁほかのコードを変えずに$cの内容に応じて処理を変えたい、ってだけのことなら ふつうは、 http://ideone.com/Rk4ei とか http://ideone.com/iwMX6 とかやるわな。文字列で式を作らなくてもいいんなら (匿名関数の対応がPHP 5.3.0以降なのでPHP 5.2.11のこのサイトでは実行できなかったけど)

susan-styl
質問者

お礼

わざわざコードまで書いていただきありがとうございます 私などの為に時間を割いて頂き深く感謝いたします。 圧倒的に簡単にコードが書けるeval()を教えていただいたのでそちらで行きたいと思います。 別の質問になってしまいますが、教えていただいたコードは、クラスや匿名関数を使っており、このようなソースは読むのが困難であると思うのが一般的だと思います。 本件で、圧倒的に理解しやすいコードが書けるevalを使わず こちらを使ったのにはなにかメリットがあるからなのでしょうか。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

まず文字列の比較に「==」は使いません。 基本を理解しないと後で痛い目にあいます。 そのうえで何のために演算子を変数にしたいのかさっぱりわかりませんが どうしてもというなら乱暴ですがevalを使えばなんとかなります <?PHP $a = 'huga'; $b = 'huga'; $c = '==='; if(eval('return $a '.$c.' $b;')){ echo 'hoge'; } ?>

susan-styl
質問者

お礼

ありがとうございます! evalを使えばいんですね、正にこれが知りたかったです! また、回答で「この方法は乱暴である」と付加情報をお教えいただきましたが 調べたところ、eval()は特に非推奨の関数にはなっていないようですが 具体的にどう乱暴になるのか、つっこんでお教えいただけるとありがたいです。

noname#158634
noname#158634
回答No.1

https://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=php+eval&num=50 ただし、そういう処理を行わなくてはいけない状態になっている時点でそれはクソコードである、という自覚は持っていてください。

susan-styl
質問者

お礼

ありがとうございます。肝に銘じておきます。 これだけの少ない情報で「これはクソコードである」とお教えいただきました 上の回答者様もeval()を使うのは乱暴だと仰っています eval()は特に非推奨の関数にはなっていないようですが eval()を使うことにより「これはクソコードである」というネガティブな判断が下されるのはなぜなのかもお教えいただけると幸いです。

関連するQ&A

  • PHP コードを文字列として出力する方法

    お世話になります ダブルクォーテーションで囲っても 「PHP コード」を「文字列」として出力する方法 つまり、evalの逆の関数のようなものはありますでしょうか $a['huga'] = 2; $b['hoge'] = 3; //式 $c = $a['huga'] * $b['hoge'] ; abc($c = $a['huga'] * $b['hoge'] ); function abc($str){ //ここでなんちゃらほんちゃら //もしくはfunctionの外側でなんちゃらもでも可 echo $str; } 期待する出力結果 $c = $a['huga'] * $b['hoge'] ; 実際の結果 6 $の前に¥を入れてダブルクォーテーションで囲めば、 または、シングルクォーテーションの前に¥を入れてシングルクォーテーションで囲めば 文字列になるのはわかりますが 式の文字列には直接、手を加えず関数等で実現するやり方が知りたいです ※連想配列のキーの囲み文字はシングルクォーテーションです、ダブルに出来ない条件でお願いします。 お忙しい中恐縮ですが熟練者の方でわかる方がいましたら お教え下さいませ

    • ベストアンサー
    • PHP
  • PHP

    PHPで無駄なコーディングをしない為、ループでまわしたいのですが関数が入り、ややこしくなっています。どうしたらいいですか? <select name="nminute"> <option value="0" <?php if(strstr($nminute,'0')) echo"selected"; ?>>0</option> <option value="1" <?php if(strstr($nminute,'1')) echo"selected"; ?>>1</option> <option value="2" <?php if(strstr($nminute,'2')) echo"selected"; ?>>2</option> <option value="3" <?php if(strstr($nminute,'3')) echo"selected"; ?>>3</option> <option value="4" <?php if(strstr($nminute,'4')) echo"selected"; ?>>4</option> <option value="5" <?php if(strstr($nminute,'5')) echo"selected"; ?>>5</option> <option value="6" <?php if(strstr($nminute,'6')) echo"selected"; ?>>6</option> <option value="7" <?php if(strstr($nminute,'7')) echo"selected"; ?>>7</option> <option value="8" <?php if(strstr($nminute,'8')) echo"selected"; ?>>8</option> <option value="9" <?php

    • ベストアンサー
    • PHP
  • PHP

    PHPで <p>曜日</p> <p> <input type="checkbox" name="youbi[]" value="1" <?php if(strstr($result[4],'1')) echo"checked"; ?>>月 <input type="checkbox" name="youbi[]" value="2" <?php if(strstr($result[4], '2')) echo"checked"; ?>>火 <input type="checkbox" name="youbi[]" value="3" <?php if(strstr($result[4],'3')) echo"checked"; ?>>水 <input type="checkbox" name="youbi[]" value="4" <?php if(strstr($result[4],'4')) echo"checked"; ?>>木 <input type="checkbox" name="youbi[]" value="5" <?php if(strstr($result[4],'5')) echo"checked"; ?>>金 <input type="checkbox" name="youbi[]" value="6" <?php if(strstr($result[4],'6')) echo"checked"; ?>>土 <input type="checkbox" name="youbi[]" value="0" <?php if(strstr($result[4],'0')) echo"checked"; ?>>日 </p> <p>時間</p> <p> <input type="submit" value="設定" /> とやると日曜日を選択してsubmitするとチェックが外れます。なぜでしょうか?

    • ベストアンサー
    • PHP
  • phpの変数の初歩

    phpの変数について基本的な質問です 変数の後ろに半角空白を入れないといけないのは日本語の場合だけですか? 記号や数字の場合は空白はいらないのですか? カッコでくくるのがめんどいので問題ないなら省略したいのです $hoge= 50; echo "$hoge<100";

    • ベストアンサー
    • PHP
  • phpで 変数の中にデータが入っているかどうかを判別する

    phpで変数の中が空なら・・・ という命令を書く場合 if($hoge == "")とか if(isset($hoge)) という風に書くとおもうんですが、 変数の中身が配列で、その配列の一つでもデータが入っているかどうかを 判別する方法はないのでしょうか? 例えば、 $hoge = array([1] = りんご,[2] = )  と  $hoge = array([1] = ,[2] = ) で、表示結果を変えたいということです。 配列を一旦分解するしかないのでしょうか?

    • ベストアンサー
    • PHP
  • phpで$a,$b,を%指定して表示させたい

    php で $a, $b, $c... をそれぞれして指定したパーセントの割合で表示させるプログラムを教えて下さい $a = 'hoge'; $b = 'huga'; $c = 'piyo'; $a は 10%, $b は 30%, $c は 60% といった具合に指定できつつ $d, $e... と続いても パーセント指定していけるような関数を作りたいです ご回答よろしくお願いしますm(__)m

    • ベストアンサー
    • PHP
  • 変数について

    下記の様な、プログラムを作成しておりますが、 にたような変数名を付けており、数字だけを 変化させて表示結果を”ABC”と表示したいのですが、 $a1,$a2,$a3の値を表示するには、どうすれば よいでしょうか? <?php $a1=A; $a2=B; $a3=C; for ($b=1;$b<4;$b++){    echo $a.$b; } ?>

    • ベストアンサー
    • PHP
  • 「404判定のstrpos」の演算子が分からないの

    「404判定のstrpos」の演算子の意味が分からないので、教えてください。 ▽404 Not Found時の対処 | PHPのQ&amp;A【OKWave】   http://okwave.jp/qa/q4783971.html に掲載されていた下記を試したら、期待した動作になったのですが、 if (strpos($hdr[0],'404')!==false){  echo 'Not Found'; } else { しかし、 ▽PHP: strpos - Manual   http://php.net/manual/ja/function.strpos.php を参考に、「===演算子」へ変更したら、 if (strpos($hdr[0],'404')===false){  echo 'Not Found'; } else { 正常なURL(200)も、全てNot Foundになってしまいます。 ちなみに、 if (strpos($hdr[0],'404')==true){ だったら、期待通りの動作になりますが、 if (strpos($hdr[0],'404')===true){ だと、何が来ても同じ結果になります。 なんででしょうか? strpos関数の返り値を調べる際 ===演算子 を 利用しなくても良いのでしょうか?

    • ベストアンサー
    • PHP
  • PHPでの変数化

    よろしくお願いします。 ★hyouji.php $a_list[1]="a"; $a_list[2]="b"; という配列があって パラメータ num=1を受け取ることにより、結果を表示したいです。 hyouji.php?num=1 つまり、 echo $a_list[$num]; というようなことをやりたいのですが、うまくひょうじされません。 どうかご教授ください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpで別のファイルの変数に代入する方法

    ちょっとややこしくなりますが、よろしくお願いします。 [a.php]と[b.php]というファイルを用意します。 [a.php] ------------------ <?php echo $hogehoge ; ?> ------------------ [b.php] ------------------ <?php $hogehoge = 'hogehoge' ; require('a.php') ; ?> ------------------ という風にして結果を ------------------ hogehoge ------------------ としたいのですが、他のファイルを呼び出す時に変数を指定するにはどうしたら良いのでしょうか。 また、その際に気をつけなければならないことがあれば教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP