標籤

bat (54) 作品 (41) python (24) shell (17) windows (11) 虛擬機 (11) php (10) CPP (6) KMS (6) 程式設計 (6) docker (5) 使用教學 (5) xoops (4) 公文 (4) Apache2 (3) Excel (3) juniper (3) 資料庫 (3) 轉檔 (3) mysql (2) 免動手 (2) 資料結構 (2) 軟體廣播 (2) 電腦維修 (2) Android Studio (1) Apple IPAD管理 (1) Arduino (1) CSS (1) LAMP (1) NAS (1) Ubuntu (1) VHD (1) Windows Server (1) 原因 (1) 程式應用 (1) 程式積木 (1) 編輯器 (1) 雲端硬碟 (1)

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;
}

?>











 

沒有留言:

張貼留言

只要點兩下,就能夠將InputAndOutput資料夾底下的子子孫孫資料夾內所有Word通通轉成PDF

  系列文章: 1. 只要點兩下,就能將一堆的Doc與Docx 轉成 PDF 1. https://skjhcreator.blogspot.com/2023/05/docdocx-pdf.html 2. 只要點兩下,就能將一堆的JPG轉成一個PDF,並以JPG所在的資料夾名稱為...