這個修正主要是解決登入後無法取得權限的問題。
修改檔案: includes/session.inc
尋找:
function sess_read($key) {
global $user;
// retrieve data for a $user object
修改:
function sess_read($key) {
global $user;
register_shutdown_function('session_write_close');
// retrieve data for a $user object
2006/11/18
2006/11/16
我所使用的程式編輯器
基本上有兩個,一個是PSPad,另一個是EmEditor。
我最早是用EmEditor來寫程式,這也是我預設的文字編輯器,原因無他,就是因為對於各種編碼的支援。
而PSPad,則是我最近愛用的,主要原因有兩個:
當然啦,如果有自動的Code Hint那就更好了!
不過最近看PSPad的論壇,這幾天有些使用者在給作者建議一些Bug Tracker的系統,不過作者似乎興趣缺缺~
我最早是用EmEditor來寫程式,這也是我預設的文字編輯器,原因無他,就是因為對於各種編碼的支援。
而PSPad,則是我最近愛用的,主要原因有兩個:
- UTF8 w/o BOM的支援。
- Code Explorer的方便。
當然啦,如果有自動的Code Hint那就更好了!
不過最近看PSPad的論壇,這幾天有些使用者在給作者建議一些Bug Tracker的系統,不過作者似乎興趣缺缺~
這裡的第一篇
其實是這樣的,我常發表的東西有許多是程式碼,所以要找個比較容易操作的部落格不太容易。
今天又多了一項比較基準,就是不會強制設定字型的,這邊可以自己改CSS。
字型的議題是因為我看了這篇:
目前用的佈景主題是redBird2再加上自行修改的CSS,用這個主題是因為:
今天又多了一項比較基準,就是不會強制設定字型的,這邊可以自己改CSS。
字型的議題是因為我看了這篇:
將網頁的字型換成「微軟正黑體」然後把IE跟FF都改過來了,結果發現有些網站還是醜醜的,當然包括我之前在 Live.com 上面的部落格~
目前用的佈景主題是redBird2再加上自行修改的CSS,用這個主題是因為:
- 蠻乾淨的,而且是兩欄式的配置。
- 最上方的Banner不會太高。
- 對於Firefox的支援。
2006/11/11
字串解析物件
這是我參考 PEAR:DB 裡面的 prepare 部份寫出來的一個字串解析與取代的物件。
它可以載入一張函數表,根據這張函數表來對字串中的一些字元作轉換的動作,有點類似 sprintf 函數,不過每個字元的轉換可以自訂(這也就是函數表的功用)
class 字串解析 {
private $快取 = array();
private $解析表 = array();
private $例外字元 = '';
function 載入(&$解析表 = array(), $例外字元 = '', $取代 = true) {
if (mb_strlen($例外字元) < 2) {
$this->例外字元 = $例外字元;
}
if ($取代) {
$this->解析表 = array();
}
foreach ($解析表 as $字元 => $函數) {
if (mb_strlen($字元) == 1 && is_callable($函數)) {
$this->解析表[$字元] = $函數;
}
}
unset($this->解析表[$this->例外字元]);
$this->快取 = array();
}
function &解析($樣板, $快取 = true) {
$堆疊 = array();
$輸出 = array();
$前字 = ' ';
$長度 = mb_strlen($樣板);
for ($索引 = 0; $索引 < $長度; $索引++) {
$字元 = mb_substr($樣板, $索引, 1);
if (array_key_exists($字元, $this->解析表)) {
if ($前字 == $this->例外字元) {
array_pop($堆疊);
$堆疊[] = $字元;
} else {
$輸出[] = implode('', $堆疊);
$輸出[] = $字元;
$堆疊 = array();
}
} else {
$堆疊[] = $字元;
}
$前字 = $字元;
}
$輸出[] = implode('', $堆疊);
if ($快取) {
$this->快取[] = &$輸出;
end($this->快取);
$索引 = key($this->快取);
return $索引;
} else {
return $輸出;
}
}
function 代換($樣板, &$參數 = array()){
$堆疊 = array();
if (isset($this->快取[$樣板])) {
$解析 = &$this->快取[$樣板];
} else {
$解析 = $this->解析($樣板, false);
}
$索引 = 0;
foreach ($解析 as $字串) {
if (array_key_exists($字串, $this->解析表) && isset($參數[$索引])) {
$堆疊[] = call_user_func($this->解析表[$字串], $參數[$索引]);
$索引++;
} else {
$堆疊[] = $字串;
}
}
return implode('', $堆疊);
}
}
它可以載入一張函數表,根據這張函數表來對字串中的一些字元作轉換的動作,有點類似 sprintf 函數,不過每個字元的轉換可以自訂(這也就是函數表的功用)
class 字串解析 {
private $快取 = array();
private $解析表 = array();
private $例外字元 = '';
function 載入(&$解析表 = array(), $例外字元 = '', $取代 = true) {
if (mb_strlen($例外字元) < 2) {
$this->例外字元 = $例外字元;
}
if ($取代) {
$this->解析表 = array();
}
foreach ($解析表 as $字元 => $函數) {
if (mb_strlen($字元) == 1 && is_callable($函數)) {
$this->解析表[$字元] = $函數;
}
}
unset($this->解析表[$this->例外字元]);
$this->快取 = array();
}
function &解析($樣板, $快取 = true) {
$堆疊 = array();
$輸出 = array();
$前字 = ' ';
$長度 = mb_strlen($樣板);
for ($索引 = 0; $索引 < $長度; $索引++) {
$字元 = mb_substr($樣板, $索引, 1);
if (array_key_exists($字元, $this->解析表)) {
if ($前字 == $this->例外字元) {
array_pop($堆疊);
$堆疊[] = $字元;
} else {
$輸出[] = implode('', $堆疊);
$輸出[] = $字元;
$堆疊 = array();
}
} else {
$堆疊[] = $字元;
}
$前字 = $字元;
}
$輸出[] = implode('', $堆疊);
if ($快取) {
$this->快取[] = &$輸出;
end($this->快取);
$索引 = key($this->快取);
return $索引;
} else {
return $輸出;
}
}
function 代換($樣板, &$參數 = array()){
$堆疊 = array();
if (isset($this->快取[$樣板])) {
$解析 = &$this->快取[$樣板];
} else {
$解析 = $this->解析($樣板, false);
}
$索引 = 0;
foreach ($解析 as $字串) {
if (array_key_exists($字串, $this->解析表) && isset($參數[$索引])) {
$堆疊[] = call_user_func($this->解析表[$字串], $參數[$索引]);
$索引++;
} else {
$堆疊[] = $字串;
}
}
return implode('', $堆疊);
}
}
2006/06/13
滑鼠移過圖形做兩張圖切換的方法
要做到這件事情,需要前後端程式互相配合。
前端程式(JavaScript):
<script>
function 切換圖形(編號, 顯示, 隱藏) {
顯示 = document.getElementById(編號 + "_" + 顯示).style;
隱藏 = document.getElementById(編號 + "_" + 隱藏).style;
if ("none" != 隱藏.display) {
隱藏.display = "none";
}
if ("inline" != 顯示.display) {
顯示.display = "inline";
}
return;
}
</script>
後端程式(PHP):
function &顯示導覽($絕對路徑, $絕對網址, $編號, $主圖檔, $副圖檔 = '') {
if (false == file_exists(路徑修正("$絕對路徑/$主圖檔", false, true))) {
return '';
} else if ('' == $副圖檔 || false == file_exists(路徑修正("$絕對路徑/$副圖檔", false, true))){
return '<img border="0" src="' . 路徑修正("$絕對網址/$主圖檔") .'" />';
} else {
$主圖檔 = '<img border="0" style="display:inline;" id="' . $編號 . '_0" onmouseover="切換圖形(' . "$編號, 1, 0);" . '" src="' . 路徑修正("$絕對網址/$主圖檔") .'" />';
$副圖檔 = '<img border="0" style="display:none;" id="' . $編號 . '_1" onmouseout="切換圖形(' . "$編號, 0, 1);" . '" src="' . 路徑修正("$絕對網址/$副圖檔") .'" />';
return $主圖檔 . $副圖檔;
}
}
前端程式(JavaScript):
<script>
function 切換圖形(編號, 顯示, 隱藏) {
顯示 = document.getElementById(編號 + "_" + 顯示).style;
隱藏 = document.getElementById(編號 + "_" + 隱藏).style;
if ("none" != 隱藏.display) {
隱藏.display = "none";
}
if ("inline" != 顯示.display) {
顯示.display = "inline";
}
return;
}
</script>
後端程式(PHP):
function &顯示導覽($絕對路徑, $絕對網址, $編號, $主圖檔, $副圖檔 = '') {
if (false == file_exists(路徑修正("$絕對路徑/$主圖檔", false, true))) {
return '';
} else if ('' == $副圖檔 || false == file_exists(路徑修正("$絕對路徑/$副圖檔", false, true))){
return '<img border="0" src="' . 路徑修正("$絕對網址/$主圖檔") .'" />';
} else {
$主圖檔 = '<img border="0" style="display:inline;" id="' . $編號 . '_0" onmouseover="切換圖形(' . "$編號, 1, 0);" . '" src="' . 路徑修正("$絕對網址/$主圖檔") .'" />';
$副圖檔 = '<img border="0" style="display:none;" id="' . $編號 . '_1" onmouseout="切換圖形(' . "$編號, 0, 1);" . '" src="' . 路徑修正("$絕對網址/$副圖檔") .'" />';
return $主圖檔 . $副圖檔;
}
}
2005/06/12
另外一個用了一點正規式寫出來的路徑修正函數
這個做法跟之前的比較,再於對要處理的字串先做一些處理,以減少之後在迴圈中判斷的複雜度。
function &路徑修正($路徑, $編碼 = false, $調整 = false) {
$陣列 = explode('://', strtr($路徑, '\\', '/'), 2);
// 取代 '/./', '/ /', '//' 這三類字串成為 '/'
$比對 = '/\/((([\s]+)|([\s]*\.[\s]*))?\/)+/';
$取代 = '/';
if (2 == count($陣列)) {
$前綴 = $陣列[0] . '://';
$陣列 = explode('/', preg_replace($比對, $取代, $陣列[1]));
} else {
$前綴 = '';
$陣列 = explode('/', preg_replace($比對, $取代, $陣列[0]));
}
$路徑 = array();
foreach ($陣列 as $變數) {
$測試 = trim($變數);
if ('..' == $測試) {
$測試 = end($路徑);
if ('' == $測試 || '..' == $測試) {
$路徑[] = '..';
} else {
array_pop($路徑);
}
} else if (false == $編碼) {
$路徑[] = $變數;
} else {
$路徑[] = urlencode($變數);
}
}
$路徑 = implode('/', $路徑);
if ('' != $前綴) {
$路徑 = $前綴 . $路徑;
} else if ($調整 && (PHP_OS == 'WIN32' || PHP_OS == 'WINNT')){
$路徑 = strtr($路徑, '/', '\\');
}
return $路徑;
}
function &路徑修正($路徑, $編碼 = false, $調整 = false) {
$陣列 = explode('://', strtr($路徑, '\\', '/'), 2);
// 取代 '/./', '/ /', '//' 這三類字串成為 '/'
$比對 = '/\/((([\s]+)|([\s]*\.[\s]*))?\/)+/';
$取代 = '/';
if (2 == count($陣列)) {
$前綴 = $陣列[0] . '://';
$陣列 = explode('/', preg_replace($比對, $取代, $陣列[1]));
} else {
$前綴 = '';
$陣列 = explode('/', preg_replace($比對, $取代, $陣列[0]));
}
$路徑 = array();
foreach ($陣列 as $變數) {
$測試 = trim($變數);
if ('..' == $測試) {
$測試 = end($路徑);
if ('' == $測試 || '..' == $測試) {
$路徑[] = '..';
} else {
array_pop($路徑);
}
} else if (false == $編碼) {
$路徑[] = $變數;
} else {
$路徑[] = urlencode($變數);
}
}
$路徑 = implode('/', $路徑);
if ('' != $前綴) {
$路徑 = $前綴 . $路徑;
} else if ($調整 && (PHP_OS == 'WIN32' || PHP_OS == 'WINNT')){
$路徑 = strtr($路徑, '/', '\\');
}
return $路徑;
}
2005/06/04
路徑修正函數
realpath有很多情況不能處哩,所以自己寫了一個路徑修正的程式去配合...
修正一個小錯誤...
function 路徑修正($路徑, $編碼 = false, $調整 = false) {
$陣列 = explode('://', strtr($路徑, '\\', '/'), 2);
if (2 == count($陣列)) {
$前綴 = $陣列[0];
$陣列 = explode('/', $陣列[1]);
} else {
$前綴 = '';
$陣列 = explode('/', $陣列[0]);
}
$路徑 = array();
foreach ($陣列 as $變數) {
$測試 = trim($變數);
if ('..' == $測試) {
if (0 == count($路徑) || '..' == end($路徑) || (1 == count($路徑) && '' == end($路徑))) {
$路徑[] = '..';
} else {
while(1 < count($路徑) && '' == end($路徑)) {
array_pop($路徑);
}
array_pop($路徑);
}
} else if ('.' == $測試 || '' == $測試) {
continue;
} else {
if (false == $編碼) {
$路徑[] = $變數;
} else {
$路徑[] = urlencode($變數);
}
}
}
$路徑 = implode('/', $路徑);
if ('' != $前綴) {
$路徑 = "$前綴://$路徑";
}
if ((PHP_OS == 'WIN32' || PHP_OS == 'WINNT') && '' == $前綴 && true == $調整) {
$路徑 = strtr($路徑, '/', '\\');
}
return $路徑;
}
修正一個小錯誤...
function 路徑修正($路徑, $編碼 = false, $調整 = false) {
$陣列 = explode('://', strtr($路徑, '\\', '/'), 2);
if (2 == count($陣列)) {
$前綴 = $陣列[0];
$陣列 = explode('/', $陣列[1]);
} else {
$前綴 = '';
$陣列 = explode('/', $陣列[0]);
}
$路徑 = array();
foreach ($陣列 as $變數) {
$測試 = trim($變數);
if ('..' == $測試) {
if (0 == count($路徑) || '..' == end($路徑) || (1 == count($路徑) && '' == end($路徑))) {
$路徑[] = '..';
} else {
while(1 < count($路徑) && '' == end($路徑)) {
array_pop($路徑);
}
array_pop($路徑);
}
} else if ('.' == $測試 || '' == $測試) {
continue;
} else {
if (false == $編碼) {
$路徑[] = $變數;
} else {
$路徑[] = urlencode($變數);
}
}
}
$路徑 = implode('/', $路徑);
if ('' != $前綴) {
$路徑 = "$前綴://$路徑";
}
if ((PHP_OS == 'WIN32' || PHP_OS == 'WINNT') && '' == $前綴 && true == $調整) {
$路徑 = strtr($路徑, '/', '\\');
}
return $路徑;
}
訂閱:
文章 (Atom)