2021年4月17日 星期六

PHP 操作 MySQL 資料庫

設定目標:
  • 使用 php 程式語言操作資料庫系統!
  • 本練習將利用 Docker ,啟動 nginx + PHP 網站執行環境
  • 本練習將利用 Docker ,啟動 mysql 網站執行環境

PHP 連結 MySQL 資料庫
  1. 利用 Docker,開啟 php-nginx 以及 mysql 兩個容器!
    docker run --name nginx -d -p 443:443 -v c:\workspace\phpexercise:/app php-nginx
    docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Hello123 mysql:latest
    
  2. 登入 mysql 容器,進行帳號密碼設定:
    docker exec -it mysql bash
    mysql -u root -p
    CREATE USER 'root'@'%' IDENTIFIED by 'Hello123';
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Hello123';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
    FLUSH PRIVILEGES;
    exit
    exit
    
  3. 遠端登入 MySQL ,建立使用者帳號、密碼,以及建立資料庫與授權!
    mysql -u root -h 10.1.1.32 -p
    CREATE USER 'peter'@'%' IDENTIFIED by 'World123';
    ALTER USER 'peter'@'%' IDENTIFIED WITH mysql_native_password BY 'World123';
    CREATE DATABASE hello;
    GRANT ALL PRIVILEGES ON hello.* TO 'peter'@'%';
    FLUSH PRIVILEGES;
    exit
    
  4. 利用新建立的帳號,建立一個資料表:
    mysql -u peter -h 10.1.1.32 -p
    use hello;
    CREATE TABLE connects (
        id INTEGER PRIMARY KEY,
        name VARCHAR(150),
        email VARCHAR(150),
        phone VARCHAR(20)
        ) ENGINE=InnoDB;
    show columns from connects;
    exit
    
  5. 測試連線是否正常:connections.php
    <?php
    //測試連線是否正常
    try {

    $db = new PDO('mysql:host=10.1.1.32;dbname=hello','peter','World123');
    if (isset($db)) printf("Connection Success");
    } catch(PDOException $e) {
    printf("Could not connect to the database: %s ",$e->getMessage());
    }
    ?>
PHP 操作 MySQL 資料庫資料內容
  • 新增資料至 connects 資料表:
    1. 建立表單檔案:hello.htm
      <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      </head>
      <body>
      <form action="hello.php" method="post">
      <label for="id">ID:</label>
      <input type="text" name="id"><br>
      <label for="name">Name:</label>
      <input type="text" name="name"><br>
      <label for="email">Email:</label>
      <input type="text" name="email"><br>
      <label for="phone">Phone Number:</label>
      <input type="text" name="phone"><br>
      <input type="submit" value="submit">
      <input type="reset" value="reset">
      </form>
      </body>
      </html>
    2. 建立新增資料檔案 hello.php
      <?php

      require_once "connections.php";

      $id = intval(trim($_POST['id']));
      $name = trim($_POST['name']);
      $email = trim($_POST['email']);
      $phone = trim($_POST['phone']);

      printf($id.$name.$email.$phone);

      try {
      $runSQL = $db->prepare('INSERT INTO connects(id,name,email,phone) VALUES (?,?,?,?)');
      $runSQL->execute(array($id,$name,$email,$phone));
      $runSQL->fetchAll();
      printf ("Insert data success ...");

      } catch (PDOException $e2) {
      printf("Could not connect to the database: %s ",$e2->getMessage());
      }


      ?>
  • 查詢資料方式
    1. 新增查詢資料檔案:lists.php
      <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      </head>
      <body>
      <table border="1">
      <tr>
      <th>ID</th>
      <th>Name</th>
      <th>Email</th>
      <th>Phone</th>
      </tr>
      <?php

      require_once "connections.php";

      $runSQL = $db->prepare("SELECT * FROM connects;");
      $runSQL->execute();
      printf("<tr>");
      while ($row = $runSQL->fetch()){
      printf("<td>%d</td>",$row[0]);
      printf("<td>%s</td>",$row[1]);
      printf("<td>%s</td>",$row[2]);
      printf("<td>%s</td>",$row[3]);
      }
      printf("</tr>");
      ?>

      </table>

      </body>
      </html>
  • 修改資料內容:
    1. 新增修改內容的表單:modify.html
      <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Modify Data</title>
      </head>
      <body>
      <form action="modify.php" method="POST">
      <label for="">指定姓名:</label>
      <input type="text" name="name"><br>
      <label for="">修改電話:</label>
      <input type="text" name="phone"><br>
      <label for="">修改 E-mail:</label>
      <input type="text" name="email"><br>
      <input type="submit" value="Submit"><input type="reset" value="Reset">
      </form>
      </body>
      </html>
    2. 新增修改內容的程式:modify.php
      <?php
      require_once "connections.php";

      if (is_null($_POST['name'])){
      echo "<script>alert('退出!');history.back();</script>";
      }
      if (!(is_null($_POST['phone']))){
      $phone = trim($_POST['phone']);
      $name = trim($_POST['name']);
      $runSQL = $db->prepare("UPDATE connects SET phone = ? where name = ?;");
      $runSQL->execute(array($phone,$name));
      }

      if (!(is_null($_POST['email']))){
      $email = trim($_POST['email']);
      $name = trim($_POST['name']);
      $runSQL = $db->prepare("UPDATE connects SET email = ? where name = ?;");
      $runSQL->execute(array($phone,$name));
      }
      echo "<script>alert('退出!');history.back();</script>";
      ?>
  • 刪除資料內容:
    1. 新增刪除內容的表單:del.html
      <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      </head>
      <body>
      <form action="del.php" method="POST">
      <label for="">指定姓名:</label>
      <input type="text" name="name"><br>
      <input type="submit" value="Submit"><input type="reset" value="Reset">
      </form>
      </body>
      </html>
    2. 新增刪除內容的程式:del.php
      <?php
      require_once "connections.php";

      if (is_null($_POST['name'])){
      echo "<script>alert('退出!');history.back();</script>";
      } else {

      $name = trim($_POST['name']);
      $runSQL = $db->prepare("DELETE FROM connects where name = ?;");
      $runSQL->execute(array($name));
      }

      echo "<script>alert('退出!');history.back();</script>";


      ?>

