跳到主要內容

發表文章

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

XOOPS 2.7 升級筆記:Smarty 4 不支援 <{php}> 的解決方法

 XOOPS 2.7 全面升級到 Smarty 4 後,舊佈景或舊模組最容易炸掉的地方,就是樣板裡的 `<{php}>...<{/php}>`。 原因很單純:Smarty 4 已經不支援在樣板中直接執行 PHP。也就是說,舊寫法如果還把 PHP 邏輯塞在 `.tpl` 裡,升級後就會出現 unknown tag、白畫面或 SmartyCompilerException。 目前比較穩的解法,不是去 hack Smarty,也不是讓 Smarty 重新開放任意 PHP,而是把原本散落在樣板中的 PHP 程式碼收回 PHP 檔案,整理成 function,再用 `$tpl->registerPlugin()` 註冊成 Smarty 標籤,最後在樣板中用新標籤取代原本的 `<{php}>`。 簡單說: 舊寫法: .tpl 直接寫 <{php}> PHP CODE <{/php}> 新寫法: PHP 檔建立 function → registerPlugin 註冊成 Smarty function → .tpl 改用 <{php_channel}> 這樣效果接近原本 `<{php}>`,但執行入口變乾淨,也比較符合 Smarty 4 的規則。 修改方法如下說明: 一、建立相容函式檔 建議先建立一個 PHP 檔,專門收納原本樣板裡的流浪 PHP,例如: modules/模組ID/function/tpl_smarty_compat.php 示例: <?php //Smarty 4 樣板流浪 PHP 收容區 function register_smarty_compat($tpl=""){ if(empty($tpl) || !is_object($tpl)) return; if(!method_exists($tpl,'registerPlugin')) return; static $registered=array(); $tplid=function_exists('spl_object_id') ? spl_object_id($tpl) : spl_object_hash($tpl); if(!empty($regist...

升級Ubuntu22.04(Apache / PHP ) Ondřej Surý 的 PPA套件方法

