PHPの質問です

a.phpとb.phpという2つのファイルがあるのですが
サーバーにa.phpとb.phpをアップロードし
a.phpを実行してもb.phpの処理内容が表示されません
a.phpに直接b.phpの内容を書き込むしかないのでしょうか?
a.php
****************
<?php require_once "d.php";?>
<TABLE>
<tr>
<td>1</td>
<td>1</td>
<td>ほげ1</td>
<td>ほげ2</td>
<td>ほげ3</td>
<td>ほげ4</td>
<tr>
</TABLE></body></html>
****************

b.php
****************
<?php
$s = '';
$b = strip_tags( @file_get_contents( __FILE__ ), '<tr><td>');
if ( preg_match_all("#<tr[^<]+?(.+?)</tr#is", $b, $trs , PREG_SET_ORDER) ) {
$tr = $trs[0];
if ( preg_match_all("#<td[^<]+?(.+?)</td#is", $tr[1], $tds , PREG_SET_ORDER) ) {
$s .= $tds[5][1] . "\n";
}
}
echo ( $s );
?>
****************

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/09/12 06:51:51
  • 終了:2013/09/19 06:55:04

回答(3件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492013/09/12 07:22:23

ポイント67pt

呼び出し側 a.php

<?php
    require_once "b.php";
    tdChoose( __FILE__ ,0 , 5);
?>
<TABLE>
<tr>
<td>1</td>
<td>1</td>
<td>ほげ1</td>
<td>ほげ2</td>
<td>ほげ3</td>
<td>ほげ4</td>
</tr>
</TABLE></body></html>

呼び出され側 b.php

<?php
function tdChoose ( $f, $r, $n ) {
    $s = '';
    $b = strip_tags( @file_get_contents( $f ), '<tr><td>');
    if ( preg_match_all("#<tr[^<]+?(.+?)</tr#is", $b, $trs , PREG_SET_ORDER) ) {
        $tr = $trs[ $r ];
        if ( preg_match_all("#<td[^<]+?(.+?)</td#is", $tr[1], $tds , PREG_SET_ORDER) ) {
            $s .= $tds[ $n ][1] . "\n";
        }
    }
    echo ( $s );
}

__FILE__ は自分自身を表すのでb.php内で使うとb.phpを読みに行ってしまってダメなのです。
a.phpの__FILE__をb.phpに渡す手段を考えるわけですが、ここでfunctionコールを利用します。
tdChoose には(ファイル名、何行目、何列目)の3つのパラメータを渡すようにしてあります。
あと、a.php に /tr タグがないと正常に動かないので足しました。

id:windofjuly

(1)require と include
require/require_once はファイルが存在しなければエラーを吐いて処理が止まる
include/include_once もファイルが存在しなければエラーを吐くけれど、読み込み部分を無視して先に進む。

「プログラムファイルが無くても先の処理は行いたい」という目的があれば、
include/include_onceの利用を検討するということになりますが、
プログラムが欠落してしまっていても大丈夫なプログラム構成にするのは難しく、
プログラムがある場合とない場合の動作テストが必要になるというだけでも面倒なことは想像できることでしょう。

include のほうが処理が速いから使うという人もいるけれど、
それはチェック項目が少ないため速くなっているだけの話なので安直に使う事は避けるべきだとおわかりいただけると思います。

(2)_once の有無
どちらも_coreのある命令は、同じファイルは再読み込みせず一度だけ読み込みます。

<?php
require "b.php"; #で読み込み
# いろいろやって
require "b.php"; #読み込み直して環境をリセット
<?php
require_once "b.php"; 読み込み
いろいろやって
require_once "b.php"; すでに上で読み込んでいるので状況変わらず

必須のライブラリは一度読み込めば済むことが多いのでrequire_onceのほうを主に使います。

<?php
include "b.php"; 読み込み
いろいろやって
include "b.php"; 読み込み直して環境をリセット
<?php
include_once "b.php"; 読み込み
いろいろやって
include_once "b.php"; すでに上で読み込んでいるので状況変わらず

無くても先に進めたい場合に使うincludeの場合は、
その場その時の状況に合わせるためにincludeを使う事が多いです。


確かに、こういったものもあるという事を知っていて損になることはありませんが、
質疑応答をスムーズに行うための妨げになることもおわかりいただけたかと思います。

あとは takanii さんのご判断(ポイント配分や回答拒否登録など)でどうぞ。

2013/09/12 19:03:59
id:taknt No.2

きゃづみぃ回答回数13538ベストアンサー獲得回数11982013/09/12 07:56:23

ポイント67pt

b.php側を関数にして インクルードして呼び出すという方法もありますよ。

http://php.net/manual/ja/function.include.php

id:windofjuly

だから何ですか?
別の方法を紹介してるだけだとでも言いたいのですか?

require と include の違いを正しく理解していれば、
今回は関係ないことで書き込む必要などないことだと知っているはずですよ。

まさか、知らないのに答えたのですか?
それともまさか、私に違いを説明させるという手間をかけさせたいだけですか?
どっちにしても迷惑な行為です。

ほかでも多数似たようなことやってますよね。
回答するならちゃんと調べてから書かないと質問者にも他の回答者にも迷惑です。
http://q.hatena.ne.jp/1378887531#a1213523
http://q.hatena.ne.jp/1378787073#a1213422
http://q.hatena.ne.jp/1378712340#a1213371
http://q.hatena.ne.jp/1378636875#a1213256
その他いろいろ…。

反省するなら、require と include の違いと、
どうして今回は関係ないのかをきっちり説明して、
さらに自身の行動の誤りについて謝罪してください。

反省せず、謝罪もしないならば、虚偽の回答と認めたとみなさせていただいて、
運営にガイドライン違反で利用停止にするように働きかけます。
(他の件もありますし、言質はすでに取ってあります。
私一人で足りなければ、情報提供してくれる人には事欠いておりません。)

2013/09/12 08:24:28
id:tezcello

> だから何ですか?
そういうのは放置すればいいのです。

> 質問者にも他の回答者にも迷惑です
それは個々に判断する事でしょうね。
ご自分の回答にケチを付けられたように感じるかもしれませんが...

気が納まらないのなら、厳しい語調ではなく、要点のみ記せば(今回ならば include, include_once, require, require_once の差異と、require_once を選んだ理由)十分に質問者さんにも閲覧者にも伝わるでしょう。
このサイトの利用者は十分理解力はあるはずですから。

2013/09/12 17:56:35
id:tezcello No.3

tezcello回答回数460ベストアンサー獲得回数692013/09/12 17:44:11

ポイント66pt

> a.phpを実行してもb.phpの処理内容が表示されません
もしもご提示のスクリプトがチャンとコピペできているとしたら、単なるミスタイプですね。

> <?php require_once "d.php";?>

b.php じゃなく、d.php になっています。

他1件のコメントを見る
id:tezcello

a.php を見ても全行を掲示した訳じゃなさそうなので、b.php もこれが全てではない可能性があれば __FILE__ の解釈違いとは断定できない感じが...

まぁ、require_once() なので、これが間違っているとこの行以降は表示されないみたいなので「b.php の処理内容が表示されない」という表現ではないでしょうけど、疑えばキリがないので、大元からの確認という事で。

2013/09/14 00:27:59
id:windofjuly

元はこちらです。
http://q.hatena.ne.jp/1378933333

埋め込みというご希望にお答えして、そこでは終了したのですが、
今度はそれをtakaniiさんなりに別ファイルに分けてみたら動かなくなったということです。
他にもいろいろと試行錯誤なさっておられるのでできるだけ最短距離かつ応用しやすいことを考慮して回答しているつもりですが、
不備があればご指摘いただければと願います。

2013/09/14 07:54:42

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません