2021年3月3日 星期三

紀明村老師的運動檢錄系統程式碼研究心得(一)介接CloudSchool與mysql資料庫

整理:
1.只要會用滑鼠點兩下,用shell 在 ubuntu 16.04 x64 桌面版本快速安裝 運動檢錄系統
https://skjhcreator.blogspot.com/2021/03/shell-ubuntu-1604-x64.html
2.紀明村老師運動會競賽檢錄系統更新模組_學生帳號管理模組
https://skjhcreator.blogspot.com/2021/03/blog-post.html
3.二林國小紀明村老師的二林網管 PDO + SQLite 程式寫作工具箱2014.07
https://skjhcreator.blogspot.com/2021/03/pdo-sqlite-201407.html
4.用shell 在CentOS 7 minimal 64位元 安裝 紀明村老師的運動會檢錄系統
https://skjhcreator.blogspot.com/2021/02/shell-centos-7-minimal-64.html
5.紀明村老師的運動檢錄系統程式碼研究心得(一)介接CloudSchool與mysql資料庫
https://skjhcreator.blogspot.com/2021/03/cloudschoolmysql.html
6.紀明村老師運動檢錄系統程式碼研究心得(二)登入login登出logout與使用者認證
https://skjhcreator.blogspot.com/2021/02/loginlogout.html
7.紀明村老師運動檢錄系統程式碼研究心得(三)smarty
https://skjhcreator.blogspot.com/2021/02/smarty.html



        現在研究紀老師的運動檢錄系統程式碼,心中湧起幾個問題。希望能藉由原始碼解決心中的疑惑。由於紀老師使用Sqlite,但內容也有mysql pdo的語法。因此,希望能改寫成mysql的語法。
1.安裝mysql
$sudo apt-get install mysql-server -y
$sudo apt-get install mysql-client -y
$sudo apt-get install libmysqlclient-dev -y

2.安裝phpmyadmin
$sudo apt-get install phpmyadmin -y

一、如何跟CloudSchool的API介接?
       2.介接之後,要如何處理資料?

檔案名稱:ApiGetData.php
檔案內容:
<?php
// 3.雲端學籍系統內,學校的 API ID
$API_client_id = '學校的 API ID';

// 4.雲端學籍系統內,學校的 API 密碼
$API_client_secret = '學校的 API 密碼';

//取得API資料
$GetApiData = elps_API();

//印出API資料
PP($GetApiData);

function elps_API(){
global $API_client_id,$API_client_secret;

// =================================================
//    學生榮譽榜 (url: https://api.chc.edu.tw)
//    校務佈告欄 (url: https://api.chc.edu.tw/school-news)
//    同步學期資料 (url: https://api.chc.edu.tw/semester-data)
//    更改師生密碼 (url: https://api.chc.edu.tw/change-password)

// API NAME
$api_name = '/semester-data';
//$api_name = '/school-news';
// 更改師生密碼 (url: https://api.chc.edu.tw/change-password)

// API URL
$api_url = 'https://api.chc.edu.tw';
//: https://api.chc.edu.tw/school-news
// 建立 CURL 連線
$ch = curl_init();
// 取 access token
curl_setopt($ch, CURLOPT_URL, $api_url."/oauth?authorize");
// 設定擷取的URL網址
curl_setopt($ch, CURLOPT_POST, TRUE);
// the variable
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'client_id' => $API_client_id,
'client_secret' => $API_client_secret,
'grant_type' => 'client_credentials'
));

$data = curl_exec($ch);
$data = json_decode($data);

$access_token = $data->access_token;
$authorization = "Authorization: Bearer ".$access_token;

curl_setopt($ch, CURLOPT_URL, $api_url.$api_name);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization )); // **Inject Token into Header**
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
return $result;
}
/* 列印變數*/
function PP($a){
echo "<pre>";print_r($a);
echo "</pre>";exit;
}

?>
若不在學校IP範圍內,則打開瀏覽器,測試ApiGetData.php。會出現此訊息如下:
若在學校IP範圍內,則打開瀏覽器,測試ApiGetData.php。會出現此訊息如下:
則會取得資料。

       2.介接之後,要如何處理資料?
          (1).檢查指定的檔案是否存在?
          (1).Y. 檔案存在,則取檔案資料
          (1).N.檔案不存在,則將取得的資料存入檔案