當初使用 Ondřej Surý 的 PPA套件安裝(Apache / PHP )就是為了解決惱人的資安通報,果然網站上線沒多久通報就來了,這次主要有兩項要升級(Apache要高於2.4.64 / PHP要高於8.3.23),剛好來試看看傳說中的 PPA套件升級到底有多容易,以下是升級完整步驟紀錄 先備份檔案以防萬一(後續比對用)重要 sudo mkdir -p /root/apache_backup_$(date +%Y%m%d) sudo cp /etc/php/8.3/apache2/php.ini /root/apache_backup_$(date +%Y%m%d)/ sudo cp /etc/apache2/sites-available/default-ssl.conf /root/apache_backup_$(date +%Y%m%d)/ sudo cp /etc/apache2/mods-available/ssl.conf /root/apache_backup_$(date +%Y%m%d)/ sudo cp /etc/apache2/apache2.conf /root/apache_backup_$(date +%Y%m%d)/ sudo cp /etc/apache2/conf-available/security.conf /root/apache_backup_$(date +%Y%m%d)/ sudo cp /etc/apache2/ports.conf /root/apache_backup_$(date +%Y%m%d)/ 這樣所有重要設定就會備份到 /root/apache_backup_ 20251020 /,如果升級後有任何異常,你只要: sudo cp /root/apache_backup_ 20251020 /* /etc/apache2/... sudo systemctl reload apache2 就能一鍵復原 (紅字為今天日期) 再來升級Apache 1、更新套件列表:  sudo apt update 2、升級 Apache : sudo apt install --only-upgrade apache2 備註: 如果發生Progress: [ 82%] [##################...

使用PPA安裝PHP後套件後發生錯誤,套件無法正常運作,移除重新安裝的方法

前陣子用PPA安裝的PHP8.3.2就很多雷,像是ZIP套件無法運作,還有一堆套件安裝失敗都要手動安裝,其中最麻煩的是ZIP套件怎麼裝就是跑不起來,解決方案只好吧PHP整包砍掉重新再安裝一次,就正常了,方法如下: 第一步:完整清光 PHP 環境 sudo apt purge 'php8.*' 'php8.4*' 'libapache2-mod-php*' -y sudo apt autoremove --purge -y sudo apt clean 重啟 Apache sudo systemctl restart apache2 第二步:重新安裝PHP套件 sudo apt update sudo apt install php8.3 libapache2-mod-php8.3 php8.3-cli php8.3-common \ php8.3-curl php8.3-fileinfo php8.3-gd php8.3-mbstring php8.3-mysql \ php8.3-zip php8.3-xml php8.3-intl php8.3-bcmath php8.3-sqlite3 php8.3-imagick -y 重啟 Apache sudo systemctl restart apache2 第三步:重新安裝phpmyadmin套件 由於升級 PHP 8.3.21 之後,phpMyAdmin 整個被移除了!所以需要重裝,但不用擔心Mysql還是活者好好的沒被影響,請輸入以下指令安裝 sudo apt update sudo apt install phpmyadmin -y 如果它問你要選擇 Web server,請選擇 apache2 若有問要不要設定資料庫:→ 按 Yes(會自動產生 / 登記連接用帳密) 重啟 Apache sudo systemctl restart apache2 完成後phpMyAdmin就會恢復運作,資料也都完好保留 這樣就能重新安裝或是安裝PPA最新的PHP版本,原本錯誤的問題也能排除,以上工作心得分享,有需要的朋友參考看看 工作心得撰寫: 徐嘉裕 Neol hsu

Ubuntu22.04分拆安裝(Apache / PHP / MySQL/ phpMyAdmin)的方法

為了應對越來越頻繁的資安通報,解決方案就是用PPA各別安裝Apache / PHP / MySQL/  phpMyAdmin套件,這樣如果遇到資安通報可立即升級修補漏洞,確保系統安全,晚上也好睡覺,以下是分拆安裝(Apache / PHP / MySQL/  phpMyAdmin)的安裝方法步驟說明: 備註說明: 如果是學校雲主機未啟用 IPv6,建議於先停用 IPv6,不然安裝流程會卡死 【Ubuntu 永久停用 IPv6(全系統 IPv4 優先)】 建立設定檔 sudo tee /etc/sysctl.d/99-disable-ipv6.conf <<EOF net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 EOF 套用設定 sudo sysctl -p /etc/sysctl.d/99-disable-ipv6.conf 驗證 cat /proc/sys/net/ipv6/conf/all/disable_ipv6 如果回  1 ,表示 IPv6 已完全關閉。 這樣就能吧 IPv6關閉避免影響套件下載與安裝流程 步驟1. 安裝Apache/PHP 為了取得Apache官網最新版本及PHP最新版本,這裡使用 Ondřej Surý 的 PPA套件 ※輸入以下指令下載PPA套件 sudo apt update sudo apt install -y software-properties-common sudo add-apt-repository -y ppa:ondrej/apache2  sudo add-apt-repository -y ppa:ondrej/php 備註: 如發生add-apt-repository timeout 110無法安裝PPA,請參考這篇解決方案! ※安裝 Apache 2.4.XX最新版(包含 OpenSSL) sudo apt install -y apache2 apache2-utils ssl-cert openssl ※確認 Apache 版本及是否安裝 apache2 -v 應該會顯示: S...

XAMPP更換PHP套件方法,可運作多種版本的PHP

XAMPP是吧Apach/PHP/MariaD三個功能綑綁再一起運作的伺服器套件,我們可以透過檔案修改與資料夾變更方式來切換PHP版本,這樣就能運作不同的PHP的專案,也可以對舊專案進行維護及修改工作。 舉例來說,本地端的xampp環境為Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.1.25 因為舊專案的PHP是7.4無法在PHP8.1中運作,直接更改PHP版本設定比起重新安裝XAMPP7.4要快很多,方法如下: 1、先去XAMPP官網->點選下載->更多下載 然後選擇XAMPP Windows->選擇要下載的版本,例如7.4,直接在瀏覽器搜尋7.4找到7.4.33資料夾 進入後選擇.zip的檔案,例如:xampp-windows-x64-7.4.33-0-VC15.zip,點選下載回來後解壓縮 2、回到目前運作中的XAMPP,開啟Panel吧Apach關閉,然後進入XAMPP根目錄中吧php資料改成php_8.1,然後去剛剛下載的xampp-windows-x64-7.4.33-0-VC15資料夾中,吧php複製後貼到XAMPP根目錄中,所以會有一個php及php_8.1資料夾 3、進入extra資料夾,找到httpd-xampp.conf這支檔,路徑是 C:\xampp\apache\conf\extra\httpd-xampp.conf 然後吧httpd-xampp.conf更名為httpd-xampp.conf_8.1,接者去剛剛下載回來的xampp-windows-x64-7.4.33-0-VC15資料夾中,同樣的extra資料夾位置,吧httpd-xampp.conf複製起來,貼到XAMPP的extra資料夾裡面。 接者用文字編輯器打開httpd-xampp.conf檔,搜尋/xampp,逐一改為XAMPP目前實體路徑位置例如:F:/xampp, 4、然後開啟Panel吧Apach開啟,如果都有按以上步驟執行,Apach因該會跑起來,然後可以在C:\xampp\htdocs放置一個phpinfo.php,檔案的CODE為 <?php phpinfo(); ?> 5、在網址輸入http://localhost/phpinfo.php後搜尋Apache Version,就能看到PHP版本已經...

Xoops模組開發->解決上傳圖檔檔名被Xoops Protector防護模組誤判為有害檔踢出的問題-教學撰寫:徐嘉裕Neil hsu

如果有開啟Xoops Protector防護模組的此項功能 假如有惡意檔案被上傳就強制踢出 假如有人企圖上傳一些可以執行的惡意檔案,例如副檔名為.php的檔案,此模組將強制踢出XOOPS。 上傳單一圖檔時會因為檔名有禁用字元而被當成惡意檔案踢出系統, 例如: LINE_ALBUM_2022. 閱讀日活動 4.21-4.22_220805_5.jpg 這樣的檔名就會被踢出去,但這確實是無害檔沒錯 user還需要改檔名才能上傳,實在有點矯枉過正,解決方案就是在接收$_FILES的php檔最頂端 (include "header.php") 上面加上以下code if(!empty($_FILES['upfile']['name'])) $_FILES['upfile']['name']=strtotime(date("Y-m-d H:i:s")).'.'.substr(strrchr($_FILES['upfile']['name'], '.'), 1); //重編檔名防止被防護模組阻擋 //$_FILES['upfile'] 就是表單傳送檔案的name值, 可改為自訂值 這樣檔名就會被改成時間戳格式,原始副檔名也會保留,如果user上傳php檔一樣會被Xoops Protector防護模組踢出去,但 LINE_ALBUM_2022. 閱讀日活動 4.21-4.22_220805_5.jpg 這樣格式的圖檔就能上傳。 另外如果有多個單張圖檔上傳,例如upfile1~upfile2~upfile3,也能用以下批次方法修改 foreach(array_keys($_FILES) as  $val){ if(!empty($_FILES[$val]['name'])  &&  !is_array($_FILES[$val]['type'])){ $_FILES[$val]['name']=strtotime(date("Y-m-d H:i:s")).'.'.substr(strrchr($...

Xoops模組開發->區塊開發->區塊執行函式增加傳遞第二參數功能-教學撰寫:徐嘉裕Neil hsu

在開發Xoops區塊的時候,我們會吧區塊編輯函式(block_edit)的設定值放在options陣列裡面,送出後以字串形式儲存在newblocks資料表的options欄位中, 然後在區塊執行函式(block_show)使用$options陣列來取得設定值,但由於Xoops限制區塊執行函式只能取用options欄位的設定值,其他的像是bid,name,title欄位都是無法取得數值,若是我們需要取用bid來做前台js資料區隔就沒辦法,解決方案只有修改kernel/block.php->$show_func涵式,增加第二傳遞參數功能,吧整個$this都送入$show_func涵式,這樣在模組區塊中就能調用到newblocks資料表全部數值了,方法如下。 1、開啟kernel/block.php檔案,用文字編輯器找到481行       $block   = $show_func($options); 2、修改為 $block   = $show_func($options ,$this ); 3、模組區塊執行函式增加第二參數 function 模組ID_block_show($options ,$thisvar ){ 略.......... } 注意:模組區塊執行函式第二參數請勿用$this命名變數 4、如果要取用bid值輸出樣板,$block['bid']=$thisvar->getVar('bid'); 5、在模組樣板上使用<{$block.bid}>即可 6、>getVar(' 可輸入任何newblocks資料表的欄位名稱 ') 這樣就可以了,複製區塊一樣能抓到數值,有需要的朋友參考看看!! 工作心得分享: 徐嘉裕 Neil hsu

php多檔上傳檢測檔案類型MIME白名單的方法-教學撰寫:徐嘉裕Neil hsu

通常要檢測上傳檔案白名單可以用副檔名來檢測,不過副檔名是可以變造的,最常見的就是勒索病毒,比較安全的方法用上傳檔案的MIME來檢測,這樣就算變造過的副檔名一樣會被檢測出來,防止伺服器被駭,方法如下: foreach($_FILES['fileval']['tmp_name'] as $i=> $val){ //檢測文件的 MIME 內容類型 $mime_type = mime_content_type($val); //可上傳MIME類型JPG,PNG,GIF,Word,Excel,PowerPoint,pdf //可再增加MIME類型 $allowed_file_types = ['image/png', 'image/jpeg','image/gif','application/msword','application/vnd.ms-excel','application/vnd.ms-powerpoint','application/pdf','application/vnd.openxmlformats-officedocument.presentationml.presentation','application/vnd.openxmlformats-officedocument.wordprocessingml.document','application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']; if (!in_array($mime_type, $allowed_file_types)) { $failed.=$_FILES['fileval']["name"][$i].','; } } if(!empty($failed)){ echo '您上傳的檔案'.$failed.'不符合上傳規定'; exit; } 只要不是在上傳白名單中的檔案都會終止程式,也可以做導向返回首頁,讓檔案...

寫了一個文字框textarea內容輸出樣板的function解決(保留原格式/字元轉編碼/URL自動加上連結)等問題-教學撰寫:徐嘉裕Neil hsu

在開發模組時並不是所有的文字框都要使用CK編輯器,CK編輯器使用JS生成消耗前端資源,用越多網站開啟越慢,一些純文字的內容用原生的textarea即可,但需要做一些處理,不然內容輸出樣板會有以下問題 1、若未設置nl2br函數保留原格式,所有的段行內容都會黏再一起。 2、若未做字元轉編碼htmlentities,則一些特殊字元無法正常顯示: 例如&會變成¢ 。 3、內容中如有URL無法自動產生連結。 會像下圖這樣 為了解決這問題,寫了一個function包含了(保留原格式/字元轉編碼/URL自動加上連結)等函數,code如下: function textprocessing($val=""){ //字元轉編碼 $val=htmlentities($val,ENT_QUOTES,"UTF-8"); //URL自動加上連結 $val = preg_replace('#(http|https|ftp|telnet)://([0-9a-z\.\-]+)(:?[0-9]*)([0-9a-z\_\/\?\&\=\%\.\;\#\-\~\+]*)#i','<a target="_blank" href="\1://\2\3\4" rel="nofollow">\1://\2\3\4</a>', $val); //保留原格式 return nl2br($val); } 在php上輸出內容變數加上textprocessing()函數 ECHO $message=textprocessing($val=$message); 或是在smarty樣板上直接引用函數也可以(php端就不需處理) <{$message|textprocessing}>  最後輸出結果如下圖 可以看到原格式斷行/特殊字元/URL加上連結都有處理了,這樣用一個function就能解決三個問題,有需要的朋友參考看看! 工作心得撰寫: 徐嘉裕 Neil hsu

分享一個PHP使用curl函數下載遠端檔案回本地端伺服器的function-教學撰寫:徐嘉裕Neil hsu

要下載遠端檔案回自己伺服器存放,方法很多,用fopen也行,但這裡不推薦,因為大部分虛擬主機的php.ini中allow_url_fopen都會設為Off,導致fopen函數擷取遠端檔案失敗,無法下載,解決方法就是使用安全性較高且為PHP預設套件curl函數來擷取遠端檔案,方法如下 假設我們要下載遠端的 https://img.youtube.com/vi/sDhU6nWWja8/maxresdefault.jpg 存放到伺服器端 /opt/lampp/htdocs/uploads/images/maxresdefault.jpg //function code //下載遠端檔案回本地端 function curlsave_file($inPath,$outPath){  //$inPath 遠端路徑 //$outPath 儲存本地端路徑 set_time_limit(0); //如果文件很大,請設置超時。 //文件處理 $new_file = fopen($outPath, "w") or die("cannot open" . $outPath); //curl操作 $cd = curl_init(); curl_setopt($cd, CURLOPT_URL, $inPath); curl_setopt($cd, CURLOPT_FILE, $new_file); // 超時為 30 秒,要下載大文件,您可能需要增加超時限制。 curl_setopt($cd, CURLOPT_TIMEOUT, 30);  //運行 curl 下載文件 curl_exec($cd); if (curl_errno($cd)) {   echo "the cURL error is : " . curl_error($cd); } else {   $status = curl_getinfo($cd);   echo $status["http_code"] == 200 ? "The File is Downloaded" : "The error code is : " . $status["http_code"] ;   // the...

PHP->分享一個好用的jpge轉png的function-教學撰寫:徐嘉裕Neil hsu

最近升級Xoops布景架構,吧js播放器圖片由本的jpg轉為png,除了在創建圖檔及讀出圖檔的地方需要更改,也需要吧原本已經建立的jpg檔全部批次改為png,這樣user更新完布景才不會播放器圖片都顯示X,關於jpge轉png的方法上網G狗了一下,找到一個不錯且好用的function分享給大家 jpge轉png的function code //jpge轉png function function jpgtopngfunction($input_file="",$output_file=""){ //$input_file; 原始JPG檔路徑+檔名 //$output_file; 轉成PNG檔路徑+檔名 //檔案存在才執行 if(file_exists($input_file)) { $input = imagecreatefromjpeg($input_file); $width = imagesx($input); $height = imagesy($input); $output = imagecreatetruecolor($width, $height); $white = imagecolorallocate($output, 255, 255, 255); imagefilledrectangle($output, 0, 0, $width, $height, $white); imagecopy($output, $input, 0, 0, 0, 0, $width, $height); imagepng($output, $output_file); //刪除原始jpg檔 unlink($input_file); } } 在需要轉換的地方引用jpgtopngfunction()函數 例 jpgtopngfunction($input_file=" img.jpg ",$output_file=" img.png "); 這樣就會吧 img.jpg 複製一份為 img.png 後,再刪除原始的 img.jpg ,可以搭配foreach迴圈使用做批次修改,有需要的朋友參考看看 參考資料來源: https://itecnote.com/tecnote/php-gd-con...

PHP取得圖片資訊getimagesize函數-教學撰寫:徐嘉裕Neil hsu

getimagesize函數可以解析上傳圖片的所有參數,包含圖片高度,寬度,類型等,有了這些資訊,就能在上傳檔案時做進一步的判斷分流,使用方法如下: $arrayimg = getimagesize($file['tmp_name']); //取得上傳暫存路徑中檔案資訊 $arrayimg共會返回以下陣列 Array(     [0] => 350     [1] => 318     [2] => 2     [3] => width="350" height="318"     [bits] => 8     [channels] => 3     [mime] => image/jpeg ) $arrayimg[0]=>圖像寬度的像素值 $arrayimg[1]=>圖像高度的像素值 $arrayimg[2]=>圖像的類型1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM $arrayimg[3]=>寬度和高度的字符串,可以直接用於HTML 的<image> 標籤 $arrayimg[bits]=>圖像的每種顏色的位數,二進制格式 $arrayimg[channels]=>圖像的通道值,RGB 圖像默認是 3 $arrayimg[mime]=>圖像的MIME資訊,可以用來在HTTP Content-type 頭信息中發送正確的信息,如:header("Content-type: image/jpeg"); 應用範例1-設定上傳圖片最大寬度->超過才做縮圖 假設上傳圖片最大寬度為1000px,若上傳圖檔超過最大寬度才做縮圖處理,否則原尺寸上傳 $arrayimg = getimagesize($file['tmp_name']); ...

PHP去除js,smarty,css,php標籤的function-教學撰寫:徐嘉裕Neil hsu

在開發留言系統時除了前端防禦外,後端的過濾也很重要,因為前端所有的JS功能都可透過瀏覽器的F12竄改導致防禦無效,尤其是惡意發佈js,css,程式碼破壞版面,甚至可將頁面導向木馬程式網頁,所以一定要在資料寫入時就吧js,smarty,css,php標籤通通去除掉無害化處理,才能防止網站遭惡意破壞事情發生。 分享一個PHP去除js,smarty,css,php標籤的function,code如下 //去除js,smarty,css,php標籤 function removejscssscript($str) { //移除js $str = str_replace("\r\n", PHP_EOL, htmlspecialchars_decode($str)); $str = preg_replace('/<.*script.*>/', '', $str); //移除css $str = preg_replace('/<.*style.*>/', '', $str); $str = preg_replace('/<.*link.*>/', '', $str); //移除smarty $str = preg_replace('/<\{+/i', '', $str); $str = preg_replace('/\}>+/i', '', $str); //移除php $str = preg_replace('/<\?php+/i', '', $str); $str = preg_replace('/\?>+/i', '', $str); return $str; } //在接收變數寫進資料表的地方使用即可  removejscssscript($str=$_POST['description']) ; 實際測試移除效果,我們先在文字框中貼上js,css程式碼 然後送出,可以看到style及script都被移除掉,只剩下結構,這樣就無害化完成 有需要的朋友參考看...

PHP指定陣列顯示數量的方法-教學撰寫:徐嘉裕Neil hsu

使用array_slice()函數可以指定陣列輸出的數量,例如只輸出陣中前4個陣列,或是由第4個陣列之後輸出全部陣列,透過array_slice()函數都可達成 php code範例如下 //共有9個陣列 $Arr=array("陣列01","陣列02","陣列03","陣列04","陣列05","陣列06","陣列07","陣列08","陣列09"); //取得陣列總數 $Arrcount = is_array($Arr) ? count($Arr) : 0 ; //只輸出0-4個陣列 //顯示陣列01,陣列02,陣列03,陣列04 foreach( array_slice ($Arr, 0, 4) as $val){ echo $val.','; } // 輸出第 4個之後的全部陣列 //顯示陣列05,陣列06,陣列07,陣列08,陣列09 foreach( array_slice ($Arr, 4, $Arrcount) as $val){ echo $val.','; } 這樣就能在資料源頭做分流,不須使用IF來判斷迴圈數後顯示內容,精簡程式節省效能,有需要的朋友參考看看 工作心得撰寫: 徐嘉裕 Neil hsu

Xoops->使用js判斷USER端瀏覽器cookie是否啟用,若啟用ajax寫入cookieid-教學撰寫:徐嘉裕Neil hsu

cookie運作原理是吧伺服器端的資料儲存於user端的瀏覽器中,然後可讀寫cookie值,通常用於網站登入儲存會員密碼之類的,但也能作為區隔同ip多台電腦或同電腦多個不同瀏覽器的識別,只需要在網站首次進入時寫入一組cookieid即可。 不過問題來了,php雖然可以使用setcookie()寫入cookie,但卻無法判斷user端的cookie是否啟用(cookie是在瀏覽器前端執行),用js也能寫入cookie並判斷是否啟用,但所需的參數還是需要php先輸出到樣板在用js取值寫入,怎麼用都很麻煩的感覺。 解決方案就是用js來判斷user端的cookie是否啟用,若啟用直接用ajax在php端setcookie()寫入cookie,這樣整合起就能吧js跟php不足的地方都補齊了,方便好用。 以下為code範例 //tpl樣板部分 <!-- 載入cookie --> <script type="text/javascript" src="<{$xoops_url}>/modules/模組ID/js/cookie.js"></script> <script>var xoopsjsurl='<{$xoops_url}>';</script> //js部分 //建立一個cookie.js檔並放置以下內容 //判斷cookie是否啟用並寫入cookieid $(document).ready(function() {   if (typeof(getCookieByName('cookieid')) != 'undefined') return  //判斷指定cookie是否有建立,空值才執行以下程式   var dt = new Date();   dt.setSeconds(dt.getSeconds() + 60);   document.cookie = "cookietest=1; expires=" + dt.toGMTString(); //建立一個測試cookie   var cookiesEnabled = document.cookie.indexOf("...

PHP計算達成率公式寫法(四捨五入)-教學撰寫:徐嘉裕Neil hsu

分享一個PHP計算達成率公式寫法,效果可以計算出如下圖的達成率 達成率公式範例: 目標 = 100 實績 = 90 達成率 = 90 / 100 * 100% = 90% 套用PHP程式 : $target=100; //目標 $joined= 90; //實績 //達成率 $ratevar=(!empty($target) && !empty($joined) ) ? ($joined / $target * 100) : '0'; //判斷計算值是否為0 ECHO "達成率".round($ratevar,0)."%"; //使用round()四捨五入->輸出結果90% 有需要的朋友參考看看 工作心的撰寫: 徐嘉裕 Neil hsu

使用Ajax長輪詢跨頁資料查詢操作-教學撰寫:徐嘉裕Neil hsu

會使用到Ajax長輪詢功能也是意外,本來是想用JS跨域查詢,由A頁面查詢B頁面執行ajax程序後返回值做同步處理,結果經測試JS跨域查詢只能查到讀取頁面的原始資料,無法取得JS程序處理過後的變動數值,試了半天,只好用Ajax長輪詢來解決問題了,順便寫一個工作心得做為紀錄 Ajax長輪詢跨頁資料查的運作原理如下圖 以上圖解也就是使用Ajax長輪詢保持連線持續查詢資料庫,若有比對到資料則返回數值後以非同步方式更新內容,沒有就繼續查,保持連線狀態,舉一個Ajax長輪詢應用實例大家就清楚了,FB上貼文留言,即便未更新頁面,有其他用戶的的留言也會即時顯示在留言處,這就是使用了Ajax長輪詢的效果讓Ajax一直保持在 連線查詢返回更新 狀態,即時同步資料。 以下為Ajax長輪詢CODE 範例 //HTML結構 <div id='showbox'><span id='numberbox'> 30 </span></div> <script>ajaxlongpolling();</script> // 30 為固定值,透過JS取值後傳送到ajax.php比對資料 //JS結構-$.ajax function ajaxlongpolling() { $.ajax({ url: 'ajax.php', timeout: '80000', //ajax請求超時時間80秒 type: 'POST', data: { var1: $("#numberbox").text(), //取的#numberbox中數值 timedate: '80' //40秒後無論結果伺服器都返回數據 }, success: function(response) { var $response_arr = response.split(','); //切割陣列 //返回1->查詢到資料-重新讀取ajaxlongpolling(); if ...

Xoops->logcounterx流量統計模組系統分析增加Windows10設定-教學撰寫:徐嘉裕Neil hsu

logcounterx是日本人開發專門分析網站流量的Xoops模組,不過近幾年似乎沒有更新版本發佈,所以模組系統分析還停留在Windows7,好像是時光暫停了一樣!! 這樣就失去系統分析的意義了,既然沒人要維護只好自己加上Windows10的分析設定,分法如下: 1,找到以下檔案,用筆記本打開 ../../modules/logcounterx/include/functions.php 2、搜尋 Windows7 找到以下程式  if (preg_match('/Windows NT 6\.1/i', $agent) || preg_match('/WinNT 6\.1/i', $agent)) { return 'Windows7'; } 3.在搜尋Windows7程式下面再加上Windows10的程式碼 (紅字部分)  if (preg_match('/Windows NT 6\.1/i', $agent) || preg_match('/WinNT 6\.1/i', $agent)) { return ' Windows7 '; } if (preg_match('/Windows NT 10\.0/i', $agent) || preg_match('/Win64\.0/i', $agent)) { return 'Windows10'; } 存檔後,前往模組首頁系統分析就會顯示Windows10的數據了 這樣就完成logcounterx流量統計模組系統分析增加Windows10設定,有需要的朋友參考看看! 備註說明:logcounterx模組的log是紀錄user瀏覽器當日IP不做重複紀錄,所以如果修改好程式需要測試請用今日內尚未開啟網站的瀏覽器測試才會有數據(例如Edge已被紀錄就用Chrome測試) 工作心的撰寫: 徐嘉裕 Neil hsu

PHP8.0->TypeError: count(): Argument 的解決方法-教學撰寫:徐嘉裕Neil hsu

在PHP8.0中count()函數增加了必須要有 傳遞參數 不能為無效值,否則就會出現 TypeError: count(): Argument 的錯誤訊息 只需要調整一下架構即可 PHP8.0範例count() //正常  count()有 傳遞 參數 $a[0] = 1; $a[1] = 3; $a[2] = 5; echo count($a); //錯誤 count()沒有 傳遞 參數 /*$a[0] = 1; $a[1] = 3; $a[2] = 5;*/ echo count($a); //解決方法A  用is_array()判斷 傳遞 參數是否有值且為陣列 $a = is_array($a) ? count($a) : 0 ; echo $a; //解決方法B  在if中使用is_array()判斷 傳遞 參數是否有值且為陣列 if(is_array($a) && count($a)!=0){ echo count($a); } echo count($a); 這兩個方法都能解決TypeError: count(): Argument 的問題,有需要的朋友參考看看 工作心得撰寫: 徐嘉裕 Neil hsu

