//
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>> database.php
// PHP code to access the database.
<?php
      class Database {
            private static $dbName = 'REPLACE_WITH_YOUR_DATABASE_NAME'; // Example:
private static $dbName = 'myDB';
            private static $dbHost =
'REPLACE_WITH_YOUR_HOST_NAME_OR_SERVER_NAME'; // Example: private static $dbHost =
'localhost';
            private static $dbUsername = 'REPLACE_WITH_YOUR_USERNAME'; // Example:
private static $dbUsername = 'myUserName';
            private static $dbUserPassword = 'REPLACE_WITH_YOUR_PASSWORD'; // //
Example: private static $dbUserPassword = 'myPassword';
           private static $cont   = null;
           public function __construct() {
                 die('Init function is not allowed');
           }
            public static function connect() {
      // One connection through whole application
      if ( null == self::$cont ) {
        try {
          self::$cont = new PDO( "mysql:host=".self::$dbHost.";"."dbname=".self::
$dbName, self::$dbUsername, self::$dbUserPassword);
        } catch(PDOException $e) {
          die($e->getMessage());
        }
      }
      return self::$cont;
            }
           public static function disconnect() {
                 self::$cont = null;
           }
      }
?>
//
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<
###################################################################################
#########
###################################################################################
#########
###################################################################################
#########
###################################################################################
#########
//
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>> updateDHT11data_and_recordtable.php
// PHP code to update and record DHT11 sensor data and LEDs state in table.
<?php
  require 'database.php';
  //---------------------------------------- Condition to check that POST value is
not empty.
  if (!empty($_POST)) {
    //........................................ keep track POST values
    $id = $_POST['id'];
    $temperature = $_POST['temperature'];
    $humidity = $_POST['humidity'];
    $status_read_sensor_dht11 = $_POST['status_read_sensor_dht11'];
    $led_01 = $_POST['led_01'];
    $led_02 = $_POST['led_02'];
    //........................................
    //........................................ Get the time and date.
    date_default_timezone_set("Asia/Jakarta"); // Look here for your timezone :
https://www.php.net/manual/en/timezones.php
    $tm = date("H:i:s");
    $dt = date("Y-m-d");
    //........................................
    //........................................ Updating the data in the table.
    $pdo = Database::connect();
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // replace_with_your_table_name, on this project I use the table name
'esp32_table_dht11_leds_update'.
    // This table is used to store DHT11 sensor data updated by ESP32.
    // This table is also used to store the state of the LEDs, the state of the
LEDs is controlled from the "home.php" page.
    // This table is operated with the "UPDATE" command, so this table will only
contain one row.
    $sql = "UPDATE replace_with_your_table_name SET temperature = ?, humidity = ?,
status_read_sensor_dht11 = ?, time = ?, date = ? WHERE id = ?";
    $q = $pdo->prepare($sql);
    $q->execute(array($temperature,$humidity,$status_read_sensor_dht11,$tm,$dt,
$id));
    Database::disconnect();
    //........................................
    //........................................ Entering data into a table.
    $id_key;
    $board = $_POST['id'];
    $found_empty = false;
    $pdo = Database::connect();
    //:::::::: Process to check if "id" is already in use.
    while ($found_empty == false) {
      $id_key = generate_string_id(10);
      // replace_with_your_table_name, on this project I use the table name
'esp32_table_dht11_leds_record'.
      // This table is used to store and record DHT11 sensor data updated by ESP32.
      // This table is also used to store and record the state of the LEDs, the
state of the LEDs is controlled from the "home.php" page.
      // This table is operated with the "INSERT" command, so this table will
contain many rows.
       // Before saving and recording data in this table, the "id" will be checked
first, to ensure that the "id" that has been created has not been used in the
table.
       $sql = 'SELECT * FROM replace_with_your_table_name WHERE id="' . $id_key .
'"';
       $q = $pdo->prepare($sql);
       $q->execute();
      if (!$data = $q->fetch()) {
        $found_empty = true;
      }
    }
    //::::::::
    //:::::::: The process of entering data into a table.
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // replace_with_your_table_name, on this project I use the table name
'esp32_table_dht11_leds_record'.
    // This table is used to store and record DHT11 sensor data updated by ESP32.
    // This table is also used to store and record the state of the LEDs, the state
of the LEDs is controlled from the "home.php" page.
    // This table is operated with the "INSERT" command, so this table will contain
many rows.
            $sql = "INSERT INTO replace_with_your_table_name
(id,board,temperature,humidity,status_read_sensor_dht11,LED_01,LED_02,time,date)
values(?, ?, ?, ?, ?, ?, ?, ?, ?)";
            $q = $pdo->prepare($sql);
            $q->execute(array($id_key,$board,$temperature,$humidity,
$status_read_sensor_dht11,$led_01,$led_02,$tm,$dt));
    //::::::::
    Database::disconnect();
    //........................................
  }
  //----------------------------------------
   //---------------------------------------- Function to create "id" based on