在 Windows 10 上,利用 Docker 建立 PHP 網站執行環境

設定目標:
  • 利用 Docker ,啟動 nginx + PHP 網站執行環境
  • 利用 Docker ,啟動 mysql 網站執行環境

啟動 nginx + PHP 網站執行環境
  1. 開啟 Windows Power Shell
  2. 在 Power Shell 視窗中,執行 docker 指令:
    docker pull webdevops/php-nginx
    
  3. 開啟桌面上的 Docker Desktop
  4. 選擇左上方的 images
  5. 選擇右方的「run」
  6. 選擇下拉「Optional Settings」
  7. 依序填入對應的資料內容,再按下「run」:
  8. 正常結束後的畫面:

2021年4月15日 星期四

PHP 處理 CSV 檔案內容

設定目標:
  • 了解 PHP 處理 CSV 檔案的方法

PHP 處理CSV檔案
  1. 範例用的檔案內容:email.csv
    "hello@test.com",5,10,2010,100
    "test@hello.com",6,20,2021,200
    
  2. 讀取資料:readcsv.php
    <?php
    //開啟 CSV 檔案
    $csv = fopen('email.csv','rb');

    //列出檔案內容
    while ((! feof($csv)) && ($line = fgetcsv($csv))){
    printf("信箱名稱:%s ",$line[0]);
    printf("建立時間:%d/%d/%d ",$line[3],$line[1],$line[2]);
    printf("年費: %d ",$line[4]);
    printf("\n");
    }

    //關閉檔案
    fclose($csv);
    ?>
  3. 寫入資料: write.php
    <?php
    //開啟檔案,設定成寫入權限
    $csv = fopen("email2.csv",'wb');

    //設定寫入的資料
    $line = array("testhello@example.com",7,21,2021,300);

    //寫入檔案中
    fputcsv($csv,$line);
    print("寫入完成!");
    ?>
  4. 輸出至瀏覽器:tobrowser.php
    <?php
    //通知瀏覽器準備讀取 CSV 檔案
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="email.csv"');

    //開啟 CSV 檔案
    $lines = fopen('email.csv','rb');

    //開啟檔案,做為輸出串流
    $csv = fopen('php://output','wb');

    //輸出內容
    while ((! feof($lines)) && ($line = fgetcsv($lines))){
    fputcsv($csv,$line);
    }
    ?>
  5. 有關 CSV 檔案,可參考更進階的套件:PHPOffice PHPExcel 套件!

2021年4月3日 星期六

在 CentOS / RHEL 8 上,安裝 Laravel 開發環境!

設定目標:
  • 在 CentOS / RHEL 8 上,安裝 Laravel 開發環境!

安裝流程
  1. 安裝 PHP 套件
    # dnf -y module reset php
    # dnf module enable php:7.4
    # dnf module install php
    
  2. 切換至資料夾 /opt
    # cd /opt
    
  3. 安裝 Composer!由 Composer 官網下載檔案,並執行安裝過程:
    # php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    # php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
    # php composer-setup.php
    # php -r "unlink('composer-setup.php');"
    
  4. 移動 composer.phar 至 /sbin/composer
    # mv composer.phar /sbin/composer
    
  5. 利用 composer 建立 Laravel 專案
    # composer create-project --prefer-dist laravel/laravel phpproject
    
  6. 啟動測試:
    # cd phpproject
    # php artisan serve