bestlong 怕失憶筆記

當健忘由隨機逐漸趨向常態時,作筆記是非常必要的

Entries for the ‘PHP’ Category

ECShop 解決在新版 PHP 環境會有 Deprecated: preg_replace(): The /e modifier is deprecated 問題

ECShop 改版的速度算是滿落後的,PHP 的都推進到第 7 版本了。所以很多函式基於安全性或其他問題都要被改換掉,只要將 PHP 錯誤報告開到 DEBUG 等級就可以看到一堆警示。不過看起來 ECShop 到 PHP 5.6 版環境都還可以運行。所以有能力的話可以自行解決,至少可以讓開發環境在做修改時能減少這些雜訊與寫入 SSD 的次數。

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in cls_template.php XXX line

以下列出我有修改的部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php //cls_template.php
//-- 原本
return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);
//-- 修改成
return preg_replace_callback("/{([^\}\{\n]*)}/", function($r) { return $this->select($r[1]); }, $source);

//-- 原本
$val = preg_replace("/\[([^\[\]]*)\]/eis", "'.'.str_replace('$','\$','\\1')", $val);
//-- 修改成
$val = preg_replace_callback("/\[([^\[\]]*)\]/is", function($r) { return '.'.$r[1]; }, $val);

//-- 原本
$out = "<?php \n" . '$k = ' . preg_replace("/(\'\\$[^,]+)/e" , "stripslashes(trim('\\1','\''));", var_export($t, true)) . ";\n";
//-- 修改成
$out = "<?php \n" . '$k = ' . preg_replace_callback("/(\'\\$[^,]+)/" , function($r) { return stripslashes(trim($r[1],'\'')); }, var_export($t, true)) . ";\n";

//--- 原本
$pattern     = '/<!--\s#BeginLibraryItem\s"\/(.*?)"\s-->.*?<!--\s#EndLibraryItem\s-->/se';
$replacement = "'{include file='.strtolower('\\1'). '}'";
$source      = preg_replace($pattern, $replacement, $source);
//--- 修改成
$pattern     = '/<!--\s#BeginLibraryItem\s"\/(.*?)"\s-->.*?<!--\s#EndLibraryItem\s-->/s';
$replacement = function ($r) { return '{include file='.strtolower($r[1]). '}'; };
$source      = preg_replace_callback($pattern, $replacement, $source);

Leave a Comment

PHP執行MSSQL預儲程序時出現mssql_bind() [function.mssql-bind]: Unable to set parameter錯誤

出現問題的程式碼如下:

1
2
3
4
5
<?php
$sSQL = "select ..."; //超過 300 個字元的SQL指令
$proc = mssql_init('MyPagingRecordSet', $db_link);
mssql_bind($proc, '@strSQL', $sSQL, SQLVARCHAR, false, false) or print_r(error_get_last());
?>

執行的預儲程序

1
2
3
4
5
6
7
CREATE PROCEDURE MyPagingRecordSet
  @strSQL VARCHAR(1000),  --查詢 sql,如 select * from [user]
  @PageIndex INT = 1,     --查詢的頁號
  @PageSize INT = 30      --每頁顯示紀錄數
AS
--省略內容
GO

不過當 $sSQL 變數內只有很短的 SQL 命令時, 程式是可以正常執行的, 所以改成指定參數長度如下:

1
mssql_bind($proc, '@strSQL', $sSQL, SQLVARCHAR, false, false, 1000) or print_r(error_get_last());

執行結果還是一樣的錯誤訊息, 這應該是字串長度導致的問題, 再把程式改成

1
mssql_bind($proc, '@strSQL', $sSQL, SQLTEXT, false, false) or print_r(error_get_last());

這樣就可以正常執行了, 而 Stored Procedure 的參數的資料型別也可以改成

1
2
3
4
5
6
7
CREATE PROCEDURE MyPagingRecordSet
  @strSQL text,        --查詢 sql,如 select * from [user]
  @PageIndex INT = 1,  --查詢的頁號
  @PageSize INT = 30   --每頁顯示紀錄數