numbers and characters.
   function generate_string_id($strength = 16) {
     $permitted_chars =
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
     $input_length = strlen($permitted_chars);
     $random_string = '';
     for($i = 0; $i < $strength; $i++) {
       $random_character = $permitted_chars[mt_rand(0, $input_length - 1)];
       $random_string .= $random_character;
     }
     return $random_string;
   }
   //----------------------------------------
?>
//
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<
###################################################################################
#########
###################################################################################
#########
###################################################################################
#########
###################################################################################
#########
//
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>> getdata.php
// PHP file to get DHT11 sensor data and LEDs state stored in table in database to
display on "home.php" page.
// This file is also accessed by ESP32 to get the state of the LEDs, the state of
the LEDs is controlled from the "home.php" page.
<?php
   include 'database.php';
  //---------------------------------------- Condition to check that POST value is
not empty.
  if (!empty($_POST)) {
    // keep track post values
    $id = $_POST['id'];
    $myObj = (object)array();
    //........................................
    $pdo = Database::connect();
    // replace_with_your_table_name, on this project I use the table name
'esp32_table_dht11_leds_update'.
    // This table is used to store DHT11 sensor data updated by ESP32.
    // This table is also used to store the state of the LEDs, the state of the
LEDs is controlled from the "home.php" page.
    // To store data, this table is operated with the "UPDATE" command, so this
table contains only one row.
    $sql = 'SELECT * FROM replace_with_your_table_name WHERE id="' . $id . '"';
    foreach ($pdo->query($sql) as $row) {
      $date = date_create($row['date']);
      $dateFormat = date_format($date,"d-m-Y");
      $myObj->id = $row['id'];
      $myObj->temperature = $row['temperature'];
      $myObj->humidity = $row['humidity'];
      $myObj->status_read_sensor_dht11 = $row['status_read_sensor_dht11'];
      $myObj->LED_01 = $row['LED_01'];
      $myObj->LED_02 = $row['LED_02'];
      $myObj->ls_time = $row['time'];
      $myObj->ls_date = $dateFormat;
      $myJSON = json_encode($myObj);
      echo $myJSON;
    }
    Database::disconnect();
    //........................................
  }
  //----------------------------------------
?>
//
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<
###################################################################################
#########
###################################################################################
#########
###################################################################################
#########
###################################################################################
#########
//
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>> updateLEDs.php
// PHP code to update the state of the LEDs, the state of the LEDs is controlled
from the "home.php" page.
<?php
   require 'database.php';
  //---------------------------------------- Condition to check that POST value is
not empty.
  if (!empty($_POST)) {
    //........................................ keep track post values
    $id = $_POST['id'];
    $lednum = $_POST['lednum'];
    $ledstate = $_POST['ledstate'];
    //........................................
     //........................................
     $pdo = Database::connect();
     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     // replace_with_your_table_name, on this project I use the table name
'esp32_table_dht11_leds_update'.
     // This table is used to store DHT11 sensor data updated by ESP32.
     // This table is also used to store the state of the LEDs, the state of the
LEDs is controlled from the "home.php" page.
     // To store data, this table is operated with the "UPDATE" command, so this
table contains only one row.
     $sql = "UPDATE replace_with_your_table_name SET " . $lednum . " = ? WHERE id
= ?";
     $q = $pdo->prepare($sql);
     $q->execute(array($ledstate,$id));
     Database::disconnect();
     //........................................
   }
   //----------------------------------------
?>
//
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<
###################################################################################
#########
###################################################################################
#########
###################################################################################
#########
###################################################################################
#########
//
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>> home.php
// PHP/HTML code to display DHT11 sensor data and control LEDs state.
<!DOCTYPE HTML>
<html>
   <head>
     <title>ESP32 WITH MYSQL DATABASE</title>
     <meta name="viewport" content="width=device-width, initial-scale=1">
     <link rel="stylesheet"
