fb_ads

www.รับเขียนโปรแกรม.net รับเขียนโปรแกรม ระบบต่างๆ เช่น ระบบข้อมูลบุคคล ระบบข้อมูลลูกค้า ระบบซื้อขาย คลังสินค้า ระบบเช่าจอง ทำงานบน Website ด้วย PHP MySql NodeJs HTML5 JavaScript Ajax

การตั้งค่าไฟล์ .htaccess บน web server ( ที่ไม่มีรองรับ NodeJS มีแต่ PHP ) เพื่อแก้ปัญหา Route ของ React Application

เมื่อเรา แต่ต้องการ upload ขึ้น host ซึ่งอาจเป็น shared host ธรรมดาเช่น hostgator หรือ godaddy เป็นต้นซึ่งปัญหาที่เจอ คือ เมื่อเราสร้าง route โดยใช้ browser router  หาก ผู้ใช้เข้ามาตาม path ที่เรากำหนดไว้ในครั้งแรกจะไม่สามารถเข้าได้ ผู้ใช้ต้องเข้าเข้าจากหน้าแรกก่อน

ในบทความนี้ จะแสดงวิธีแก้ปัญหา การใช้งาน BrowserRouter ของ react กับการ upload ขึ้น shared host ธรรมดา

รับเขียนโปรแกรม React



กรณีที่พัฒนา react โดยใช้ create-react-app  และ สมมุติว่าเรามี code ใน folder src ดังนี้ 

( ในตัวอย่างนี้ใช้ react-router-dom version 6  )

ไฟล์ master_page.js

import { useNavigate } from "react-router-dom";

const MasterPage=(props)=>{

    const navigate=useNavigate();

    return (<div>

        <div>
            <button onClick={event=>{ navigate("/page1") }} >Page1</button>
            <button onClick={event=>{ navigate("/page2") }} >Page2</button>
        </div>

        <hr />
        {props.children}

    </div>);

}

export default MasterPage;

ไฟล์ page1.js

import MasterPage from "./master_page";

const Page1=()=>{
    return <MasterPage>
        <h1>This is Page1 --- </h1>
    </MasterPage>
}

export default Page1;

ไฟล์ page2.js

import MasterPage from "./master_page";

const Page2=()=>{

    return <MasterPage>
        <h1>This is Page2 --- </h1>
    </MasterPage>
}

export default Page2;

ไฟล์ app.js

import Page1 from "./page1";
import Page2 from "./page2";

import {Routes, Route, BrowserRouter} from "react-router-dom";

function App() {
  return (
   <>
    <BrowserRouter>
        <Routes>

          <Route index  element={<Page1 />} />
          <Route path="page1"  element={<Page1 />} />
          <Route path="page2"  element={<Page2 />} />
         
        </Routes>
      </BrowserRouter>
   </>
  );
}

export default App;

จาก Code ดังกล่าว จะเห็นว่าเราสร้าง Route ของหน้าเว็บได้แก่ /page1 และ /page2 

และเมื่อเราทำการ build โดยใช้คำสั่ง npm run build แล้ว จะได้ folder ชื่อ build 

( โดยกรณีนี้ก่อน build ให้ กำหนด homepage ในไฟล์ package.json เพื่อให้ใช้ได้กับทุก domain )


เมื่อ รันคำสั่ง npm run build แล้ว ใน folder project จะมี folder build เพิ่มขึ้นมาซึ่งเราจะนำไฟล์ใน folder build นี้ upload ขึ้นไปไว้ที่ host


ปัญหาคือเมื่อเราใช้ BrowserRouter เราไม่สามารถเข้าผ่าน http://domain.com/page2 โดยตรงได้ จะต้องผ่าน http://domain.com/ คือหน้าแรกก่อนแล้วกด link ไป Page2 ถึงเข้า Page2 ได้เราสามารถกำหนดไฟล์ .htaccess และ Upload ไปที่ server ( Folder ที่เก็บไฟล์เว็บ ) เพื่อแก้ปัญหานี้ได้ ดังนี้

RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule . /index.html [L]

เพื่อระบุว่าหากเข้ามาใน path ที่ไม่มีอยู่ให้เรียกไฟล์ index.html

ตัวอย่างการสร้างกราฟวงกลม ( pie chart) บนหน้าเว็บ ด้วย PHP MySQL และ Javascript

