สำหรับ URL
$SCRIPT_URL = ‘http://’ . $_SERVER[‘HTTP_HOST’] . $_SERVER[‘PHP_SELF’];
สำหรับ PATH ให้ทำแบบนี้ครับ
ให้สร้างไฟล์ไว้ไฟล์หนึ่งใน root หรือ ที่ไหนก็ได้ ของ web
ทุกไฟล์ php ไม่ว่าจะอยู่ตรงไหน ให้เรียก include ไฟล์นี้ก่อน
และเวลา include/require ทุกครั้งให้เรียก โดยใช้ path ต่อจากตัวแปร หรือ define ที่ตั้งโดยไฟล์แรก
เช่น
ให้ทุกไฟล์ include ไฟล์ /include/config.php
<?php define('WEB_ROOTDIR', realpath(dirname(__FILE__) . '/..')); ?>
สมมติว่าเวบอยู่ที่ /home/foo/public_html/myweb/
__FILE__ = /home/foo/public_html/myweb/include/config.php
dirname(__FILE__) = /home/foo/public_html/myweb/include
WEB_ROOTDIR = /home/foo/public_html/myweb/include/.. ซึ่งจริง ๆ คือ
/home/foo/public_html/myweb หลังจาก realpath()
เวลาทุกไฟล์จะ include อะไรก็ตามก็ให้ใช้ relative path กับ เวบ โดยใช้ WEB_ROOTDIR แทนเช่น
สมมติ ไฟล์ที่ต้องการ include อยู่ใน <webroot>/admin/index.php
<?php require_once(__FILE__ . '/../config/config.php'); require_once(WEB_ROOTDIR . '/adodb/adodb.inc.php'); require_once(WEB_ROOTDIR . '/include/myclass.php'); ... ... ?>
ง่ายมะ แล้วทีนี้จะย้าย script ไป folder ไหนก็ได้ โดยเปลี่ยนแค่บรรทัดเดียวคือ บรรทัดที่ require_once(‘/../config/config.php’) ให้ชี้ไปถูกที่
และมีวิธีที่ไม่ต้องแก้อะไรเลยด้วย โดยทำแบบนี้ แต่ไม่รับรองจะ work ทุก server นะ และ วิธีนี้อาจจะใช้ไม่ได้ถ้าใช้ เวบที่จะใช้ URL Rewrite หรือ Alias บนบาง server … (แต่ส่วนใหญ่น่าจะใช้ได้)
<webroot>/admin/index.php
<?php define(WEB_ROOTDIR, preg_replace('/\/[^\/]+/','../',dirname($_SERVER['PHP_SELF'])))) require_once(WEB_ROOTDIR . '/adodb/adodb.inc.php'); require_once(WEB_ROOTDIR . '/include/myclass.php'); ... ... ?>
แล้วก็ บางคนอาจจะใช้ $_SERVER[‘DOCUMENT_ROOT’] อันนี้ไม่ portable (บาง web server ใช้มะได้) และใช้มะได้ใน CLI ด้วย
ลองเอา script นี้ไปวางไว้ที่ต่าง ๆ ในเวบแล้วเรียกดู
<?php header('Content-Type: text/plain'); echo $_SERVER['PHP_SELF'] . "\n"; echo dirname($_SERVER['PHP_SELF']) . "\n"; echo preg_replace('/\/[^\/]+/','../',dirname($_SERVER['PHP_SELF'])) . "\n"; echo realpath('./' . preg_replace('/\/[^\/]+/','../',dirname($_SERVER['PHP_SELF']))) . "\n"; ?>