• April 22, 2018
    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 ครับ



เวอไนน์ไอคอร์ส

ประหยัดเวลากว่า 100 เท่า!






เวอไนน์เว็บไซต์⚡️
สร้างเว็บไซต์ ดูแลเว็บไซต์

Categories


Uncategorized