檔案名稱:ApiGetData2File.php
檔案內容:
<?php
// 3.雲端學籍系統內,學校的 API ID
$API_client_id = '學校的 API ID';

// 4.雲端學籍系統內,學校的 API 密碼
$API_client_secret = '學校的 API 密碼';

// 5.可寫入目錄(放置資料庫檔及暫存區用),建議搬至網頁目錄外
define('__SiteData', dirname(__file__).'/Sport_data/');
// define('__SiteData', '/home/webadmin/sport_data/');
// define('__SiteData', '/home/stu/data/');

//取得API資料
$GetApiData = API_data();

//印出API資料
PP($GetApiData);


function elps_API(){
global $API_client_id,$API_client_secret;

// =================================================
//    學生榮譽榜 (url: https://api.chc.edu.tw)
//    校務佈告欄 (url: https://api.chc.edu.tw/school-news)
//    同步學期資料 (url: https://api.chc.edu.tw/semester-data)
//    更改師生密碼 (url: https://api.chc.edu.tw/change-password)

// API NAME
$api_name = '/semester-data';
//$api_name = '/school-news';
// 更改師生密碼 (url: https://api.chc.edu.tw/change-password)

// API URL
$api_url = 'https://api.chc.edu.tw';
//: https://api.chc.edu.tw/school-news
// 建立 CURL 連線
$ch = curl_init();
// 取 access token
curl_setopt($ch, CURLOPT_URL, $api_url."/oauth?authorize");
// 設定擷取的URL網址
curl_setopt($ch, CURLOPT_POST, TRUE);
// the variable
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'client_id' => $API_client_id,
'client_secret' => $API_client_secret,
'grant_type' => 'client_credentials'
));

$data = curl_exec($ch);
$data = json_decode($data);

$access_token = $data->access_token;
$authorization = "Authorization: Bearer ".$access_token;

curl_setopt($ch, CURLOPT_URL, $api_url.$api_name);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization )); // **Inject Token into Header**
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
return $result;
}

/* 7.更新處理函式  */
function API_data(){
                //所在的目錄__SiteData及檔案名稱為date("Y").'_elps.txt'
$file = __SiteData.date("Y").'_elps.txt';
//echo $file;
if (file_exists($file)) {
$sch_json=file_get_contents($file);
}else{
$sch_json=elps_API();
$num=file_put_contents($file,$sch_json);//寫入echo $num;
}
$arr = json_decode($sch_json);
return $arr;
}

/*自動建立目錄*/
function autoDir($dir){
//echo $dir.'<br>';
if (file_exists($dir) && is_dir($dir)) return ;
    $rs = @mkdir($dir, 0755); 
if (!$rs) backe($dir."<br>資料存放區不存在或無法建立!");
}

/* 列印變數*/
function PP($a){
echo "<pre>";print_r($a);
echo "</pre>";exit;
}

##################回上頁函式1#####################
function backe($value= "BACK"){
//echo head();
echo  "<meta charset='UTF-8'><br><br><CENTER>";
echo "<h4>--== 《系統訊息》 ==--</h4>";
echo "<div align=center onclick='history.back();' style='font-size:12pt;color:#A52A2A;'><b>";
echo $value;
echo "</b><BR></div><h5 onclick='history.back();'>--==  《按下後返回》 ==--</h5>";
exit;
}

?>

二、介接之後,如何取得的資料存入資料庫中?
   1.如何用pdo建立資料庫?
   2.如何用pdo建立資料表?
   3.介接cloudschool之後,取得的資料,如何存入資料表內?
   
資料表stud

   1.如何用pdo建立資料庫?
