• ベストアンサー
  • 暇なときにでも

【初歩?】functionの使い方

  • 質問No.8480475
  • 閲覧数193
  • ありがとう数4
  • 回答数4

お礼率 89% (1106/1240)

以下のページにある最後に提示されているサンプルがうまくいきません。

> PHP:PDFのファイルサイズを取得して表示するのにはまったので解決策を
> http://ika-ring.net/blog/show-pdf-file-size/

index.phpがある「ホーム」ディレクトリに、「pdf」というディレクトリがあり、その中に100KBの「sample.pdf」があるとします。

index.phpの中に、以下を書き込みましたが、真っ白なHTMLが返ってきます。

<?php
$file = "241.pdf";

function get_file_size($file){
$mfile = str_replace(esc_url(home_url('/'))."pdf/",ABSPATH,$file); //←この行だけ「wp」を「pdf」に書き換え
if ( is_file($mfile) ){
$filesize = filesize($mfile);
$s = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
$e = floor(log($filesize)/log(1024));
if($e==0 || $e==1) { $format = '%d '; }
else { $format = '%.1f '; }
$filesize = sprintf($format.$s[$e], ($filesize/pow(1024, floor($e))));
return $filesize;
}
}

echo $filesize;
?>

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

  • 回答No.4
  • ベストアンサー

ベストアンサー率 65% (288/437)

>なかなか奥が深いですね(基本ではあるのでしょうが。。。)

とりあえず「基本」を先にやった方がいいと思います。htmlと違い"/"から書くとフルパス(サーバパス)になります。

というかhtmlの場合はそのホスト名に対するDocumentRootからのパスなので、考え方として「最上位から」というのは同じです。
お礼コメント
litton101

お礼率 89% (1106/1240)

agunuzさん、本件では大変お世話になりました。

>とりあえず「基本」を先にやった方がいいと思います。

まったく仰せのとおりです、考え方もまったく想像でやっていたようです。

結論的には。#3の補足に書きました

>"./pdf/"  を './pdf/' (シングルクォーテーション)に改めたらyesが返ってきました

ここを頼りにいろいろいじっていたら、無事動作するようになりました。

親身に相談に乗っていただき、本当にありがとうございました。

また基礎から勉強いたしますm(_ _)m
投稿日時:2014/02/19 15:38

その他の回答 (全3件)

  • 回答No.3

ベストアンサー率 65% (288/437)

>これが、どうしても繰り返し使いたいのですが、

当然ですが、使う分にはどこで何度使ってもいいです。

が、関数の「定義」は1回でいいです(でなければ関数にする意味がありません)。

<?php
$arr = array(0, 1, 2, 3, 4);
foreach ($arr as $val) {
print func($val);
}

function func($arg) {
return sprintf('%02d<br>', $arg);
}
補足コメント
litton101

お礼率 89% (1106/1240)

$file = "241.pdf";
if ( file_exists( "./pdf/" . $file )) {
echo "yes";
}
の、

"./pdf/"  を './pdf/' (シングルクォーテーション)に改めたらyesが返ってきました

なかなか奥が深いですね(基本ではあるのでしょうが。。。)
投稿日時:2014/02/19 13:13
お礼コメント
litton101

お礼率 89% (1106/1240)

agunuzさん、大変お世話になっておりますm(_ _)m


> 当然ですが、使う分にはどこで何度使ってもいいです。
> が、関数の「定義」は1回でいいです(でなければ関数にする意味がありません)。

一晩考え抜いてようやく「あ、確かにそうだ」と理解できました。

function定義はループ(while)の「外」に出し、
while内で使いたいところで

get_file_size($file);

