質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

8回答

2552閲覧

コーティングの方法

uverworld101nm

総合スコア172

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/09/01 06:31

グローバル変数($_GET や $_POST など)に直接アクセスするのはパフォーマンス劣化するので、エラーにならないようにコーディングすべきと以前の質問の回答者から言われました。
以下のように直すよう言われました。

php

1$keyword = $_GET ["keyword"]; 2$budget = $_GET ["budget"];

php

1$keyword = (isset($_GET ["keyword"])) ? $_GET ["keyword"] : ''; 2$budget = (isset($_GET ["budget"])) ? $_GET ["budget"] : '';

しかし、直してからアクセスができなくなりました。
ここで質問ですが、<?phpの直後に、

php

1if (isset($_GET['keyword']) || isset($_GET['budget']) ) {

があるのですが、もう既にパラメータの先頭にisset文があるなら
、$keywordや$budgetのパラメータにisset文をつける必要性はありますか?
先頭にisset文があるなら、パフォーマンス劣化は起きませんよね?
僕のサーバーの場合は何らエラーは起きませんが、他人のサーバーだとエラーが起こると言われたもので。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答8

0

大量のデータを扱うような状況ならともかく、変数1つの参照方法で損なわれるパフォーマンスなど、ごくごく誤差の範囲です。

もちろんプログラムが速いに越したことはないのですが、こういった部分で時間を削ったところで全体に与える影響はごく小さいものですし、それ以前に動かないのではなんの意味もありません。

まずは動くようなプログラムにすることに集中してください。

投稿2016/09/01 08:43

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uverworld101nm

2016/09/01 08:45

ご回答ありがとうございます。 if (isset($_GET['keyword']) || isset($_GET['budget']) ) { ・・・中略 $keyword = $_GET ["keyword"]; $budget = $_GET ["budget"] ; が僕の元々高いコードです。 これならパフォーマンス劣化にならないですか? 僕のサーバーだと、エラー表示になりません。 他の人のサーバーだと分かりませんが・・・
uverworld101nm

2016/09/01 08:46

また、変数を複数取り扱うなら今提示したコードはパフォーマンス劣化になりますか?
maisumakun

2016/09/01 09:04

パフォーマンス評価の鉄則は「推測より計測」です。どうしても気になるのなら、速度を測定するのが、いちばんの解決策です(どれくらい違うのかが一目瞭然です)。 もっとも、おそらくは他の処理にかかる時間、あるいはHTTPの通信時間のほうが長くて、この書き方の違いは大勢にほぼ影響しない、という結論になると思います。
guest

0

isset()は未定義でなこと、NULLでないことを検査するための関数なので、
受け取るパラメータの不足を正しく検出するために、
ここは丁寧に記述した方が良いのではないでしょうか。

if (!isset($_GET['keyword'])) { $errors[] = 'keywordが送信されていません'; } elseif ($_GET['keyword'] === '') { $errors[] = 'keywordが入力されていません'; } else { $keyword = $_GET['keyword']; } // 以後、$keywordを参照し$_GET['keyword']に直接アクセスしない

投稿2016/09/01 06:40

編集2016/09/01 06:43
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uverworld101nm

2016/09/01 07:14

これだと、直接アクセスしてもパフォーマンス劣化することはないんですね?
退会済みユーザー

退会済みユーザー

2016/09/01 07:24

冒頭で一回、上記のコードにて変数に格納するのだから、パフォーマンスは落ちないでしょう。
uverworld101nm

2016/09/01 08:37

m6uさん、話が少し逸れますが if (isset($_GET['keyword']) || isset($_GET['budget']) ) { ・・・中略 $keyword = $_GET ["keyword"]; $budget = $_GET ["budget"] ; が僕の元々高いコードですが、これならパフォーマンス劣化にならないですか? 僕のサーバーだと、エラー表示になりません。 他の人のサーバーだと分かりませんが・・・
退会済みユーザー

退会済みユーザー

2016/09/01 09:22 編集

自分とことほかの人のところで、本当に動作環境が同じなのか、プロジェクトファイルの一致性を点検するのが先だと思います。 面倒でも思い込みや先入観でつまらないミスを見逃している可能性がありますよ。
guest

0

https://teratail.com/questions/44459
たとえ画面に出力していなくてもERRORが出ていたら
例えばAPACHEだったら設定してあるerrorlogを入れる場所に
PHP Notice: Undefined index: keyword in sample.php on line 4, referer: http://localhost
などのエラーログが書き込まれます。それが相当な数になればディスクを圧迫するでしょう

がパフォーマンス気にする前に先に動くのを作ってから語ってください

投稿2016/09/01 09:12

date

総合スコア1820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takaw

2016/09/01 18:19

彼は自分に都合の悪い回答には返信しないですからねぇ・・・(^_^;) グローバル変数よりも、HTMLがデタラメな文法になっているほうがよっぽどパフォーマンスを落としているような気がするんですよねw
date

2016/09/01 23:40

>僕のサーバーの場合は何らエラーは起きませんが、他人のサーバーだとエラーが起こると言われたもので。 いや画面が出てない時点でエラーが出ていますよ、何度も言われているが、画面にエラーを出すようにしてください。 あるいはエラーのログファイルを確認してください
date

2016/09/02 00:46

これでこのことは終わりにしますが 別にTeratailはマルチポストとか禁止していないので、そこを言うつもりありません。 ただ別のユーザとして登録し直すのどうなのかと思いますが ただ、どれも質問者さんは否定しました。疑われたマルチポスト先もこのサイト内のユーザも自分ではないと、明確におっしゃいました。それが、もし自分だと認めたら他人からどう思われるか、その方が問題だと気付いてほしかった
退会済みユーザー

退会済みユーザー

2016/09/02 04:28 編集

また自分に都合の悪い事は消して「自分は悪くありませんー」と主張してるみたいですね。 回答者の方々がせっかく答えて頂いているのに…
guest

0

いくつか前の質問の回答でも、

いい加減にしろよ。丸投げ質問ばかりで学習する気がないなら質問するなよ。 ちょっとは自分で調べろよ。その上でわからなかったらここで聞け。 言われたことも修正せずに学びもせずにやってほしいだけだろ。 少なくとも解答してくれた人にお礼は言え。

と言われていましたが、読んでないのでしょうか?
読んだ上で「そんなのは関係ない」と考えているのでしょうか?
そろそろ周りの方を考えてみてはいかがでしょうか?
また自分に都合が悪いからと垢分けて自分ではありませんと言い張るのでしょうか?
前にした質問が解決していないのに次の質問をどんどん追加するのは一体どう考えているのか?
そして回答してもらった内容に「話は逸れますが」と何回関係ない所を聞こうとするのか?
そしてこの意見も「自分に都合が悪いから」と通報して終わりにするんでしょうか?

そろそろそういうの止めませんか?

投稿2016/09/02 04:37

編集2016/09/02 06:17
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ページが表示されないということは自分で(?)組んだコードが間違っていてエラーを出しているからではないでしょうか?
もしそうでなければ意図したものでなかったとしても表示自体はされるでしょうし…。

表示されていた修正前のコードからどこが変わったのか、配置は間違ってないか、括弧の数はあっているか等確認してみてはどうでしょうか

投稿2016/09/01 07:02

編集2016/09/01 07:05
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

アクセスできないと言っているのは、ページが表示できないということでしょうか。
それがif文が原因ではないかと言っているのでしたら、それは見当違いです。
ページが表示できないのは、何かしらのコーディングエラーが発生しているからです。
if文に関してはこう書きなおせば良いでしょう。

PHP

1if ($keyword != '' || $budget != '' ) {

投稿2016/09/01 06:47

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uverworld101nm

2016/09/01 06:55

if文にあるisset関数は消すのですか?
uverworld101nm

2016/09/01 06:56

アクセスができないということは、ページが表示されません。
ttyp03

2016/09/01 06:58

if文で何をしたいか→$_GETにセットされているかを知りたい $keyword = (isset($_GET ["keyword"])) ? $_GET ["keyword"] : ''; この処理でセットされていれば値を、されていなければ空文字を入れている。 なのでif文では空文字かどうかの判定でOKということ。 ページが表示されないのは最初に書いた通り、どっかが間違っているので見直してください。 括弧の対応とかそういうのです。
kunai

2016/09/01 07:37

横から失礼します。 恐らく質問者さんのソースでは <?php if (isset($_GET['keyword']) || isset($_GET['budget']) ) { ・・・中略 $keyword = (isset($_GET ["keyword"])) ? $_GET ["keyword"] : ''; $budget = (isset($_GET ["budget"])) ? $_GET ["budget"] : ''; となっているのではと思いますが。 そうである場合、<?php の直後に書いてあるというif文で、ご回答のような記述をされる事は意味がないのではと思います。
ttyp03

2016/09/01 07:39

そういうことなんですかね。 それならばこの回答は全くの無意味ですね。 ご忠告ありがとうございます。
uverworld101nm

2016/09/01 08:33

ttyp03さん、kunaiさんのおっしゃる通りです。
uverworld101nm

2016/09/01 08:33

kunaiさんが示したコードだと、エラーになって当たり前ですか?
uverworld101nm

2016/09/01 08:35

kunaiさん、 if (isset($_GET['keyword']) || isset($_GET['budget']) ) { ・・・中略 $keyword = $_GET ["keyword"]; $budget = $_GET ["budget"] ; なら、パフォーマンス劣化にならないですか? 僕のサーバーだと、エラー表示になりません。 他の人のサーバーだと分かりませんが・・・
kunai

2016/09/01 08:44

いや、そういう記述になっているのではないかと言う事を書いたまでで、そのままだとあなたのソースコードの記述と変わらないのではないでしょうか。 また、エラーが発生するという事と、パフォーマンスがどうのと言う二つの問題を同時に聞かれているので、何とも言えません。 エラーについて確認したいのであれば、エラーメッセージ等を提示いただき、別途ご質問いただくのが良いかと。
uverworld101nm

2016/09/01 08:48

僕の元々の質問は、パフォーマンス劣化がしないコードを書きたいんです。
uverworld101nm

2016/09/01 08:51

エラーではありません。 僕が聞きたいのは、 <?php if (isset($_GET['keyword']) || isset($_GET['budget']) ) { ・・・中略 と冒頭に書いたら、わざわざ $keyword = (isset($_GET ["keyword"])) ? $_GET ["keyword"] : ''; $budget = (isset($_GET ["budget"])) ? $_GET ["budget"] : ''; と書かず、 $keyword = $_GET ["keyword"]; $budget = $_GET ["budget"] ; と書けば大丈夫ですね? という質問です。
takaw

2016/09/01 18:12

>僕の元々の質問は、パフォーマンス劣化がしないコードを書きたいんです。 じゃぁ、タイトルにそうかきましょうよ。 あなたのタイトルは「コーティングの方法」ってなってますよ。
ttyp03

2016/09/05 00:17 編集

しばらく不在でした。 新たな似た様な質問を投下したようですが、とりあえずこちらの質問に対応してみます。 2つ前のuverさんの質問について。 issetで判定した結果、何をしたいかですよね。 通常の場合、issetで値が格納されているかを確認して、格納されていればその値を取得するのが目的です。 そして値が入っていなければデフォルト値を代入するなど。 上の質問の場合、2つあるissetはOR条件ですから、if文の中で、 $keyword = $_GET ["keyword"]; $budget = $_GET ["budget"] ; と書いてしまったらどちらかの値が空の場合、アウトです。 何でissetを使うのかがわかっていれば、自ずとこのような質問はあがってこないはずです。 他人が書いたコードを鵜呑みにせずに、理解するようにしてください。
ttyp03

2016/09/05 00:22

それからパフォーマンス云々の話ですが、既に他の回答者から指摘がある通りです。 そもそも$_GETに直接アクセスするとパフォーマンスが落ちるというのは聞いたことありませんし、あったとしても微々たるものでしょう。 それよりも何度もissetをしたりという方がパフォーマンスに影響があると思います。 といってもそのissetを何万回と繰り返してようやく少し遅いかな?くらいの差だと思うので、そんなことを気にするよりかは、読みやすいコードを書く目的で最初にissetを使った方が良いですね。
guest

0

if (isset($_GET['keyword']) || isset($_GET['budget']) ) {

この場合$_GET['keyword']に値が入っていて$_GET['budget']に値が入っていない場合
$_GET['budget']を参照するとnoticeがでます。
つまりor検索の場合はあまり有効ではないということです
(and検索ならその後に出現する$_GETはかならず有効です)

また仮に$_GET['budget']が""だった場合、!isset()と同等とみなすのか
それとも空だけどデータを受け取ったとみなすのか仕様があいまいです

「hoge.php?keyword=&budget=」などだとissetでは弾けません

filter_inputを利用すればデフォルト値を設定できたりするんで
面倒な場合分けを省略できるんですけどね

投稿2016/09/01 06:43

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2016/09/01 08:52

エラーがでないという認識のようなので 今後みずからのPHPのスクリプトには最初に <?PHP ini_set("display_errors",1); error_reporting(E_ALL); ?> を書き込んでください。
uverworld101nm

2016/09/01 08:55

エラーの話より、パフォーマンス劣化の話です。 エラーではありません。 僕が聞きたいのは、 <?php if (isset($_GET['keyword']) || isset($_GET['budget']) ) { ・・・中略 と冒頭に書いたら、わざわざ $keyword = (isset($_GET ["keyword"])) ? $_GET ["keyword"] : ''; $budget = (isset($_GET ["budget"])) ? $_GET ["budget"] : ''; と書かず、 $keyword = $_GET ["keyword"]; $budget = $_GET ["budget"] ; と書けば大丈夫ですね? という質問です。
yambejp

2016/09/01 09:00

その質問についてはすでに回答済みです。 or検索では裏でエラーが発生するためパフォーマンスを落とします
uverworld101nm

2016/09/01 09:25

では、and検索なら、大丈夫ですね。
yambejp

2016/09/01 09:28

はい、それも書いたとおり andで$_GETをチェックすれば大丈夫だとおもいますよ 厳密にいえばand検索の場合issetに列記するだけですけどね if (isset($_GET['keyword'],$_GET['budget']) ) {
uverworld101nm

2016/09/01 09:40

and検索の場合、 if (isset($_GET['keyword']) || isset($_GET['budget']) ) { でも大丈夫ですよね?
takaw

2016/09/01 18:11

それじゃorだろう・・・
uverworld101nm

2016/09/02 05:36

if (isset($_GET['keyword'],$_GET['budget']) ) { こうですか?
takaw

2016/09/02 11:32

だーーーかーーーーらーーーー! 「やってみろ!」 って、何度も言ってるじゃないですか・・・。
guest

0

**長いループ処理中にエラーが無視できない数ほど積もると,**パフォーマンスがある程度劣化するのは本当です.

しかし,その理由は二の次です.エラーを潰すべき理由でもっとも大きな根拠となるのはエラーを放置しているとバグが生まれるからです.Noticeはデバッグ上かなり役に立つ情報を持っていますので,これを無視して非表示にしてしまうのはデバッグしようとする自分自身を苦しめることになります.

投稿2016/09/02 12:30

mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問