跳到主要內容

發表文章

目前顯示的是有「PHP」標籤的文章

PHP 輸出 UTF-8 編碼 CSV 檔案

使用 PHP 直接輸出 UTF-8 編碼的 CSV 檔案匯入 EXCEL 會變成亂碼,需要在檔頭加入 BOM 指引碼,EXCEL才會正確讀取內容。 主要是最近寫 CI4 的系統會遇到 composer phpoffice 發生錯誤,所以不能使用 phpoffice 來匯出檔案。查詢了一些資料,用 PHP 直接把資料用 CSV 格式匯出來。 程式片段             $rows = ['學期序',…];              header('Content-type: text/csv; charset=UTF-8');             header('Content-Disposition: attachment; filename=' . $this->nowparam['semestername'] . 'csv');             $output = fopen('php://output', 'w');             fwrite($output, "\xEF\xBB\xBF");             fwrite($output, '"' . implode('","', $rows) . "\"\n");             foreach($data as $tmp){                 fwrite($output, '"' . $tmp['semester'] . '",');                 …             ...

PhpSpreadsheet 從 Cell 中取值的注意事項

最近在做一個報名系統,需要開放由 Excel 格式報名表上傳報名資料。這項技術之前已有在別的系統上實作過了,是使用 \PhpOffice\PhpSpreadsheet 套件處理上傳的 Excel 檔案,所以把舊的程式套用過來修改即可。 但是在測試的時候,發現部份欄位取值後的資料有問題,一查原來是 Excel 儲存格(Cell)中有設定格式,此時這個儲存格變成 Richtext Cell,在 PhpSpreadsheet 中用 getValue() 取值時,會取出一堆格式的資訊。 在查閱了一些資料後,似乎沒有一個萬用的取值函數,必須要判斷取出的資料是否為 Richtext,若是 Richtext 格式,需要再用 getPlaintext() 函數去把文字內容取出。 如此,在取出每一個儲存格內容後,都有用一個 if 來判斷取出的資料類型後再處理,真的有夠麻煩。還好這次系統要取的欄位沒有很多,萬一未來遇到很多的資料時,一堆 IF 一定會 keyin 在累死,而且程式執行效率也一定會變慢。 有空再來研究看看,有沒有比較省力的方法吧。

手工 PHP CSRF 實作

現在自己寫程式都已經使用 CodeIgniter4 的 PHP 套件,系統會自動使用資安防護機制,如網路表單會使用 CSRF (cross-site request forgery)的機制保護,以防止不合法的資料輸入或程式機器人入侵。 但在之前未使用 CI4 之前的程式,如果要防止相關資訊安全漏洞的話,必要自己手工增加 CSRF 防護。 CSRF 產生: $_SESSION['token'] = md5(uniqid(mt_rand(), true)); 在表單添加 CSRF 隱藏欄位: <input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?? '' ?>"> 在後續程序驗證 CSRF: $token = filter_input(INPUT_POST, 'token', FILTER_SANITIZE_STRING); if (!$token || $token !== $_SESSION['token']) {     // return 405 http status code     header($_SERVER['SERVER_PROTOCOL'] . ' 405 Method Not Allowed');     exit; } else {     // process the form }

CodeIgniter4 使用 Firebase 進行認證

  前置動作 完成 Firebase 專案設定,並新增好使用的應用程式(必須是網頁程式</>) 產生並下載保存服務帳號金鑰檔案(JSON) 備註:此金鑰JSON檔只能產生一次,若再次點選產生金鑰會產出另一份金鑰內容 安裝 在 CodeIgniter4 專案中安裝 firebase-php: composer require " kreait/firebase-php:^7.0 " 備註:firebase-php 7.0 僅支援 php 8,所以如果使用 php 其他版本就不要加上最後面的 :^7.0,composer 會自動使用 6.9 版 將服務帳號金鑰JSON檔案置於網站系統內,例如將json檔置於網站的/cert資料夾中 設定 在 .env 檔案中加入金鑰檔案的路徑 以 javascript 進行認證服務 登入頁製作 網頁加入相關資訊 PHP 認證處理 說明: 1. /auth/login 登入頁中,使用 Google 認證按鈕後,會進入 firebase 認證程序,認證完成後將轉址至 /auth/callback/?token=..... 2. 在 /auth/callback 程序中,認證使用者資料且取得權限後,存入 session 再轉至 /admin 管理頁 3. 在 firebase 使用者資料中,可以利用 customClaim 欄位來儲存額外的資訊。

PHP + CI4 的 PhpSpreadsheet 的處理

0、需要用到的 Library use \PhpOffice\PhpSpreadsheet\Spreadsheet; use \PhpOffice\PhpSpreadsheet\Writer\Xlsx; use \PhpOffice\PhpSpreadsheet\Reader\Xlsx; use \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; 參考資料: Welcome to PhpSpreadsheet's documentation - PhpSpreadsheet Documentation  1、上傳 excel 檔案並讀取內容 //處理上傳 try {             $thefile = $this->request->getFile('theuploadfile'); } catch (\Exception $e) { echo $e; exit; } try { $path = $thefile->store(); } catch (\Exception $e) { echo $e; exit; } //確認檔案格式並讀取內容 $filename = WRITEPATH . 'uploads/' . $path; $fileext = ucfirst($thefile->getClientExtension()); if (in_array($fileext, array('Xls', 'Xlsx'))) { $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($fileext); $spreadsheet = $reader->load($filename); $sheet = $spreadsheet->getSheet(0); $data = $sheet->getCell('A1')->getValue(); } 2、產生 Excel 檔案 / /生成試算表並設定格式 $spreadsheet = new Spreadsheet(); $spreadsh...

Ubuntu 22.04 安裝PHP 7.4

目前最新的 Ubuntu LTS 是 22.04 版,其預設的套件庫 PHP 是 8.1 版本。 相較於 Ubuntu 20.04 用的是 PHP7.4,PHP8.1對於變數的宣告和陣列的 KEY 值有很嚴格的限制,未事前宣告的變數或陣列 KEY值就會報錯。如果是小一點的程式,在報錯的地方再針對變數和KEY 多做一個判斷可以解決;但是大一點的程式就很傷腦筋了。 網路上有提供新增套件庫,將原本的 PHP8.1 降級成 PHP7.4 的方法,以前設定時還蠻順利的,但是最近新設定一台虛擬主機時,欲一直遇到 python 的問題,最後利用手動增加套件庫的方式才解決這個問題。 參考資料: https://askubuntu.com/questions/1393381/unable-to-add-ondrej-repository-apt-in-ubuntu-20-04 1、在 /etc/apt/source.d 中新增 ondrej-ubuntu-php-jammy.list 2、在 ondrej-ubuntu-php-jammy.list 中新增: deb https://ppa.launchpadcontent.net/ondrej/php/ubuntu/ jammy main # deb-src https://ppa.launchpadcontent.net/ondrej/php/ubuntu/ jammy main 3、匯入所需的金鑰: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4f4ea0aae5267a6c  然後再作 apt update 及 apt install php7.4-fpm 及 php7.4 的相關套件即可。 設定系統主要啟用 PHP 版本 sudo update-alternatives --config php

firebase 1:簡介

  firebase 是 Google 推出的網站整合性服務,提供認證(Authentication)、資料庫(Realtime Database、Firebase Database)、雲端空間(Storage、Functions、Extensions)、網頁空間(Hosting)、雲計算(Machine Learning)…等。 相關網站: Google Firebase Console  https://console.firebase.google.com/ 文件: https://firebase.google.com/docs?authuser=0&hl=zh 參考資料: Firebase 教學 - Firestore 安裝、寫入和讀取  https://www.oxxostudio.tw/articles/201905/firebase-firestore.html Firebase 教學 - 簡單的使用者註冊功能  https://www.oxxostudio.tw/articles/201905/firebase-simple-signup.html Firebase 教學 - RealTime Database 安裝與使用  https://www.oxxostudio.tw/articles/201904/firebase-realtime-database-start.html Day29 前端福音(4/4): Firebase-帳號系統&資料讀寫規則  https://ithelp.ithome.com.tw/articles/10206354 Firebase網頁教學[二] - 驗證篇  http://sj82516-blog.logdown.com/posts/1050619 用 Firebase Authentication 做一套簡易會員系統 – 電子郵件 密碼  https://www.letswrite.tw/firebase-auth-email/ 利用 Firebase Authentication 來實現註冊帳號和登入的功能  https://franksios.medium.com/ios-%E5%88%A9%E7%94...

ci4 常用套件安裝

因為已經習慣用 codeigniter4(CI4)作網站開發,有部份常用套件的安裝流程紀錄起來,以後比較容易查詢。 Google APIs Client Library for PHP 安裝:composer require google/apiclient:^2.12.1 Github網址: https://github.com/googleapis/google-api-php-client 這個主要是用於 Google Oauth2 認證使用的。 PhpSpreadsheet 安裝:composer require phpoffice/phpspreadsheet Github網址: https://github.com/PHPOffice/PhpSpreadsheet 官網文件: https://phpspreadsheet.readthedocs.io/en/latest/ 處理Excel(或其他試算表檔案格式)的php 函式庫,用於匯入、匯出資料成試算表格式檔案。 Firebase 官網:h ttps://firebase.google.com/ 安裝:composer require tatter/firebase  

CodeIgniter4 - PHP 程式開發框架

 因為最近比較常寫 PHP 程式,老是用舊方法開發已經有點發現 CP 值不高,想找些開發框架,也就是 MVC 框架來快速開發。 PHP 的 MVC 框架很多,相關資訊可以參考: php常用的7大框架 研究過 laraval、ThinkPHP、CodeIgniter等框架,最後選擇 CodeIgnite 4 (CI 4)來作為自己程式開發框架。 主要是因為自己已習慣使用 Smarty 作為網頁模版引擎,有找到在 CI4 中使用 Smarty Engine 的範例,其他的框架不是沒有相關範例,就有其自帶的模版引擎需要再學一遍。 所謂 MVC 架構:M 表 Model,就是專門處理資料庫相關的動作;V 表 View,處理網頁渲染,也就是慣用的 Smarty;C 表 Controller,處理所有程式動作。在 Controller 前面還有一個 Router 的角色,負責解析網址或輸入參數(一般為 GET),並發送到相對應的 Controller 或 觸發相對應的 Controller 去作處理。 以前自己寫的程式已經有一些些 MVC 的影子了,利用網址呼叫一支支 PHP 程式,裡面用 action 或 func 變數來執行對應的 function 程序,最後用 Smarty 作網頁渲染。所以轉換成 MVC 框架比較無痛,而且 MVC 框架多一個專門處理資料庫的 Model,節省了許多寫 SQL 語法的時間。 CodeIgnite 4 CodeIgnite 台灣: https://codeigniter.tw/ 利用 composer 新增專案:composer create-project codeigniter4/appstarter <project-name> 以 php cli 建立 model, controller 等:php spark make:[controller | model] 建立好專案後,CI 4 會在專案資料夾中建新必要的資料  app 資料夾中就是所有程式的核心,Router, Controller, Model, Views 和必要的設定檔都在其中。 public 資料夾是專案網頁的 root,所以要在 apache 等網頁伺服器設定將網頁路徑指到那邊。 writable 資料夾有關 logs, sessio...