2016年2月19日 星期五

EasyuiCMS 改版為 v2 (mysqli)

由於 Appfog 升版的關係, 讓我又重新找尋免費的 PHP 主機. 想起之前有申請過英國 Hostinger 的虛擬主機, 但是一直都沒使用, 試著將 EasyuiCMS 上傳, 結果竟然在登入畫面就出現如下錯誤回應 :

<br />
<b>Deprecated</b>:  Function mysql_numrows() is deprecated in <b>/home/u220421318/public_html/lib/mysql.php</b> on line <b>313</b><br />
<br />
<b>Deprecated</b>:  Function mysql_numrows() is deprecated in <b>/home/u220421318/public_html/lib/mysql.php</b> on line <b>313</b><br />
{"status":"success","msg":""}

意思是 MySQL 的 mysql_numrows() 已經被廢棄了, 網搜結果發現, 整個 mysql 函式庫在 PHP 2.5.5 版就被廢棄不能用了, 應該改用 mysqli 函式庫 (i 是 improved 的意思). 這個 Hostinger 主機使用的正是 PHP 2.5.5, 我在本機測試使用的是 Appserv 的 2.5.4 版, 難怪我的 EasyuiCMS 在其他主機都沒問題, 在 Hostinger 卻出問題. 參考 :

mysql_num_rows replacment to recomend?
mysql_ deprecated

PHP 的資料庫存取從最早的 mysql 函式庫, 因為安全性緣故進階到物件化的 mysqli, 甚至抽象化的 PDO, 其差異詳見下面這篇 :

# 淺談 PHP-MySQL, PHP-MySQLi, PDO 的差異

為了讓 EasyuiCMS 能在 Hostinger 上跑, 我參考了下列網站的說明文件, 把 /lib 下的 mysql.php 複製一份到 mysqli.php 進行修改 :

# mysqli 函式
'MySQLi' for Beginners
# PHP 5 MySQLi Functions

修改的部分主要是將 mysql_ 字頭的函式名稱改成 mysqli_ 開頭, 因為 mysql 函式全部在 mysqli 都有實作, 除了 mysqli_select_db() 與 mysqli_query() 這兩個參數先後顛倒, mysql_numrows() 改為 mysql_num_rows()外, 主要差別就是 mysqli 字頭而已. 修改的部分如下 :

舊 : $conn=mysql_connect($address, $username, $password)
新 : $conn=mysqli_connect($address, $username, $password)

舊 : $result=mysql_select_db($SQL, $conn)
新 : $result=mysqli_select_db($conn, $database)

舊 : $result=mysql_query($SQL, $conn)
新 : $result=mysqli_query($conn, $SQL)

舊 : mysql_numrows($result)
新 : mysqli_num_rows($result)

舊 : mysql_fetch_array($result)
新 : mysqli_fetch_array($result)

舊 : mysql_error($conn)
新 : mysqli_error($conn)

舊 :  mysql_free_result($result)
新 :  mysqli_free_result($result)

舊 : mysql_close($conn)
新 :  mysqli_close($conn)

舊 : mysql_fetch_array($result)
新 : mysqli_fetch_array($result)

舊 : mysql_num_rows($result)
新 : mysqli_num_rows($result)

舊 : mysql_fetch_row($result)
新 : mysqli_fetch_row($result)

舊 : mysql_num_fields($result)
新 : mysqli_num_fields($result)

舊 : mysql_fetch_field($result, $i)
新 : mysqli_fetch_field($result)

新增 mysqli.php 函式庫後, 架站系統其他檔案如 index.php, main.php, sys.php 與應用程式也都要修改匯入的資料庫函式庫為 mysqli.php, 經過這樣改版後再次上傳 Hostinger 已可正常運作矣. 從去年 5 月寫好 EasyuiCMS 後, 已過了九個月才改為第二版, 最近還要將前陣子移植到 GAE 所發現的缺失再進行細部修改, 增進安全性考慮以便今年完成工作日誌改版.

至於 PDO, 利用抽象層來介接各種資料庫似乎是不錯的做法, 但效能會不會較差一些呢? 等了解用法做個充分測試再來決定要不要改版到 PDO 版.

2016-02-24 補充 :

記一下 Hosting.com 後台管理入口的撇步, 因為我常迷路. 登入後會先進入後台首頁 (Home) 如下 :


你要點第一個 Hosting 才會進入主機帳號管理畫面 :


點選要進入帳號的 Status 欄位中的 "Active", 底下就會出現四個按鈕, 按第一個 "Manage" 即可進入此帳號的後台管理畫面.


沒有留言:

張貼留言