เราสามารถแสดงหน้ารายงานโดยอ่านข้อมูลออกมาจากฐานข้อมูล mysql ออกมาแสดงเป็นกราฟวงกลมได้ดังนี้

Link ที่เกี่ยวข้อง สร้างกราฟแท่งด้วย javascript ( โดยใช้ chartjs และดึงข้อมูลมาจาก Firebase database )

Link ที่เกี่ยวข้อง สร้างกราฟแท่งด้วย ChartJs.org ตอน 2 ( สร้างกราฟแบบ DataSet เดียว )

รับเขียนโปรแกรม PHP MySQL Javascript

 1. สร้างไฟล์ get_data.php สำหรับอ่านข้อมูลจาก MySQL

<?php

    /*กำหนด username password และ database name ของ mysql */
    $servername = "localhost";
    $username = "...";
    $password = "...";
    $dbname = "...";

     /*------เชื่อมต่อ Database----*/
    $conn = new mysqli($servername, $username, $password, $dbname);
    
    if ($conn->connect_error) {
      die("Connection Error: " . $conn->connect_error);
    }

     /*------ถ้ายังไม่มีตาราง ให้สร้างตาราง ชื่อ food----*/
    $sql = "CREATE TABLE IF NOT EXISTS population  (
        country VARCHAR(100),
        population INT(8)
      )";

    $conn->query($sql);


    $sql = "SELECT * FROM population";
    $result = $conn->query($sql);

    if ($result->num_rows == 0)
    {
        /*----ถ้ายังไม่มีข้อมูลในตาราง population ให้เพิ่มข้อมูลเข้าไป----*/

        $sql = "INSERT INTO population (country, population)
        VALUES ('China', '1448178826')";
        $conn->query($sql);

        $sql = "INSERT INTO population (country, population)
        VALUES ('India', '1401891297')";
        $conn->query($sql);

        $sql = "INSERT INTO population (country, population)
        VALUES ('U.S.A.', '334107942')";
        $conn->query($sql);

        $sql = "INSERT INTO population (country, population)
        VALUES ('Indonesia', '278196711')";
        $conn->query($sql);

        $sql = "INSERT INTO population (country, population)
        VALUES ('Pakistan', '227952794')";
        $conn->query($sql);
    }
    //อ่านข้อมูล Popuplation จาก Database
    $sql = "SELECT * FROM population";
    $result = $conn->query($sql);
    //ส่งออกข้อมูลกลับไปที่ web browser ในรูปแบบ JSON
    $rows = array();
    while($r = mysqli_fetch_assoc($result)) {
        $rows[] = $r;
    }
    echo json_encode($rows);


?>

 

2.สร้างไฟล์ index.html สำหรับ แสดงกราฟวงกลม

<!DOCTYPE html>
<html lang="en-US">
<head>
    <meta charset="utf-8">
    <title>ตัวอย่างกราฟวงกลม</title>
    <!-- import javascript สร้าง  pie chart และ axios เพื่อดึงข้อมูลจาก MySQL แบบ ajax -->
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>

<!-- สร้าง div สำหรับแสดงกราฟ -->
<div id="piechart"></div>

<script type="text/javascript" >
    //ดึงข้อมูลแบบ ajax โดยเรียกไฟล์ get_data.php
    axios.get("get_data.php").then(response=>{

        google.charts.load('current', {'packages':['corechart']});
        google.charts.setOnLoadCallback(function(){
            //เก็บข้อมูล JSON ที่ส่งจากไฟล์ get_data.php ไว้ในตัวแปร data_from_mysql
            var data_from_mysql=response.data;
            var data=[];//สร้างตัวแปรสำหรับข้อมูลที่จะไปแสดงในกราฟ
            data.push(['Country', 'Popupulation']);
            //เพิม Country และ Population ที่ได้จาก MySQL เข้าไปใน data
            data_from_mysql.map(item=>{
                data.push([item.country,parseInt(item.population)]);
            });
            
            // กำหนดชื่อกราฟ ความกว่าง และความยาว
            var options = {
                'title':'World Population',
                'width':650,
                'height':400,
                sliceVisibilityThreshold:.00001
            };

            // สร้างกราฟในtag <div> ที่มี id เป็น "piechart"
            var chart = new google.visualization.PieChart(document.getElementById('piechart'));
            chart.draw(google.visualization.arrayToDataTable(data), options);
        });

    });
</script>

</body>
</html>

 

ผลลัพธ์ที่ได้คือ