と呼び出せばよいわけですね、、、(^_^;


それと、

$mfile = str_replace(esc_url(home_url('/'))."pdf/",ABSPATH,$file);



$mfile = str_replace('/'."pdf/",ABSPATH,$file);

に改めましたが、「ABSPATH」もWordPressの関連のようですね、
もうちょっと突き詰めると、str_replaceなどしなくても、

$mfile = "./pdf/" . $file;

でよいような気がしますが、思いつく弊害などありますでしょうか。


さらに、いろいろやってもやはり真っ白なHTMLが返ってきます。
そもそも論として、以下を実行しても真っ白…。file_existsでPDFは拾えないなど聞いたことも
ないですけど、こちらもお心あたりあればご教示をお願いできれば幸いです。

$file = "241.pdf";
if ( file_exists( "./pdf/" . $file )) {
echo "yes";
}

長引かせて申し訳ございませんm(_ _)m
投稿日時:2014/02/19 11:08
  • 回答No.2

ベストアンサー率 65% (288/437)

>esc_urlというのは、WordPressでないと使えないのでしょうか?

php標準の関数ではありませんからね。

http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/esc_url

ただ、やっていることはURLの無害化(エスケープ)ですから、提示されたような使い方ならエスケープする必要はありません(渡された $file をそのまま使っていい)。



>Fatal error: Cannot redeclare get_file_size() (previously declared in D:\www\index.php:69)
>in D:\www\index.php on line 69

関数の記述をループ(whileとかforとかforeachとかdoとか)の中で行っていませんか?記述は1回でもループのたびに定義しようとしますのでエラーになります。

functionは『最後にまとめて』記述してください。
お礼コメント
litton101

お礼率 89% (1106/1240)

agunuzさん、たびたびのご教示恐れ入ります。
まずは御礼申し上げます。

> php標準の関数ではありませんからね。

そうでしたか。解説ページまでお示しいただき恐縮です。

> 提示されたような使い方ならエスケープする必要はありません

安心しました、外させていただきます

> 関数の記述をループ(whileとかforとかforeachとかdoとか)の中で

モロ、ビンゴでした(^_^; (while)
そうですよね、そうですよね、
結構調べたつもりだったのですが、完全にうっかりしてました。
(でも原因特定できて支えがとれた思いです)

> functionは『最後にまとめて』記述してください。

これが、どうしても繰り返し使いたいのですが、

while (~~~) {
$i++;
function get_file_size . $i ($file){

みたいな力技とか使えないですかね?
「関数名 変数」とか「繰り返し function php」ですとか。
検索した限りではそのものズバリは見つからないようですが・・・
投稿日時:2014/02/18 20:01
  • 回答No.1

ベストアンサー率 65% (288/437)

>echo $filesize;

echo get_file_size($file);

としてください。

$filesizeは関数内で使っている変数です(スコープが関数内に限られます)。変数ではなく返す値(戻り値)でファイルサイズを返しています。
お礼コメント
litton101

お礼率 89% (1106/1240)

agunuzさん、早速ご回答ありがとうございました。

(1) 早速仰せのとおりやってみると、今度は以下のエラーです。
esc_urlというのは、WordPressでないと使えないのでしょうか?

Fatal error: Call to undefined function esc_url() in D:\www\sample.php on line 5

さらに悩みを打ち明けますと、

(2) (元質問のsample.phpではなく)、本番環境の「index.php」の方へ組み込みますと、上記の「echo get_file_size($file);」とか、「esc_url()」の問題以前に、次のようなエラーが。

Fatal error: Cannot redeclare get_file_size() (previously declared in D:\www\index.php:69) in D:\www\index.php on line 69

Googleで調べてみると
●「Fatal error: Cannot redeclare」というのは、同じ名前のユーザー定義関数を何度も定義した場合などに表示されることは分かりましたが、(include、requireを含め)重複定義はないです。
●関数名を、「get_file_size()」から「get_pdffile_size()」とか「get_file_size2()」などにリネームしても、同じエラーを引きずります。
●if (!function_exists('get_file_size')) {}でくくると、function自体がスキップされてしまいます。

何か妙案ありますでしょうか(次から次へとスミマセン)
投稿日時:2014/02/18 17:23
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