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

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

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

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

Q&A

解決済

2回答

2123閲覧

関数の結果がうまく取得できない

ryohasegawa

総合スコア437

PHP

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

0グッド

0クリップ

投稿2017/05/13 14:58

編集2017/05/14 11:49

index.php

php

1<?php 2require_once(__DIR__ . '/../../config/config.php'); 3 4$app = new MyApp\Controller\Index(); 5 6$app->run(); 7 8if($app->getUserdata()->icon){ 9 echo "◯◯"; 10}else { 11 echo "□□"; 12} 13?>

sub/index.php

php

1<?php 2require_once(__DIR__ . '/../../../config/config.php'); 3 4$app = new MyApp\Controller\Index(); 5 6$app->run(); 7 8if($app->getUserdata()->icon){ 9 echo "◯◯"; 10}else { 11 echo "□□"; 12} 13?>

index.php sub/index.phpでは、$app = new MyApp\Controller\Index();で初期化してありMyApp\Controller\Index()の関数が使えます。
MyApp\Controller\Index()ではextends \MyApp\Controller\MyApp\Controllerそてあるので、 \MyApp\Controllerの関数も使えます。

\MyApp\ControllerではユーザのIDでファイルを探して、あればtrueをなければfalseを返すプログラムが実行されるようになってます。

php

1public function usericon(){ 2 $this->setUserdata("icon", false); 3 if ($this->isLoggedIn()) { 4 if (file_exists("./../users/icons/" . $this->me()->id . ".png")) { 5 $this->setUserdata("icon", true); 6 } 7 } 8 }

index.php sub/index.phpを実行すると、結果上の関数が実行されます。
index.phpではtrueが返ってくるのですが、sub/index.phpではfalseが返ってきます。

index.phpsub/index.phpはディレクトリは違いますが呼び出しているファイルは同一のファイルで関数は実際呼び出されています。
上のコードの$this->me()->idでユーザのIDを入れているんですが、echo $app->me()->id;としindex.php sub/index.phpそれぞれで実行するとちゃんとIDがはいってきたので問題無いと思います。
ではなぜ、IDもはいっているのに画像が表示されないのでしょう?

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

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

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

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

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

takaboo

2017/05/14 02:04

Aの途中で始まる<?php以降がBでしょうか?わかりにくいのでちゃんと分けた方がいいですよ
ryohasegawa

2017/05/14 02:07

<?php の位置が違いました。AもBも全く同じコードを書いてあります。
guest

回答2

0

ベストアンサー

なぜ同じ処理を異なる二つのディレクトリでしなければならないのか考えてみましたが、もしかしてローカル環境とサーバ環境ということではないでしょうか?
もしそうなら違うのはディレクトリだけではありません。
ディレクトリだけでも次のような違いがあります。

PHP カレントディレクトリという名の罠

投稿2017/05/14 04:45

Zuishin

総合スコア28660

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

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

ryohasegawa

2017/05/14 09:06

同じ処理をしている理由は、Webページのヘッダー部分を呼び出しているので、ディレクトリが変わってきます。
Zuishin

2017/05/14 09:13

問題ない部分だけ見てもなかなか解決法はわかりませんね。ディレクトリ構成やファイル名などを実際のものにし、それらを呼び出す手順を書いてもらえば、そこに何かヒントがあるかもしれません。 隠された部分は想像で補わないといけませんが、その想像を超える部分があるんでしょう。
ryohasegawa

2017/05/14 11:49

書き直しました。
Zuishin

2017/05/14 11:52

ディレクトリの階層が違うからですね。 ./../users/icons/ は index.php と sub/index.php では違う場所を指します。
ryohasegawa

2017/05/14 11:59 編集

なるほど
Zuishin

2017/05/14 11:58

試してみてください。
ryohasegawa

2017/05/14 12:00

試してみました。 ../を加えてみると、 index.php では表示しなくなり sub/index.php では表示されるようになりました。
Zuishin

2017/05/14 12:00

そういうことです。
ryohasegawa

2017/05/14 12:01

となると、同じ階層にファイルを置かないといけないと言うことになりますか
Zuishin

2017/05/14 12:04

同じ深さの階層に置くか、または引数としてパスを渡すか、絶対パスを使うか、ドキュメントルートからの相対パスを使うか、でしょうか。
ryohasegawa

2017/05/14 12:07

\MyApp\Controller にかかれている ./../../users/icons/ のパスはドキュメントルート外にあるのですが、それでも指定できますか?
Zuishin

2017/05/14 12:11 編集

.. を使ってください。たとえば /home/ryohasegawa/htdocs/../users/icons のような形で、実際のディレクトリ構成に合わせて適当に変えてください。
ryohasegawa

2017/05/14 12:13

PHPの関数でドキュメントルートを取得すればいいですか?
Zuishin

2017/05/14 12:15

環境変数に入ってると思います。
ryohasegawa

2017/05/14 12:17

$_SERVER['DOCUMENT_ROOT'] を使って $_SERVER['DOCUMENT_ROOT']../users/icons/ とすればいいですかね?
Zuishin

2017/05/14 12:18

それを表示して目的のディレクトリを指しているかどうか確かめてください。
ryohasegawa

2017/05/14 12:38 編集

file_exists($_SERVER['DOCUMENT_ROOT']."../users/icons/" . $this->me()->id . ".png") これではだめでした。 となると、別の方法ですね。
Zuishin

2017/05/14 12:43

DOCUMENT_ROOT の最後にはスラッシュがついていないと思いますので、.. ではなく /.. としてください。そしてできた文字列を確認してみてください。
ryohasegawa

2017/05/14 12:48

解決できました。 非常にたすかりました。 ドキュメントルートを使っての絶対参照という方法はとても勉強になりました。
guest

0

AとBは全く同一なのでしょうか?
ファイル名が異なるだけで同じディレクトリにあり、同じ呼び出し方をしているのでしょうか

そんなことをする意味があるとは思えないので、何らかの(記載のない)違いがあるわけですよね?
その違いが結果の差異を引き起こしているのではないでしょうか

投稿2017/05/14 02:18

takaboo

総合スコア195

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

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

ryohasegawa

2017/05/14 02:29

AとBには同じコードを書いてあります。 Webページのヘッダーのコードです。 AとBのファイルのディレクトリが異なります。 ですが、AからもBからも、X,Yにはアクセスできています。 なので問題はないと思います。 ファイルチェックなのですが、Yからの相対参照で参照しているので、問題無いと思います。
takaboo

2017/05/14 02:46

ABが同じコードというのは了解しております ゆえに、呼び出し方その他別の条件が異なるのでは?という推測ですね とりあえずAB両パターンで、setUserdataで保管したデータをvar_dumpで確認ですかね ifの条件式がtrueになるからと言って $app->getUserdata()->icon === trueであるとは限りませんので また、「Bを読み込むと何も返ってきません」はNULLや空文字列が返ってくるという意味でしょうか? これもvar_dumpで何が返ってきているのか確認すべきかと
ryohasegawa

2017/05/14 02:51

ありがとうございます。 Aでは、trueがBではfalseが返ってきました。 ファイルの呼び出し、関数の呼び出しは問題ないようです。 なぜ、同じ状態で同じ関数を読んでいるのにtrueとfalseと異なった答えが返ってくるのかが問題点です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問