include("/path/config.php")
ควรจะตั้ง path ของ href เป็น absolute path
—
สมมุติว่า c:/testweb/index.php ตรงกันกับ address http://localhost/index.php
มีไฟล์ดังต่อไปนี้
c:/testweb/index.php
c:/testweb/config.php
c:/testweb/page1.php
c:/testweb/admin/page2.php
c:/testweb/functions/database.php
ไฟล์ page1.php และ page2.php จะทำการ include config.php เพื่อนำค่า PATH มาใช้เพื่อสร้างเป็น absolute path
เมื่อเปิดหน้า http://localhost/page1.php
เมื่อเปิดหน้า http://localhost/admin/page2.php
แม้ว่าทั้งสองไฟล์จะอยู่คนละระดับกัน แต่จะมีลิงค์ไปยังหน้า /index.php ได้ถูกต้องเสมอเพราะใช้ absolute path
และเช่นกัน page1.php และ page2.php จะมีการ include ไฟล์ database.php ได้ถูกต้องเสมอ เพราะได้นำค่า ROOT มาสร้างเป็น absolute path
ปล. วิธีนี้จะยุ่งยากกว่าการใช้ absolute path แบบธรรมดาๆ เช่น
include ‘/functions/database.php’; และ <a href=”/index.php”>LINK</a>
แต่จะสะดวกต่อการเคลื่อนย้าย
ตัวอย่างเช่นเมื่อย้ายไปยัง folder
c:/testweb/blog/index.php
c:/testweb/blog/config.php
c:/testweb/blog/page1.php
c:/testweb/blog/admin/page2.php
c:/testweb/blog/functions/database.php
ทุกๆ ไฟล์และทุกๆ การ include ก็จะยังคงเชื่อมโยงกันอย่างถูกต้องทั้งหมดดังเดิม
<?php //config.php define('ROOT',str_replace("\\",'/',dirname(__FILE__))); define('PATH', ROOT == $_SERVER['DOCUMENT_ROOT'] ?'' :substr(ROOT,strlen($_SERVER['DOCUMENT_ROOT'])) ); echo ROOT,'<br />'; echo PATH,'<br />'; include ROOT.'/functions/database.php'; ?><a href="<?php echo PATH;?>/index.php">LINK</a> <?php //page1.php require_once 'config.php'; echo ROOT,'<br />'; echo PATH,'<br />'; include ROOT.'/functions/database.php'; ?><a href="<?php echo PATH;?>/index.php">LINK</a> <?php //page2.php require_once '../config.php'; echo ROOT,'<br />'; echo PATH,'<br />'; include ROOT.'/functions/database.php'; ?><a href="<?php echo PATH;?>/index.php">LINK</a>
function include require นั้นจะเอา directory ของไฟล์ที่ถูก request เป็นตัวตั้งในการค้นหา relative path ครับ
สมมุติมีไฟล์ต่อไปนี้
http://localhost/example1/index.php
http://localhost/example1/header.php
http://localhost/example2/couter.php
http://localhost/index.php
ไฟล์ /example1/index.php
<?php require_once(‘header.php’);
ไฟล์ /example1/header.php
<?php echo ‘[header.php]’;
require_once(‘../example2/counter.php’);
ไฟล์ /example2/counter.php
<?php echo ‘[counter.php’];
เมื่อเราทำการ request http://localhost/example1/index.php
จะได้ผลลัพธ์เป็น [header.php][counter.php]
ซึ่งได้ผลถูกต้อง
แต่เมื่อเราสร้างไฟล์อีกไฟล์นึงชื่อว่า /index.php ที่จะทำการ include header.php มาใช้งาน
มีโค้ด
<?php require_once(‘example1/header.php’);
เมื่อเราทำการ request ไฟล์ http://localhost/index.php
จะปรากฎว่า php เกิด
Warning: require_once(../example2/counter.php) [function.require-once]: failed to open stream: No such file or directory in C:\testweb\example1\header.php on line 2
เนื่องจาก ไฟล์ที่ถูก request คือ /index.php ทำให้ directory หลักที่จะใช้ในการอ้างอิงถึง relative path ก็คือ /
ซึ่งเป็นคนละระดับกับ /example1/header.php จึงไม่สามารถอ้างถึงไฟล์ /example2/counter.php ได้
ในการ request http://localhost/index.php
การ include ../example2/counter.php นี้จะเป็นอ้างไปถึง folder อีกระดับนึงคือ
C:\example2 ซึ่งถ้าในนั้นมีไฟล์ counter.php ก็จะสามารถ include เข้ามาได้ แต่ก็ควรจะใช้เป็น absolute path มากกว่าจะได้ไม่ต้องสร้าง folder และไฟล์ซ้ำซ้อนซึ่งจะทำให้ไฟล์เยอะและเมื่อต้องการแก้ไขต้องไปตามแก้ไขหลายที่ครับ
http://localhost/news/last10.php
http://localhost/news/show.php
http://localhost/news/index.php
สมมุติว่าไฟล์ /news/last10.php
แสดงผล
<a href=”show.php?id=1″>news1</a>
<a href=”show.php?id=2″>news2</a>
<a href=”show.php?id=3″>news3</a>
ในไฟล์ /news/index.php
<?php include ‘last10.php’;
เมื่อ request http://localhost/news/index.php
ก็จะแสดงผลเหมือนกับ last10.php ทุกประการ สามารถลิงค์ไปหน้า show.php ได้อย่างถูกต้อง
กลับกันถ้า
http://localhost/index.php
<?php include ‘news/last10.php’;
เมื่อ request http://localhost/index.php
ก็จะแสดงผลลิงค์เหมือนกับ last10.php ทุกประการ ก็จริง
แต่ไม่สามารถลิงค์ไปหน้า show.php ได้อย่างถูกต้อง
เนื่องจากว่าเป็นการลิงค์ show.php นั้นเป็นแบบ relative path ซึ่งใน
http://localhost/ ไม่มีไฟล์ show.php นั่นเองครับ
ถ้าต้องการให้ http://localhost/index.php แสดงผลและสามารถลิงค์ได้ถูกต้องเหมือนกับ
http://localhost/news/index.php ทุกประการ
ในไฟล์ http://localhost/index.php จะต้องใช้วิธีแทรก tag
<iframe src=”news/last10.php”></iframe>
และจะต้องแก้ไข target ของ link ในไฟล์ last10.php ด้วยครับไม่งั้นเวลากดลิงค์ก็จะอยู่ที่ iframe ตามเดิม
<a href=”show.php?id=1″ target=”_top”>news1</a>
<a href=”show.php?id=2″ target=”_top”>news2</a>
<a href=”show.php?id=3″ target=”_top”>news3</a>
หรืออาจจะใช้การ include ธรรมดาๆ โดยไม่ใช้ iframe ก็ได้ครับ แต่ลิงค์จะต้องเป็น absolute path
<a href=”/news/show.php?id=1″>news1</a>
<a href=”/news/show.php?id=2″>news2</a>
<a href=”/news/show.php?id=3″>news3</a>
ส่วนเรื่อง css ในกรณีที่ index.php include ธรรมดาโดยไม่ใช้ iframe นั้น
จะเป็นการ merge กันระหว่าง css ที่มีในไฟล์ /news/last10.php กับ css ที่มีในไฟล์ index.php
แต่ถ้าใน last10.php มีการใช้ tag link ไปยังไฟล์ .css ซึ่งถ้าใช้ relative path ในบางกรณีที่ไฟล์ที่ include ไฟล์ last10.php เข้ามาอยู่กันคนละระดับกับ last10.php ก็จะไม่สามารถดึงไฟล์ .css เข้ามาใช้ได้
แต่ถ้าใช้ tag link ไปยังไฟล์ .css โดยใช้ absolute path ก็จะเป็นการ merge style กันระหว่างไฟล์ index.php และไฟล์ last10.php ครับ