Xoops做一個php8.0下載多檔打包壓縮成ZIP格式方法

之前寫過一篇【 Xoops做一個php下載多檔打包壓縮成ZIP格式方法 】工作心得,不過那方法在PHP8.0中無法使用,原因是new ZipArchive必須要先有實體的zip檔才能實體化,否則會出現 ValueError: ZipArchive::open(): Argument #1 ($filename) cannot be empty 錯誤訊息,必須修改new ZipArchive寫法在$zip->open之前就先建立一個暫存的zip檔,這樣後面的程式就沒問題了,修改方法如下 ※原本的new ZipArchive code function zipArchivefunction($url="",$zipname="",$temp="){ //$url 檔案原始路徑+檔名(陣列格式) //$zipname zip檔案名稱 //$temp 檔案暫存路徑+檔名 $zip = new ZipArchive; $zip->open($temp, ZipArchive::CREATE); //$url檔案路徑迴圈加入zip中 foreach ($url as $file) { $new_filename = substr($file, strrpos($file, '/') + 1); //重新定義壓縮檔路徑 $zip->addFile($file, $new_filename); } $zip->close(); /********使用header命令php下載zip檔************/ header('Content-Type: application/zip'); //指定類型 header("Content-type: ".filetype("$temp")); //指定下載時的檔名 header("Content-Disposition: attachment; filename=".$zipname.""); //輸出下載的內容。 readfile($temp); unlink($temp); //刪除暫存檔 } ※ php8.0修改過後的new Z...