include ข้ามไฟล์ยังงี้แล้วมีปัญหาครับ ?? คือผมงงมากครับเคยตั้งกระทู้เกี่ยวกับ include ไปแล้ว
ผมเข้าใจว่าโครงสร้างของ path ไม่ถูกต้องครับ ถ้าไม่อยากปวดหัวเรื่อง path ผมแนะนำให้เรียกจาก root (/) ทุกครั้งครับ
Code (PHP)
include("/path/config.php")
Date :
2009-10-11 17:41:42
By :
webmaster
นอกจากปัญหาเรื่อง include 'path'; ยังมีเรื่องต้องระวังที่ <a href="path">link</a> อีกครับในไฟล์ที่จะ include เข้าไปในไฟล์อื่นเช่น header.php พวกนี้ควรจะตั้ง path ของ href เป็น absolute path เช่นกัน
include-file-using-absolute-path
Date :
2009-10-11 18:30:34
By :
num
ขอบคุณครับ แต่ก็ยังงงอยู่ ดี อิอิ
Date :
2009-10-14 20:38:07
By :
the_cop
สมมุติว่า 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>
Date :
2009-10-14 22:54:23
By :
num
ขอบคุณมากครับพี่ พอจะมองเห็นภาพแล้วครับ
แต่รบกวนอีกหน่อยนะครับ คืออยากรู้อีกว่าถ้า include
มาแบบปกติมาจากไฟล์อื่น แล้วไฟล์ ที่ถูก include มา
มันยังจะแสดงค่าทุกอย่างเหมือนเดิมกับที่แสดงในหน้าเดิมไหมครับ
Date :
2009-10-17 13:02:00
By :
the_cop
ไม่รู้ว่าผมเข้าใจคำถามถูกป่าวนะครับ
แต่จะอธิบายเพิ่มเรื่องการ include นะครับ
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 และไฟล์ซ้ำซ้อนซึ่งจะทำให้ไฟล์เยอะและเมื่อต้องการแก้ไขต้องไปตามแก้ไขหลายที่ครับ
Date :
2009-10-17 14:35:54
By :
num
อ่านอีกรอบก็เริ่มเข้าใจว่าหมายถึง html ซะมากกว่า
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 ครับ
Date :
2009-10-17 15:06:51
By :
num
สำหรับคนที่ทำ project เล็กๆ อาจไม่จำเป็นนัก แต่พอ project ใหญ่หน่อยหา path กันให้วุ่นวายเห่อๆ
งมมาหลายวันแล้ว หาอยู่พอดี วีธีการแบบนี้ ขอบคุณครับพี่หนุ่ม
Date :
2009-10-18 14:44:50
By :
peterxp
php framework ที่ผมเขียนขึ้นใช้เอง แก้ปัญหา path และช่วยในการ reuse program ครับ
# ใช้ ADODB Class และ Smarty 3.0 Class เป็นคลาสหลักของโปรแกรม
# รูปแบบการเขียนแบบ CV Design Pattern
# แบ่งส่วนการแสดงผลเป็น layout และ view ช่วยการปรับเปลี่ยน layout ได้ง่าย
# ระยะเวลาการเขียนรู้ framework ต่ำมากโครงสร้าง folder อิสระเหมือนเขียนเว็บตามปกติ และ preview file ได้ทันทีใน text editor ส่วนใหญ่
# ความสามารถในการรวม folder ต่างระดับชั้นนำมาใช้ร่วมกัน โดยการปรับเปลี่ยนลิงค์ relative path ในไฟล์ template เป็น absolute path ทำให้สามารถ ดึงข้อมูล view ต่างๆ มารวมกันไว้ใน file เดียวแม้อยู่ในคนละ folder ได้โดยไม่ต้องแก้ไข view เก่าเลย
# ปิดการต่อ database ให้โดยอัตโนม้ติ
# ไฟล์ template สามารถแก้ไขใน wysiwyg editor อย่างเช่น dreamweaver ได้
http://www.ziddu.com/download/7950748/webdesigner0.9a.zip.html
Date :
2010-01-04 19:08:20
By :
num
ขอบพระคุณค่ะ,,เป็นประโยชน์มากเลยค่ะ
จะได้ไมาต้องหา path กันให้วุ่นวาย
Date :
2011-10-09 10:16:03
By :
SomjuK
มีเรื่องจะถามค่ะ พอใช้คำสั่งinclude ไปแล้ว หน้าdesign ขึ้นหน้าที่เราincldeน่ะค่ะ
แต่preview ไม่ขึ้นค่ะ
<?php include 'cooperative';?>
ใช้รูปแบบคำสั่งนี้น่ะค่ะ
Date :
2017-09-20 11:49:39
By :
ning
เราดึงข้อมูล include มาได้ แต่ว่ารูปภาพที่ใสไว้ในหรืออะไรต่างๆในชื่องานนั้นมันไม่มา เป็นเพราะอะไรค่ะ
Date :
2020-11-27 11:30:02
By :
pat
include เป็น independent behavior
Resources inside script need to have a new reference.
Date :
2020-11-27 11:41:51
By :
PhrayaDev
ข้อโค้ดดึงข้อมูลจากโฟลเดอร์อื่นหน่อยยยยยยย
ใช้ php-css
Date :
2020-11-27 14:43:57
By :
pat
อยากสอบถามว่า เราสร้างโฟลเดอร์มาใหม่แล้วเก็บงานไว้ที่โฟลเดอร์นั้น จากนั้นเราก็ลิ้งหน้าหลักมาหน้าไฟล์ที่อยู่คนละโฟลเดอร์ โดยใช้ script เป็นตัวลิ้งโดยใช้ไอดี เราก็ลิ้งไปได้นะ ในหน้านั้นไม่มีข้อมูลที่เราทำไว้เลยมีแต่หน้าtableที่สร้างมาไว้ แต่ข้อมูลใน table ไม่มีเลย เป็นเพราะอะไรอ่ะ ตอนนี้ งง มาก ดู Google ยิ่งอ่านยิ่ง งง
Date :
2020-12-01 14:27:08
By :
pat
Load balance : Server 01