AS
--省略內容
GO

是否要改, 就看執行上是否有其他問題了, 目前沒改也可以執行.

Leave a Comment

將Zen Cart購物車系統修改MySQL連接指定為UTF-8字元集

國外開發的系統做了語系 utf-8 格式中文化處理之後使用系統輸入中文資料,使用 phpMyAdmin 連接 MySQL 資料庫查看還是會有儲存亂碼的問題。所以還是自行指定 Zen Cart 的資料庫連線過程會比較妥當。

請修改 includes\classes\db\mysql 目錄下的 query_factory.php 檔案,尋找下列程式碼段落:

1
2
3
4
5
6
7
      if (@mysql_select_db($zf_database, $this->link)) {
        $this->db_connected = true;
        return true;
      } else {
        $this->set_error(mysql_errno(),mysql_error(), $zp_real);
        return false;
      }

將其修改成

1
2
3
4
5
6
7
8
9
10
11
      if (@mysql_select_db($zf_database, $this->link)) {
        $this->db_connected = true;
       // *** Add Start ***
       mysql_query("SET NAMES 'utf8'", $this->link);
       mysql_query("SET CHARACTER SET UTF8", $this->link);
       // *** Add End ***
        return true;
      } else {
        $this->set_error(mysql_errno(),mysql_error(), $zp_real);
        return false;
      }

編輯儲存後再開始輸入中文資料就不會有亂碼問題,可以用 phpMyAdmin 確認是否正常顯示喔。

Comments (1)

幫 phpbb 論壇加上防機器人註冊的機制

自己用 phpbb 架設的討論區(www.bestlong.idv.tw),因為常常有軟體機器人來自動註冊會員,造成管理上的負擔。而這些機器人主要是為了廣告的目的。註冊時可以在會員資料輸入個人網址,而且不管是否啟動帳號都可在會員列表中看到網址,所以會被利用來提升搜尋引擎排名。若是有做到能自動啟用會員帳號的機器人,還可以進一步的發表文章內容當然就是廣告,讓管理者刪到手軟。

雖然竹貓星球中有許多 MOD 可以防堵此一問題,不過因為做法是公開的所以有可能會讓駭客加入到軟體機器人的智能當中。所以自己動手研究一下 phpbb 的程式碼,在註冊的過程中增加一些讓一般人可以判定的必要操作條件,讓機器人不會過關來達到防堵的目標。

 原本每日都有 5 個以上的機器人註冊帳號,自從加上防堵機制後果然就沒有再出現了。

Comments (2)

PHP Object Generator 幫你寫資料庫物件程式

一個滿好玩的開放原始碼的 PHP Object Generator (簡稱 POG)網站。能夠幫助程式設計師快速的產生具有 CRUD (Create、Read、Update、Delete)功能的 PHP database 物件程式碼。

只要簡單的三大步驟,首先輸入所使用的 PHP 語言版本(PHP4、PHP5、PHP5.1+)以及資料庫系統(目前只有看到 MySQL 的版本),再來輸入你想要的物件名稱,然後依序輸入所需要的欄位名稱與型態,預設只有三個欄位當然是不夠的,可以按下 [+ Add attribute] 按鈕來增加欄位數,最後按下 Generate code 的送出按鈕。

哇啦,程式碼就出來了,連建立資料表的 SQL 語法都幫你產生好了。所產生的程式碼會自動幫你加入一個以物件名稱加上 id 當作欄位名稱的自動編號欄位作為主鍵。

不過單就所產生出來的程式碼來說,對於想學習 PHP 程式設計的人很具有參考價值喔。

PHP Object Generator Form

網址:http://www.phpobjectgenerator.com/

Leave a Comment

  • 工商服務

    廣告讀取中...
  • 近期迴響

  • 標籤

  • 彙整