href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-
fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr"
crossorigin="anonymous">
     <link rel="icon" href="data:,">
     <style>
       html {font-family: Arial; display: inline-block; text-align: center;}
       p {font-size: 1.2rem;}
       h4 {font-size: 0.8rem;}
       body {margin: 0;}
       .topnav {overflow: hidden; background-color: #0c6980; color: white; font-
size: 1.2rem;}
       .content {padding: 5px; }
       .card {background-color: white; box-shadow: 0px 0px 10px 1px
rgba(140,140,140,.5); border: 1px solid #0c6980; border-radius: 15px;}
       .card.header {background-color: #0c6980; color: white; border-bottom-right-
radius: 0px; border-bottom-left-radius: 0px; border-top-right-radius: 12px; border-
top-left-radius: 12px;}
       .cards {max-width: 700px; margin: 0 auto; display: grid; grid-gap: 2rem;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));}
       .reading {font-size: 1.3rem;}
       .packet {color: #bebebe;}
       .temperatureColor {color: #fd7e14;}
       .humidityColor {color: #1b78e2;}
       .statusreadColor {color: #702963; font-size:12px;}
       .LEDColor {color: #183153;}
      /* ----------------------------------- Toggle Switch */
      .switch {
        position: relative;
        display: inline-block;
        width: 50px;
        height: 24px;
      }
      .switch input {display:none;}
      .sliderTS {
    position: absolute;
    cursor: pointer;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: #D3D3D3;
    -webkit-transition: .4s;
    transition: .4s;
    border-radius: 34px;
}
.sliderTS:before {
  position: absolute;
  content: "";
  height: 16px;
  width: 16px;
  left: 4px;
  bottom: 4px;
  background-color: #f7f7f7;
  -webkit-transition: .4s;
  transition: .4s;
  border-radius: 50%;
}
input:checked + .sliderTS {
  background-color: #00878F;
}
input:focus + .sliderTS {
  box-shadow: 0 0 1px #2196F3;
}
input:checked + .sliderTS:before {
  -webkit-transform: translateX(26px);
  -ms-transform: translateX(26px);
  transform: translateX(26px);
}
.sliderTS:after {
  content:'OFF';
  color: white;
  display: block;
  position: absolute;
  transform: translate(-50%,-50%);
  top: 50%;
  left: 70%;
  font-size: 10px;
  font-family: Verdana, sans-serif;
}
input:checked + .sliderTS:after {
  left: 25%;
  content:'ON';
}
input:disabled + .sliderTS {
  opacity: 0.3;
  cursor: not-allowed;
        pointer-events: none;
      }
      /* ----------------------------------- */
    </style>
  </head>
  <body>
    <div class="topnav">
      <h3>ESP32 WITH MYSQL DATABASE</h3>
    </div>
    <br>
    <!-- __ DISPLAYS MONITORING AND CONTROLLING
___________________________________________________________________________________
_________ -->
    <div class="content">
      <div class="cards">
        <!-- == MONITORING
===================================================================================
===== -->
        <div class="card">
          <div class="card header">
            <h3 style="font-size: 1rem;">MONITORING</h3>
          </div>
           <!-- Displays the humidity and temperature values received from ESP32.
*** -->
          <h4 class="temperatureColor"><i class="fas fa-thermometer-half"></i>
TEMPERATURE</h4>
          <p class="temperatureColor"><span class="reading"><span
id="ESP32_01_Temp"></span> °C</span></p>
          <h4 class="humidityColor"><i class="fas fa-tint"></i> HUMIDITY</h4>
          <p class="humidityColor"><span class="reading"><span
id="ESP32_01_Humd"></span> %</span></p>
          <!--
*********************************************************************** -->
          <p class="statusreadColor"><span>Status Read Sensor DHT11 : </span><span
id="ESP32_01_Status_Read_DHT11"></span></p>
        </div>
        <!--
===================================================================================
==================== -->
        <!-- == CONTROLLING
===================================================================================
===== -->
        <div class="card">
          <div class="card header">
            <h3 style="font-size: 1rem;">CONTROLLING</h3>
          </div>
          <!-- Buttons for controlling the LEDs on Slave 2.
************************** -->
          <h4 class="LEDColor"><i class="fas fa-lightbulb"></i> LED 1</h4>
          <label class="switch">
            <input type="checkbox" id="ESP32_01_TogLED_01"
onclick="GetTogBtnLEDState('ESP32_01_TogLED_01')">
             <div class="sliderTS"></div>
          </label>
          <h4 class="LEDColor"><i class="fas fa-lightbulb"></i> LED 2</h4>
          <label class="switch">
             <input type="checkbox" id="ESP32_01_TogLED_02"
onclick="GetTogBtnLEDState('ESP32_01_TogLED_02')">
             <div class="sliderTS"></div>
          </label>
          <!--
*********************************************************************** -->
        </div>
        <!--
===================================================================================
==================== -->
      </div>
    </div>
    <br>
    <div class="content">
      <div class="cards">
         <div class="card header" style="border-radius: 15px;">
             <h3 style="font-size: 0.7rem;">LAST TIME RECEIVED DATA FROM ESP32
[ <span id="ESP32_01_LTRD"></span> ]</h3>
             <button onclick="window.open('recordtable.php', '_blank');">Open Record
Table</button>
             <h3 style="font-size: 0.7rem;"></h3>
         </div>
      </div>
    </div>
    <!--
___________________________________________________________________________________
________________________________________________ -->
    <script>
      //------------------------------------------------------------
      document.getElementById("ESP32_01_Temp").innerHTML = "NN";
      document.getElementById("ESP32_01_Humd").innerHTML = "NN";
      document.getElementById("ESP32_01_Status_Read_DHT11").innerHTML = "NN";
      document.getElementById("ESP32_01_LTRD").innerHTML = "NN";
      //------------------------------------------------------------
      Get_Data("esp32_01");
      setInterval(myTimer, 5000);
      //------------------------------------------------------------
      function myTimer() {
        Get_Data("esp32_01");
      }
      //------------------------------------------------------------
      //------------------------------------------------------------
      function Get_Data(id) {
                        if (window.XMLHttpRequest) {
          // code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp = new XMLHttpRequest();
        } else {
           // code for IE6, IE5
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange = function() {
           if (this.readyState == 4 && this.status == 200) {
             const myObj = JSON.parse(this.responseText);
             if (myObj.id == "esp32_01") {
               document.getElementById("ESP32_01_Temp").innerHTML =
myObj.temperature;
               document.getElementById("ESP32_01_Humd").innerHTML = myObj.humidity;
               document.getElementById("ESP32_01_Status_Read_DHT11").innerHTML =
myObj.status_read_sensor_dht11;
               document.getElementById("ESP32_01_LTRD").innerHTML = "Time : " +
myObj.ls_time + " | Date : " + myObj.ls_date + " (dd-mm-yyyy)";
               if (myObj.LED_01 == "ON") {
                 document.getElementById("ESP32_01_TogLED_01").checked = true;
               } else if (myObj.LED_01 == "OFF") {
                 document.getElementById("ESP32_01_TogLED_01").checked = false;
               }
               if (myObj.LED_02 == "ON") {
                 document.getElementById("ESP32_01_TogLED_02").checked = true;
               } else if (myObj.LED_02 == "OFF") {
                 document.getElementById("ESP32_01_TogLED_02").checked = false;
               }
             }
           }
        };
        xmlhttp.open("POST","getdata.php",true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-
urlencoded");
        xmlhttp.send("id="+id);
                   }
      //------------------------------------------------------------
      //------------------------------------------------------------
      function GetTogBtnLEDState(togbtnid) {
        if (togbtnid == "ESP32_01_TogLED_01") {
          var togbtnchecked = document.getElementById(togbtnid).checked;
          var togbtncheckedsend = "";
          if (togbtnchecked == true) togbtncheckedsend = "ON";
          if (togbtnchecked == false) togbtncheckedsend = "OFF";
          Update_LEDs("esp32_01","LED_01",togbtncheckedsend);
        }
        if (togbtnid == "ESP32_01_TogLED_02") {
          var togbtnchecked = document.getElementById(togbtnid).checked;
          var togbtncheckedsend = "";
          if (togbtnchecked == true) togbtncheckedsend = "ON";
          if (togbtnchecked == false) togbtncheckedsend = "OFF";
          Update_LEDs("esp32_01","LED_02",togbtncheckedsend);
        }
      }
      //------------------------------------------------------------
      //------------------------------------------------------------
      function Update_LEDs(id,lednum,ledstate) {
                        if (window.XMLHttpRequest) {
          // code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp = new XMLHttpRequest();
         } else {
           // code for IE6, IE5
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
         }
         xmlhttp.onreadystatechange = function() {
           if (this.readyState == 4 && this.status == 200) {
             //document.getElementById("demo").innerHTML = this.responseText;
           }
         }
         xmlhttp.open("POST","updateLEDs.php",true);
         xmlhttp.setRequestHeader("Content-type", "application/x-www-form-
urlencoded");
         xmlhttp.send("id="+id+"&lednum="+lednum+"&ledstate="+ledstate);
                   }
       //------------------------------------------------------------
     </script>
   </body>
</html>
//
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<
###################################################################################
#########
###################################################################################
#########
###################################################################################
#########
###################################################################################
#########
//
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>> recordtable.php
// PHP/HTML code to display a record table of DHT11 sensor data and LEDs state.
<!DOCTYPE HTML>
<html>
   <head>
     <title>ESP32 WITH MYSQL DATABASE</title>
     <meta name="viewport" content="width=device-width, initial-scale=1">
     <style>
       html {font-family: Arial; display: inline-block; text-align: center;}
       p {font-size: 1.2rem;}
       h4 {font-size: 0.8rem;}
       body {margin: 0;}
       /* ----------------------------------- TOPNAV STYLE */
       .topnav {overflow: hidden; background-color: #0c6980; color: white; font-
size: 1.2rem;}
       /* ----------------------------------- */
      /* ----------------------------------- TABLE STYLE */
      .styled-table {
        border-collapse: collapse;
        margin-left: auto;
        margin-right: auto;
          font-size: 0.9em;
          font-family: sans-serif;
          min-width: 400px;
          box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
          border-radius: 0.5em;
          overflow: hidden;
          width: 90%;
      }
      .styled-table thead tr {
        background-color: #0c6980;
        color: #ffffff;
        text-align: left;
      }
      .styled-table th {
        padding: 12px 15px;
        text-align: left;
      }
      .styled-table td {
        padding: 12px 15px;
        text-align: left;
      }
      .styled-table tbody tr:nth-of-type(even) {
        background-color: #f3f3f3;
      }
      .styled-table tbody tr.active-row {
        font-weight: bold;
        color: #009879;
      }
      .bdr {
        border-right: 1px solid #e3e3e3;
        border-left: 1px solid #e3e3e3;
      }
      td:hover {background-color: rgba(12, 105, 128, 0.21);}
      tr:hover {background-color: rgba(12, 105, 128, 0.15);}
      .styled-table tbody tr:nth-of-type(even):hover {background-color: rgba(12,
105, 128, 0.15);}
      /* ----------------------------------- */
      /* ----------------------------------- BUTTON STYLE */
      .btn-group .button {
        background-color: #0c6980; /* Green */
        border: 1px solid #e3e3e3;
        color: white;
        padding: 5px 8px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 14px;
        cursor: pointer;
        float: center;
      }
      .btn-group .button:not(:last-child) {
        border-right: none; /* Prevent double borders */
      }
      .btn-group .button:hover {
        background-color: #094c5d;
      }
      .btn-group .button:active {
        background-color: #0c6980;
        transform: translateY(1px);
      }
      .btn-group .button:disabled,
      .button.disabled{
        color:#fff;
        background-color: #a0a0a0;
        cursor: not-allowed;
        pointer-events:none;
      }
      /* ----------------------------------- */
    </style>
  </head>
  <body>
    <div class="topnav">
      <h3>ESP32 WITH MYSQL DATABASE</h3>
    </div>
    <br>
    <h3 style="color: #0c6980;">ESP32_01 RECORD DATA TABLE</h3>
    <table class="styled-table" id= "table_id">
      <thead>
        <tr>
          <th>NO</th>
          <th>ID</th>
          <th>BOARD</th>
          <th>TEMPERATURE (°C)</th>
          <th>HUMIDITY (%)</th>
          <th>STATUS READ SENSOR DHT11</th>
          <th>LED 01</th>
          <th>LED 02</th>
          <th>TIME</th>
          <th>DATE (dd-mm-yyyy)</th>
        </tr>
      </thead>
      <tbody id="tbody_table_record">
        <?php
          include 'database.php';
          $num = 0;
          //------------------------------------------------------------ The
process for displaying a record table containing the DHT11 sensor data and the
state of the LEDs.
          $pdo = Database::connect();
          // replace_with_your_table_name, on this project I use the table name
'esp32_table_dht11_leds_record'.
          // This table is used to store and record DHT11 sensor data updated by
ESP32.
           // This table is also used to store and record the state of the LEDs, the
state of the LEDs is controlled from the "home.php" page.
           // To store data, this table is operated with the "INSERT" command, so
this table will contain many rows.
           $sql = 'SELECT * FROM replace_with_your_table_name ORDER BY date, time';
           foreach ($pdo->query($sql) as $row) {
             $date = date_create($row['date']);
             $dateFormat = date_format($date,"d-m-Y");
             $num++;
             echo '<tr>';
             echo '<td>'. $num . '</td>';
             echo '<td class="bdr">'. $row['id'] . '</td>';
             echo '<td class="bdr">'. $row['board'] . '</td>';
             echo '<td class="bdr">'. $row['temperature'] . '</td>';
             echo '<td class="bdr">'. $row['humidity'] . '</td>';
             echo '<td class="bdr">'. $row['status_read_sensor_dht11'] . '</td>';
             echo '<td class="bdr">'. $row['LED_01'] . '</td>';
             echo '<td class="bdr">'. $row['LED_02'] . '</td>';
             echo '<td class="bdr">'. $row['time'] . '</td>';
             echo '<td>'. $dateFormat . '</td>';
             echo '</tr>';
           }
           Database::disconnect();
           //------------------------------------------------------------
        ?>
      </tbody>
    </table>
    <br>
    <div class="btn-group">
      <button class="button" id="btn_prev" onclick="prevPage()">Prev</button>
      <button class="button" id="btn_next" onclick="nextPage()">Next</button>
      <div style="display: inline-block; position:relative; border: 0px solid
#e3e3e3; float: center; margin-left: 2px;;">
        <p style="position:relative; font-size: 14px;"> Table : <span
id="page"></span></p>
      </div>
      <select name="number_of_rows" id="number_of_rows">
        <option value="10">10</option>
        <option value="25">25</option>
        <option value="50">50</option>
        <option value="100">100</option>
      </select>
      <button class="button" id="btn_apply"
onclick="apply_Number_of_Rows()">Apply</button>
    </div>
    <br>
    <script>
      //------------------------------------------------------------
      var current_page = 1;
      var records_per_page = 10;
      var l = document.getElementById("table_id").rows.length
      //------------------------------------------------------------
      //------------------------------------------------------------
      function apply_Number_of_Rows() {
        var x = document.getElementById("number_of_rows").value;
        records_per_page = x;
        changePage(current_page);
      }
      //------------------------------------------------------------
      //------------------------------------------------------------
      function prevPage() {
        if (current_page > 1) {
            current_page--;
            changePage(current_page);
        }
      }
      //------------------------------------------------------------
      //------------------------------------------------------------
      function nextPage() {
        if (current_page < numPages()) {
            current_page++;
            changePage(current_page);
        }
      }
      //------------------------------------------------------------
      //------------------------------------------------------------
      function changePage(page) {
        var btn_next = document.getElementById("btn_next");
        var btn_prev = document.getElementById("btn_prev");
        var listing_table = document.getElementById("table_id");
        var page_span = document.getElementById("page");
        // Validate page
        if (page < 1) page = 1;
        if (page > numPages()) page = numPages();
        [...listing_table.getElementsByTagName('tr')].forEach((tr)=>{
            tr.style.display='none'; // reset all to not display
        });
        listing_table.rows[0].style.display = ""; // display the title row
        for (var i = (page-1) * records_per_page + 1; i < (page * records_per_page)
+ 1; i++) {
          if (listing_table.rows[i]) {
            listing_table.rows[i].style.display = ""
          } else {
            continue;
          }
        }
        page_span.innerHTML = page + "/" + numPages() + " (Total Number of Rows = "
+ (l-1) + ") | Number of Rows : ";
        if (page == 0 && numPages() == 0) {
          btn_prev.disabled = true;
          btn_next.disabled = true;
          return;
        }
        if (page == 1) {
          btn_prev.disabled = true;
        } else {
          btn_prev.disabled = false;
        }
        if (page == numPages()) {
          btn_next.disabled = true;
        } else {
          btn_next.disabled = false;
        }
      }
      //------------------------------------------------------------
      //------------------------------------------------------------
      function numPages() {
        return Math.ceil((l - 1) / records_per_page);
      }
      //------------------------------------------------------------
       //------------------------------------------------------------
       window.onload = function() {
          var x = document.getElementById("number_of_rows").value;
          records_per_page = x;
          changePage(current_page);
       };
       //------------------------------------------------------------
     </script>
   </body>
</html>
//
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<