0

したがって、これには多くの方法があることを認識しており、スタックには多くの回答がありますが、ajax を使用するサイトで単一のグローバルを利用できるものは見つかりません。両方の呼び出しを許可するように設定したいくつかのファイル。したがって、 $_POST['json'] をチェックする if ステートメントが存在する場合は、ファイル内の関数を呼び出します。それ以外の場合は、ファイルにインクルードして、関数を直接呼び出すことができます。以下は簡単な例です。

if (!empty($_POST['json'])) {echo json_encode(create_table());} 
function create_table(){}

私が抱えている問題は、関数内で include ../ を使用できないことです。これを含めると、そのパスが無効になる可能性があるためです。$_SERVER、$_SESSION、そしてもちろん定義があることは知っていますが、それらはすべて下落しています。

  • $_SERVERは、常に信頼できるとは限らないため、複数のプラットフォームでこれを使用する場合は信頼できません。
  • $_SESSIONタイムアウト
  • defineは ajax では機能しません。これは、そのファイルにアクセスするために ../ を実行する必要があるため、目的を無効にするインクルードを必要としますが、別のファイルへのインクルードを使用して元のファイルを呼び出した場合はエラーになります。

ROOT_URL と ROOT_DIR を関数内のパラメータの一部として単に送信することの有効性についてどう思うか教えてください。これにより、他のページを呼び出す最上位ページで define を使用でき、ajax を介してのみ呼び出すことができるファイルについては、../ を使用してそれらを呼び出すことができます。

少し前の履歴私は雇用フォームを持っていて、ランダムに人々が送信できなかった理由を理解できませんでした.save.phpファイルとencryption.phpファイルがセッション変数を使用してデータベース接続を呼び出すことに気付きました. 送信に時間がかかったためにセッションがタイムアウトし、何も機能しませんでした。AJAXでのみ呼び出すことができるため、save.phpを単に../にすることで修正しましたが、encryption.phpファイルはインクルードを必要とするクラスであるため、呼び出している人が誰でも$を送信できるようになりましたmysqli を直接使用すると、同じサイトで異なる db 接続を使用することもできます (なぜそうするのかはわかりませんが、ちょっとクールだと思いました.

どんな提案でも大歓迎です。

編集: Windows と Linux の両方で同時に動作するようにこれを構築しています。(テスト用にローカルの Windows サーバーを実行し、Linux ボックスでライブ テストを行います。

以下は、WindowsとLinuxの両方で同じセットアップを使用できるようにするために現在使用しているものです。

$BASE_NAME = basename(__DIR__);
$PHP_SELF = str_replace($BASE_NAME . '/', '', $_SERVER['PHP_SELF']);
$REAL_PATH = str_replace($BASE_NAME, '', __DIR__);
$URL_CHECK = (count(array_slice(explode('/', $PHP_SELF), 1, -1))) ? join( '/', array_slice(explode('/', $PHP_SELF), 1, -1)) . '/' : '';
$URL_COUNT = count(array_slice(explode('/', $_SERVER['PHP_SELF']), 1, -1));
$ROOT_URL = 'http://' . $_SERVER['HTTP_HOST'] . '/' . $URL_CHECK;
$ROOT_DIR = (realpath(dirname(__DIR__))) ? str_replace('\\', '/', $REAL_PATH) : $REAL_PATH;
define("ROOT_URL", $ROOT_URL);
define("ROOT_DIR", $ROOT_DIR);

編集: このすべてに $_SERVER タグを使用することに問題はありますか? または、少なくとも ajax を実行していて、一意にアクセスできないファイルはありますか?

4

2 に答える 2

0

わかりました、これは私が思いついたもので、追加の助けなしにLinuxとWindowsの両方で機能します。また、これはルート レベルで設定でき、どこに含めてもルート パスが検索されます。

$URL_ROOT = array_shift(array_slice(explode('/', $_SERVER['PHP_SELF']), 1, -1));
$URL_CHECK = ($URL_ROOT == basename(__DIR__)) ? $URL_ROOT . '/' : '';
define("ROOT_URL", 'http://' . $_SERVER['HTTP_HOST'] . '/' . $URL_CHECK);
define("ROOT_DIR", (realpath(dirname(__DIR__))) ? str_replace('\\', '/', realpath(dirname(__FILE__))) . '/' : realpath(dirname(__FILE__)) . '/');
于 2013-08-02T13:37:52.833 に答える