1

このバグにより、過去 64 分間で私の合理的思考力が枯渇し、どうすればよいか本当にわかりません。

インクルードファイルで次の3行を使用すると:

var_dump(file_exists('G:/xampp/htdocs/myproject/public_html/includes/htmlPurifierAndMarkdown.php')); //retuurns true
var_dump(__FILE__);
include '../htmlPurifierAndMarkdown.php'; //gives error

次の出力が得られます。

boolean true

string 'G:\xampp\htdocs\myproject\public_html\includes\classes\genral.class.php' (length=71)


( ! ) Warning: include(../htmlPurifierAndMarkdown.php) [function.include]: failed to open stream: No such file or directory in G:\xampp\htdocs\myproject\public_html\includes\classes\genral.class.php on line 4
Call Stack
#   Time    Memory  Function    Location
1   0.0005  345328  {main}( )   ..\add.php:0
2   0.0036  382408  include( 'G:\xampp\htdocs\myproject\public_html\includes\classes\events.class.php' )    ..\add.php:28
3   0.0041  398024  include( 'G:\xampp\htdocs\myproject\public_html\includes\classes\standardpost.class.php' )  ..\events.class.php:2
4   0.0047  413928  include( 'G:\xampp\htdocs\myproject\public_html\includes\classes\genral.class.php' )    ..\standardpost.class.php:2

手短に:

  1. 最初の行は、ファイルが私の想像の一部ではなく、実際に存在することを示しています。
  2. 2 行目は、呼び出しスクリプトの場所を示しています。パスを詳しく調べると、含めようとしているファイルが親ディレクトリに存在することがわかります。
  3. インクルード関数は、ファイルが存在しないことを示しています

だから私はただ想像しているだけですか、それともこれは重大なphpバグですか?

アップデート

genral.class.php手動でアクセスしてもエラーは発生しません。インクルードされたファイル内からインクルードするときに特別な規則が適用されますか?

更新 2

インクルードパスを '../includes/htmlPurifierAndMarkdown.php' に設定すると、これはメインの呼び出しスクリプトへの相対パスであり、それを含むスクリプトが含まれgenral.class.phpていますが、この新しいインクルードは1つだけに関連しているため多くの呼び出しスクリプトのうち、それは他のもののために分解されます。インクルードされたファイル内からファイルをインクルードする場合、特別な規則が適用されますか??

4

3 に答える 3

5

この__FILE__定数は、その行を含むファイルのフル パスとファイル名を返します。このファイルは、現在の作業ディレクトリ以外のディレクトリ内にある可能性があります。あなたの特定の例では、これを使用できます:

include dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'htmlPurifierAndMarkdown.php';

何が起こっているかの例は次のとおりです。

  1. 実行中のファイルは/example.com/public_html/index.php
  2. 現在の作業ディレクトリは/example.com/public_html/
  3. インデックスファイルには/example.com/public_html/includes/classes/genral.class.php
  4. 上記のファイルはインクルードを試みます../htmlPurifierAndMarkdown.php
  5. ..、現在の作業ディレクトリに対して相対的に変換され、インクルード ファイルに対して相対的ではありません。したがって/example.com/htmlPurifierAndMarkdown.php、厄介なエラーメッセージが表示されます。
于 2013-01-11T20:38:11.193 に答える
1

../は相対パスです-現在の作業ディレクトリからの相対パスです。また、現在の作業ディレクトリは、外部スクリプト(ブラウザによって要求されているもの)が存在するディレクトリです。上記の例では、PHPはに関連するパスを解決しますadd.php

現在のファイルの絶対パスを取得するために使用dirname(__FILE__)します(要求されているか含まれているかに関係なく)。これを使用して、相対パスを使用して既知のファイルへの絶対パスを計算できます。

于 2013-01-11T21:11:50.163 に答える
0

次のようなファイルをインクルードしてみてください:

include(realpath(dirname(__FILE__) . '/../') . 'htmlPurifierAndMarkdown.php');

他の方法では、これらのファイルがあります::

/index.php  
/includes/classes/genral.class.php  
/includes/htmlPurifierAndMarkdown.php 

index.php :

include('/includes/classes/genral.class.php'); 

genral.class.php :

include('/includes/htmlPurifierAndMarkdown.php');

index.php で開始すると、これは正常に動作します ...

于 2013-01-11T20:43:15.340 に答える