檔案名稱:PdoCreateDatabase.php
檔案內容:
<?php
$school_code='教育部學校代碼';
$MySQL['Host']='localhost';
$MySQL['User']='資料庫使用者';
$MySQL['Pass']='資料庫密碼';
$MySQL['Db']='Sport109_'.$school_code;
try {
//建立資料庫
    $CONN =new PDO('mysql:host='.$MySQL['Host'], $MySQL['User'] ,$MySQL['Pass']);
    $SQL="CREATE DATABASE".$MySQL['Db']."CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;";
    $CONN->exec($SQL) or die($SQL);
    backe("!!資料庫 ".$MySQL['Db']." OK!!");
 }
 catch (Exception $e) 
 {
       backe("!!無法連結資料庫!!");
       //die("<center><h2>無法連結資料庫</h2></center>");

##################回上頁函式1#####################
function backe($value= "BACK"){
//echo head();
echo  "<meta charset='UTF-8'><br><br><CENTER>";
echo "<h4>--== 《系統訊息》 ==--</h4>";
echo "<div align=center onclick='history.back();' style='font-size:12pt;color:#A52A2A;'><b>";
echo $value;
echo "</b><BR></div><h5 onclick='history.back();'>--==  《按下後返回》 ==--</h5>";
exit;
}
?>

     2.如何用pdo建立資料表?
       (1).先檢查是否可從資料表取出一筆資料?
       (1).Y.取得出,表示有此資料表->不建立資料表
       (1).N.取不出,表示無此資料表->建立資料表
檔案名稱:PdoCreateTable.php
檔案內容:
<?php
$school_code='教育部學校代碼';
$MySQL['Host']='localhost';
$MySQL['User']='資料庫使用者';
$MySQL['Pass']='資料庫密碼';
$MySQL['Db']='Sport109_'.$school_code;

/*建立連結*/
try {
// for MySQL
$CONN =new PDO('mysql:host='.$MySQL['Host'].';dbname='.$MySQL['Db'], $MySQL['User'],$MySQL['Pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"));
    }
catch (Exception $e) 
    {
       backe("!!無法連結資料庫!!");
       //die("<center><h2>無法連結資料庫</h2></center>");
 }
/* 建立 stud 資料表*/
        $SQL1="select * from `stud` limit 1";
        $SQL2="CREATE TABLE `stud`(
                      `id` INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                      `stuid` VARCHAR(10) NOT NULL UNIQUE,
                      `stuname` TEXT NOT NULL,
                      `idclass` TEXT NOT NULL,
                      `cla` TEXT NOT NULL,
                      `seatnum` INT(10) DEFAULT '0',
                      `sex` TEXT NOT NULL,
                      `edukey` TEXT,
                      `created` TEXT,
                      `modify` TEXT
                      );";
                $rs=$CONN->query($SQL1);
                if (!$rs) {
                        $rs=$CONN->query($SQL2) or die($SQL2);
                } else {
                        backe('Had stud 資料表!');
                }
##################回上頁函式1#####################
function backe($value= "BACK"){
//echo head();
echo  "<meta charset='UTF-8'><br><br><CENTER>";
echo "<h4>--== 《系統訊息》 ==--</h4>";
echo "<div align=center onclick='history.back();' style='font-size:12pt;color:#A52A2A;'><b>";
echo $value;
echo "</b><BR></div><h5 onclick='history.back();'>--==  《按下後返回》 ==--</h5>";
exit;
}

?>

需要注意的是,同樣是建立資料表stud,建立資料表的語法會有些微不同
MYSQL語法:
CREATE TABLE `stud`(
  `id` INTEGER AUTO_INCREMENT PRIMARY KEY,
  `stuid` VARCHAR(20) NOT NULL UNIQUE,
  `stuname` TEXT NOT NULL,
  `idclass` TEXT NOT NULL,
  `cla` TEXT NOT NULL,
  `seatnum` INTEGER DEFAULT '0',
  `sex` TEXT NOT NULL,
  `edukey` TEXT,
  `created` TEXT,
  `modify` TEXT
);

Sqlite語法:
CREATE TABLE `stud`(
  `id` INTEGER AUTO_INCREMENT PRIMARY KEY,
  `stuid` TEXT NOT NULL UNIQUE,
  `stuname` TEXT NOT NULL,
  `idclass` TEXT NOT NULL,
  `cla` TEXT NOT NULL,
  `seatnum` INTEGER DEFAULT '0',
  `sex` TEXT NOT NULL,
  `edukey` TEXT,
  `created` TEXT,
  `modify` TEXT
);
    
   3.介接cloudschool之後,取得的資料,如何存入資料表內?
      (1).在已建立資料庫、資料表,只剩下將取得的資料,存入資料表前提下。
      (2).在建立資料庫之後。需建立資料表,並將取得的資料,存入資料表前提下。

      (1).在已建立資料庫、資料表,只剩下將取得的資料,存入資料表前提下。
檔案名稱:ApiData2Table01.php
檔案內容:
<?php
$school_code='教育部學校代碼';
$MySQL['Host']='localhost';
$MySQL['User']='資料庫使用者';
$MySQL['Pass']='資料庫密碼';
$MySQL['Db']='Sport109_'.$school_code;

// 5.可寫入目錄(放置資料庫檔及暫存區用),建議搬至網頁目錄外
define('__SiteData', dirname(__file__).'/Sport_data/');
// define('__SiteData', '/home/webadmin/sport_data/');
// define('__SiteData', '/home/stu/data/');

/*建立連結*/
try {
// for MySQL
$CONN =new PDO('mysql:host='.$MySQL['Host'].';dbname='.$MySQL['Db'], $MySQL['User'],$MySQL['Pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"));
    }
catch (Exception $e) 
    {
       backe("!!無法連結資料庫!!");
       //die("<center><h2>無法連結資料庫</h2></center>");
 }

//取得API資料
$arr=API_data();

//PP($arr);
//將取得的資料,存入資料表
add_stud($arr);

/* 7.更新處理函式  */
function API_data(){
                //所在的目錄__SiteData及檔案名稱為date("Y").'_elps.txt'
$file = __SiteData.date("Y").'_elps.txt';
//echo $file;
if (file_exists($file)) {
$sch_json=file_get_contents($file);
}else{
//$sch_json=elps_API();
//$num=file_put_contents($file,$sch_json);//寫入echo $num;
}
$arr = json_decode($sch_json);
return $arr;
}

/*加入學生資料*/
function add_stud($arr){
if (!isset($arr->學期編班)) return ;
foreach($arr->學期編班 as $obj){
/* 判斷有沒有學生 */
if (isset($obj->學期編班)) {
//echo $obj->年級.'-'.$obj->班序.'人數'.count($obj->學期編班).'<br>';
foreach($obj->學期編班 as $ary){
$created=date("Y-d-m H:i:s");
$stuid=$ary->學號;
$seatnum=$ary->座號;
$stuname=$ary->姓名;
$sex=$ary->性別;
$edukey=$ary->身分證編碼;
$cla=$obj->年級.'_'.$obj->班序;
$idclass=$obj->年級.sprintf("%02d",$obj->班序).sprintf("%02d",$ary->座號);
$SQL="INSERT INTO `stud` (stuid , stuname , idclass , cla , seatnum , sex , edukey , created) values ('{$stuid}' ,'{$stuname}' ,'{$idclass}' ,'{$cla}' ,'{$seatnum}' ,'{$sex}' ,'{$edukey}' ,'{$created}')";
//echo $SQL."<br>";
$rs=$CONN->query($SQL);// or die($SQL);
}
}
}
}

/* 列印變數*/
function PP($a){
echo "<pre>";print_r($a);
echo "</pre>";exit;
}

?>

      (2).在建立資料庫之後。需建立資料表,並將取得的資料,存入資料表前提下。
檔案名稱:ApiData2Table02.php
檔案內容:
<?php
$school_code='教育部學校代碼';
$MySQL['Host']='localhost';
$MySQL['User']='資料庫使用者';
$MySQL['Pass']='資料庫密碼';
$MySQL['Db']='Sport109_'.$school_code;

// 3.雲端學籍系統內,學校的 API ID
$API_client_id = '學校的 API ID';

// 4.雲端學籍系統內,學校的 API 密碼
$API_client_secret = '學校的 API 密碼';

// 5.可寫入目錄(放置資料庫檔及暫存區用),建議搬至網頁目錄外
define('__SiteData', dirname(__file__).'/Sport_data/');
// define('__SiteData', '/home/webadmin/sport_data/');
// define('__SiteData', '/home/stu/data/');

/*建立連結*/
try {
// for MySQL
$CONN =new PDO('mysql:host='.$MySQL['Host'].';dbname='.$MySQL['Db'], $MySQL['User'],$MySQL['Pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"));
    }
catch (Exception $e) 
    {
       backe("!!無法連結資料庫!!");
       //die("<center><h2>無法連結資料庫</h2></center>");
 }

/* 建立 stud 資料表*/
        $SQL1="select * from `stud` limit 1";
        $SQL2="CREATE TABLE `stud`(
                      `id` INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                      `stuid` VARCHAR(10) NOT NULL UNIQUE,
                      `stuname` TEXT NOT NULL,
                      `idclass` TEXT NOT NULL,
                      `cla` TEXT NOT NULL,
                      `seatnum` INT(10) DEFAULT '0',
                      `sex` TEXT NOT NULL,
                      `edukey` TEXT,
                      `created` TEXT,
                      `modify` TEXT
                      );";
                $rs=$CONN->query($SQL1);
                if (!$rs) {
                        //建立資料表stud
                        $rs=$CONN->query($SQL2) or die($SQL2);
                         //取得API資料
                         $arr=API_data();
                         //將取得的資料,存入資料表
                         add_stud($arr);
                         backe('資料表建立OK! API資料存入資料表!');
                } else {
                        //取得API資料
                         $arr=API_data();
                         //將取得的資料,存入資料表
                         add_stud($arr);
                        backe('已有資料表!API資料存入資料表!');
                }

function elps_API(){
global $API_client_id,$API_client_secret;

// =================================================
//    學生榮譽榜 (url: https://api.chc.edu.tw)
//    校務佈告欄 (url: https://api.chc.edu.tw/school-news)
//    同步學期資料 (url: https://api.chc.edu.tw/semester-data)
//    更改師生密碼 (url: https://api.chc.edu.tw/change-password)

// API NAME
$api_name = '/semester-data';
//$api_name = '/school-news';
// 更改師生密碼 (url: https://api.chc.edu.tw/change-password)

// API URL
$api_url = 'https://api.chc.edu.tw';
//: https://api.chc.edu.tw/school-news
// 建立 CURL 連線
$ch = curl_init();
// 取 access token
curl_setopt($ch, CURLOPT_URL, $api_url."/oauth?authorize");
// 設定擷取的URL網址
curl_setopt($ch, CURLOPT_POST, TRUE);
// the variable
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'client_id' => $API_client_id,
'client_secret' => $API_client_secret,
'grant_type' => 'client_credentials'
));

$data = curl_exec($ch);
$data = json_decode($data);

$access_token = $data->access_token;
$authorization = "Authorization: Bearer ".$access_token;

curl_setopt($ch, CURLOPT_URL, $api_url.$api_name);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization )); // **Inject Token into Header**
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
return $result;
}

/* 7.更新處理函式  */
function API_data(){
                //所在的目錄__SiteData及檔案名稱為date("Y").'_elps.txt'
$file = __SiteData.date("Y").'_elps.txt';
//echo $file;
if (file_exists($file)) {
$sch_json=file_get_contents($file);
}else{
$sch_json=elps_API();
$num=file_put_contents($file,$sch_json);//寫入echo $num;
}
$arr = json_decode($sch_json);
return $arr;
}

/*加入學生資料*/
function add_stud($arr){
if (!isset($arr->學期編班)) return ;
foreach($arr->學期編班 as $obj){
/* 判斷有沒有學生 */
if (isset($obj->學期編班)) {
//echo $obj->年級.'-'.$obj->班序.'人數'.count($obj->學期編班).'<br>';
foreach($obj->學期編班 as $ary){
$created=date("Y-d-m H:i:s");
$stuid=$ary->學號;
$seatnum=$ary->座號;
$stuname=$ary->姓名;
$sex=$ary->性別;
$edukey=$ary->身分證編碼;
$cla=$obj->年級.'_'.$obj->班序;
$idclass=$obj->年級.sprintf("%02d",$obj->班序).sprintf("%02d",$ary->座號);
$SQL="INSERT INTO `stud` (stuid , stuname , idclass , cla , seatnum , sex , edukey , created) values ('{$stuid}' ,'{$stuname}' ,'{$idclass}' ,'{$cla}' ,'{$seatnum}' ,'{$sex}' ,'{$edukey}' ,'{$created}')";
//echo $SQL."<br>";
$rs=$CONN->query($SQL);// or die($SQL);
}
}
}
}

/* 列印變數*/
function PP($a){
echo "<pre>";print_r($a);
echo "</pre>";exit;
}

##################回上頁函式1#####################
function backe($value= "BACK"){
//echo head();
echo  "<meta charset='UTF-8'><br><br><CENTER>";
echo "<h4>--== 《系統訊息》 ==--</h4>";
echo "<div align=center onclick='history.back();' style='font-size:12pt;color:#A52A2A;'><b>";
echo $value;
echo "</b><BR></div><h5 onclick='history.back();'>--==  《按下後返回》 ==--</h5>";
exit;
}

?>











 

沒有留言:

張貼留言

laravel 資料庫資料填充工廠入門

相關系列文章: 1. 在 windows 10 安裝 laravel 12 studentManagement環境與設定 2. laravel 12 route 路由 3. laravel 12 Blade Templates 網頁模版 4. laravel 12 Control...