顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


主題 - appleboy

頁: [1] 2
1
http://www.codeigniter.org.tw/blog/codeigniter_2.1.3_released

昨天官網 Release 2.x stable 版本 2.1.3

本次沒有什麼重大修改,除了一些安全性修正以外 (csrf_verify)

並不會有任何新功能,官方團隊目前還是致力於 3.0.x 版本分支

歡迎參考 change log

http://www.codeigniter.org.tw/user_guide/changelog.html#2.1.3

2.1.3 檔案下載

http://www.codeigniter.org.tw/downloads/file/CodeIgniter_2.1.3

如果有任何問題可以到討論區發問

http://www.codeigniter.org.tw/forum/

謝謝

2
Blog 原文線上看

在我上禮拜 8/20,8/21 參加 COSCUP 2011 會議的時候,CodeIgniter 偷偷 Release 了 2.0.3 版本,也不算偷偷 Release,因為剛好8月20,21號也是 CICON 2011 會議,CodeIgniter 想給來聽演講的學員們一個驚喜吧,也因為這個 CodeIgniter Con 2011 會議,官方也宣佈將轉換版本控制,原本放在 bitbucket 的程式碼也都轉換到 Github 上面了,另外順便把 CodeIgniter Reactor 取消後面 Reactor 字串,改成 CodeIgniter 了,那 Reactor 呢,就變成 Develop 分支,這個消息真的是太棒了,轉換到大家所熟悉的 Git 版本控制,有些常常在貢獻程式碼的開發者,都是在使用 Github。不管是不是 CodeIgniter,其他許多 opensource 包含 jQuery, phpBB…等都是在使用 github。

直接下載 2.0.3 玩看看吧

繁體中文 CodeIgniter 官方公告

3
論壇網址: http://ci.wuboy.twbbs.org/forum/viewtopic.php?f=6&t=2714
部落格:  http://blog.wu-boy.com/2010/10/03/2402/

在今年3月11日 EllisLab 發布了一則新訊息,信件內容大致上提到,他們將會改變程式的版本控制軟體,由原本的 Subversion 轉換到 Mercurial,CodeIgniter 也選擇了網路知名版本控制 BitBucket 網站來存放 CI 的程式碼,CI 團隊目前致力於 CodeIgniter 2.0 作開發,如果要取得程式碼,可以透過這裡,利用底下指令來取得:

代碼: [選擇]
hg clone http://bitbucket.org/ellislab/codeigniter
這次我們來看看 CodeIgniter 2.0 跟 1.7.2 的版本差異性,雖然說這些不是官方公告的,可是也是改變蠻多的,也許有哪些沒有列到的,之後再慢慢補:

1. PHP4 正式掰掰
我想使用 CI 最方便的地方,就是支援 PHP5 & PHP4,方便使用者轉換網站到 CI 上面,現在 CI 2.0 之後將完全不支援 PHP4,一些舊有的函式會在 2.1 之後也不支援 PHP4 了,我想這樣整個 CI 的架構會縮小許多,PHP4 也太多漏洞了,這樣跟 Kohana PHP Framwork(原本從 CI branch 出來的) 一樣只會支援 PHP5 了,效能應該可以增加不少

2. Scaffolding 正式移除
Scaffolding 對於沒有後台管理的網站,臨時可以修改新增或者是刪除資料庫,不過相當危險,所以 CI 正式移除它,可以看一下中文文件。

3. 重新命名核心資料夾
將 system/codeigniter/ 名稱變成 system/core/,核心程式 Router, Loader, Output 等,都可以用 application/core 之中去替換(參考)

4. system/plugins/ 正式走入歷史
其實本來就沒有必要有這資料夾,這跟 library 有衝突性的,應該說很類似差不多,我真的不知道為什麼會有此資料夾

5. 正式支援 jQuery
CI 開始支援 jQuery,檔案 (system/libraries/javascript/Jquery.php) 這跟 database library 差不多 ,之後陸續更多 javascript 支援(參考)

6. 新增 Drivers Library 功能
這功能在 Kohana 這套 Framework 已經實做出來,這對於 CI 是一個新的 Library,他能擁有一個父類(parent class),可以很多子類(child classes),最好的範例就是 JavaScript library,他是一個 parent class,而 jQuery Driver 是 child class,還有其他例子,例如 Cache class 它底下就會有 Memcache, APC 等諸如此類的 Driver。

7. 新增 /third_party/ 資料夾
在 application 裡面會多出 third_party 資料夾,它會提供最基本的一些資料夾,包含 libraries, models, helpers, 等,架構如下

/system/application/third_party/foo_bar
config/
helpers/
language/
libraries/
models/

8. Cookie helper 改變
將 system/helpers/cookie_helper.php 拉出來整合到 Input Class。(參考)

目前大致上列出上面比較重要的,其他的可以參考底下連結:

CodeIgniter 2.0 and Mercurial Transition
CodeIgniter 2.0 In Progress – The Critical Changes, Implications, and What You Should Know
CodeIgniter 2.0: Everything you need to know

4
本文原文:『高雄美食』道明中學武廟路好吃臭豆腐

名稱:臭豆腐(正確名稱我不知道)
地址:高雄市武廟路
價位:大份50 小份35
時間:每天 15:30~19:40



我相信在高雄要吃到好吃的臭豆腐,無非就是豪記臭豆腐,大家可以參考懶喵兒滴窩:『
[高雄-三民]豪記臭豆腐王【港式臭豆腐專賣店】 (新址)』,但是這次要來介紹也許在高
雄比較少人知道的路邊攤臭豆腐,它位於高雄市武廟路上一間不起眼的臭豆腐,道明中學
對面巷子走進去接到武廟路就可以吃到了,營業時間是下午15:30~19:40,時間不長,但
是大排長龍阿,想要去吃的,最好不要挑晚餐時間,因為自己那個時間去吃,至少等了半
小時。

底下是大份餐點50元,真的還蠻大一份的,至少跟其它地方比起價位,這裡價位跟份量還
蠻傳統的



香香脆脆的,那醬汁也是調配的剛剛好



50元一份,一個男生吃剛剛好喔,泡菜可以無限暢飲







如果想吃到小時候傳統臭豆腐,一定要來這家品嚐看看的

本文原文:『高雄美食』道明中學武廟路好吃臭豆腐

5
原文:好用 Debug PHP 工具 FirePHP for FireFox on CodeIgniter



之前介紹過 javascript FireFox Debug 工具 FireBug (Using firebug for firefox 除錯 javascript),今天來介紹 PHP 除錯工具 FirePHP,它可以輸出 PHP 資料到 FireBug console 介面,方便解決 PHP 相關問題,而不會去影響線上網站的畫面,安裝方式非常簡單,請先安裝 FireFox addon for FirePHP,重新啟動 FireFox 這樣就安裝成功了,接下來就是 include FirePHP Library 檔案,就可以正常使用了。另外還會介紹如何安裝到 CodeIgniter PHP Framework

Firebug: https://addons.mozilla.org/en-US/firefox/addon/1843
FirePHP: https://addons.mozilla.org/en-US/firefox/addon/6149

底下先看畫面:

代碼: [選擇]
<?php
$array 
= array("a" => "1""b" => "2");
$firephp->info($array"info");
$firephp->warn($array"warn");
$firephp->error($array"error");
?>



Install FirePHP 安裝
Ref : http://www.firephp.org/HQ/Install.htm
在 Zend Framework 已經有開發完成,可以參考:FirePHP and Zend Framework 1.6
下載檔案:Download FirePHPCore library version 0.3.1

unzip FirePHP (解壓縮)
您會發現 FirePHPCore 底下有四個檔案,其中 fb.php && FirePHP.class.php 給 PHP 5 用的,另外兩個 fb.php4 && FirePHP.class.php4 則是給 PHP 4 專屬,本文只會以 PHP 5 當作範例。

include FirePHP file
新增一個 index.php 檔案,在最上面寫入:

代碼: [選擇]
require_once('FirePHPCore/FirePHP.class.php');Start output buffering
假設您在 php.ini 有設定 output_buffering 為 on,就可以省略此步驟

代碼: [選擇]
<?php ob_start();?>測試完整檔案
代碼: [選擇]
<?php
require_once(&#39;FirePHPCore/FirePHP.class.php&#39;);
ob_start();
$var = array(&#39;i&#39;=>10, &#39;j&#39;=>20);
$firephp FirePHP::getInstance(true); 
$firephp->log($var, &#39;WARN&#39;);
?>
FirePHP 預設是啟動的,如果您要將此關閉,可以使用底下程式碼將其關閉:

代碼: [選擇]
/**
   * Enable and disable logging to Firebug
   *
   * @param boolean $Enabled TRUE to enable, FALSE to disable
   * @return void
   */
$firephp->setEnabled(false);
也可以自訂選項:
maxObjectDepth 顯示 object 資料深度
maxArrayDepth 顯示 array 資料深度
useNativeJsonEncode 設定為 false 就是代表使用 FirePHPCore 內建 JSON encoder 來取代 PHP 內建 json_encode()。
includeLineNumbers 顯示檔案名稱以及行號資訊

代碼: [選擇]
// Defaults:
$options = array('maxObjectDepth' => 10,
                 'maxArrayDepth' => 20,
                 'useNativeJsonEncode' => true,
                 'includeLineNumbers' => true);


Install FirePHP on CodeIgniter
1. move fb.php and FirePHP.class.php into system/application/libraries directory.
2. rename FirePHP.class.php to Firephp.php, and fb.php to Fb.php.
3. edit Firephp.php file.

代碼: [選擇]
#
# Find 
#
<?php
#
# Replace
#
if ( ! defined(&#39;BASEPATH&#39;)) exit(&#39;No direct script access allowed&#39;);
edit Fb.php file

代碼: [選擇]
#
# Find 
#
<?php
#
# Replace
#
if ( ! defined(&#39;BASEPATH&#39;)) exit(&#39;No direct script access allowed&#39;);
Edit config/autoload.php file

代碼: [選擇]
#
# Find
#
$autoload['libraries'] = array();
#
# Replace
#
$autoload['libraries'] = array("firephp", "fb");
[size=150]How to use it?[/size]
代碼: [選擇]
<?php
function index()
{
  
$a "test";
  
$array = array("a" => "1""b" => "2");       
  
//$this->firephp->log($a, &#39;ERROR&#39;);
  //$this->firephp->log($a, &#39;ERROR&#39;);    
  
$this->fb->setEnabled(true);    
  
$this->fb->info($array"info");
  
$this->fb->warn($array"warn");
  
$this->fb->error($array"error");
  
$this->fb->group(&#39;Test Group&#39;);
  
$this->fb->log(&#39;Hello World&#39;);
  
$this->fb->groupEnd();
}
?>


原文:好用 Debug PHP 工具 FirePHP for FireFox on CodeIgniter

6
轉貼自: http://ci.wuboy.twbbs.org/forum/viewtopic.php?f=2&t=30

CodeIgniter 終於 Release V1.7.2 版本了,官方網站也公佈了此消息,那這次跟 v1.7.2 版本有哪些不一樣呢,我想最主要應該是支援 PHP 5.3.0 了
  • 相容於 PHP 5.3.0
  • 新增 Cart Class 類別
  • 改善 Form helper 函數
  • 新增 is_php() 到 Common functions 來更有善的比較 PHP 版本
  • 無數個 bug 修正
  • 修改 show_error() 函數功能
更多的 bug 修正,可以觀看 change log,我也順便了 send-pr 給 FreeBSD ports maintainer 請他 update 到 1.7.2:ports/138848,台灣的官網也需要來修正了,已經更新了 v1.7.2 上去,至於繁體中文文件方面還沒更新,有時間會把它更新,如果有任何問題,可以先到論壇留言找我。

網址:http://blog.wu-boy.com/2009/09/16/1657/

7
原文網站:http://blog.wu-boy.com/2009/08/19/1593/ 

之前在高雄開了一堂:[CodeIgniter] Open Source PHP Web Framework 系列講座,在上課過程,我很強調大家可以多多參考網路上的範例來學習,所以找了官方網站的程式碼想分享給大家,希望大家看完程式碼,可以針對 CodeIgniter 的 Model Views Controller 有比較深入的瞭解,如果有不懂的地方,可以來論壇這邊提出問題,我會儘快回答大家,底下是程式碼的下載網址,包含論壇程式 PHPBB3,以及所有影片程式碼,大家可以參考看看:

檔案下載

裡面有需要注意的,就是 .htaccess 檔案:

代碼: [選擇]
RewriteEngine on
RewriteBase /
RewriteCond $1 !^(videos|download_files|user_guide|forum|index\.php|admin|css|flash|images|img|includes|js|language|captcha|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

裡面會附上 db.sql 檔案,這是資料庫檔案,請麻煩匯入到您的資料庫,然後修改 system/application/config/database.php 內容的資料庫相關資訊,這樣就可以了。

8
原文網址: http://blog.wu-boy.com/2009/05/17/1349/

本人目前正在推廣 CodeIgniter 官方中文網站,這套 MVC 在我使用起來還蠻適合新手學習的,也非常容易上手的一套 MVC Web development 架構 ,希望推廣給台灣繁體 php web 開發人員,即使您之前沒有用過 MVC 架構,只要懂的一點 PHP 語法,基本 function 會使用,基本上就可以直接來使用 CodeIgniter,在這裡徵求對 php 或者 CodeIgniter 翻譯繁體中文有興趣的網友或者是使用者們,可以加入繁體中文的翻譯計畫,我在 github 開了CodeIgniter translation 的 repository,網址是:

http://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan/tree/master

目前翻譯文件不多,只有三個人,徵求更多使用者可以加入翻譯計畫,希望可以造福台灣的使用者,也當然是推廣這套 MVC,如果想加入可以主動跟我聯絡,另外 jiz 使用者也針對程式中文化部份開了一個 repository,在底下網址

http://github.com/jiz/CodeIgniter/tree/master

目前可以接受三種方式:

    * 如果你有 github 帳號,請把帳號給我,我會加入共同作者,這樣就可以直接 commit merge checkout pull push 進去 repository
    * 把 patch 檔案寄給我,diff -u 原檔名 翻譯後檔名  > 檔名.patch
    * 或者是將片段翻譯,寄給我,並告知識翻譯哪個部份這樣就可以了

我的聯絡方式:http://blog.wu-boy.com/contact-subscribe/
或者是上 irc : irc.freenode.net codeigniter.tw 頻道

底下是整理的 git 教學網站:

http://github.com/guides/home
providing your ssh key
http://github.com/guides/providing-your-ssh-key

9

網誌版: http://blog.wu-boy.com/2009/04/20/1180/

繼上一篇 [PHP] 好用 Web Framework : CodeIgniter 安裝教學 之後,這次來紀錄一下 Database Class 的用法,我想官方網站都已經寫的很詳細了,就大概快速講一下我的一些用法跟心得,其實最主要講的是內建的 Active Record Class,它可以快速撰寫 SQL 語法,不必打 where 或者是 From 這些字眼,insert update select 都可以利用 Active Record Class 很簡單的撰寫出來喔,它也幫忙簡單的檢查 escape SQL Injection,舉的簡單例子大概就知道了:

假設底下這個簡單的 join 一個表格的 select 語法
代碼: [選擇]
$query = $this->db->query("SELECT a.news_id, a.news_name, a.add_time FROM project_news a
 left join project_news_categories b on a.categories_id = b.categories_id
where news_id = '".$id."' order by news_top DESC, a.add_time DESC
");

利用 Active Record Class 可以改寫成:
代碼: [選擇]
$this->db->select('a.news_id, a.news_name, a.add_time');
$this->db->from('project_news a');
$this->db->join('project_news_categories b', 'a.categories_id = b.categories_id', 'left');
$this->db->order_by("news_top DESC, a.add_time DESC");
$this->db->where('news_id', $id);


是不是覺得在閱讀方面很容易瞭解呢,那之後要改 sql 語法,也可以快速找到要改的地方,交接給其他程式組員,在學習或者是除錯方面都相當容易的喔。

首先介紹設定 database 的 config 檔案 Database Configuration
代碼: [選擇]
$active_group = "default";
$active_record = TRUE;

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "1234";
$db['default']['database'] = "vbs";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

上面可以在 application/config/ 底下找到 database.php 檔案裡面,$active_group 是用來設定預設 load 哪一個 DB config 檔案,那預設就是 default 這個 name 了,$active_record,用來設定啟動 Active Record Class。

連接 MySQL 資料庫,基本連接方式如下:
代碼: [選擇]
$this->load->database();
可以傳入三個參數,其實如果沒有要使用多重資料庫的話,就不用設定三個參數,第一個參數,就是傳入 db 參數的 array 變數,第二個是傳入 TRUE/FALSE (boolean),用來設定多重資料庫,第三個參數傳入TRUE/FALSE (boolean),用來設定 enable the Active Record class。

簡單的一些基本 sql 語法可以參考 線上手冊,我的建議可以使用 Active Record Class,這樣方便防止 SQL Injection,不然就要利用內建的 $this->db->escape() 導入參數,其實用 Active Record Class 就會自動幫忙加入了喔,例如用了 $this->db->where(); 看說明文件後面會註明:

   
引用
Note: All values passed to this function are escaped automatically, producing safer queries.

撰寫一個範例測試看看,首先建立一個 model.php 檔案,命名為 news_model.php,放到 application/models 裡面:
代碼: [選擇]
<?php
class News_model extends Model {

    var 
$title   = &#39;&#39;;
    
var $content = &#39;&#39;;
    
var $date    = &#39;&#39;;

    
function News_model()
    {
      
// Call the Model constructor
      
parent::Model();
      
/* load 資料庫 */
      
$this->load->database();
    }
   
    function 
get_last_entries($count)
    {
      
$this->db->select(&#39;a.news_id, a.news_name, a.add_time&#39;);
      
$this->db->from(&#39;project_news a&#39;);
      
$this->db->join(&#39;project_news_categories b&#39;, &#39;a.categories_id = b.categories_id&#39;, &#39;left&#39;);
      
$this->db->order_by("news_top DESC, a.add_time DESC");
      
$this->db->limit($count);    
      
$query $this->db->get(&#39;&#39;);
      
$row $query->result_array();
      
$query->free_result(); // The $query result object will no longer be available        
      
return $row;
    }
?>

檔案內容裡面 News_model 第一個字母必須命名為大寫,再來建立 Controller 檔案
代碼: [選擇]
<?php
class Vbs extends Controller {
 
  function 
__construct()
  {
    
parent::Controller();  
  }
 
  function 
index()
  {
    
$data[&#39;news_data&#39;] = $this->news_model->get_last_entries(&#39;5&#39;);
    
$page_title = &#39;首頁&#39;;
    
$this->header($page_title);
    
$this->load->view(&#39;index_content&#39;, $data);
    
$this->footer();    
  }  
}
?>

在 controller 裡面,我們沒有 load model,$this->load->model(’news_model’);,可以在 config/autoload.php 加入:
代碼: [選擇]
/*
| -------------------------------------------------------------------
|  Auto-load Models
| -------------------------------------------------------------------
| Prototype:
|
|   $autoload['model'] = array('model1', 'model2');
|
*/

$autoload['model'] = array("news_model");

這樣我們每個 controller 就都可以使用 news_model,而不必在寫入底下這一行,有些常用的的 model 都可以參考 Auto-loading Resources 方式加入即可
代碼: [選擇]
$this->load->model('news_model');
這時候在建立 view 檔案就大致上完成了,放在 application/views 裡面,這樣基本的 DB 連接以及取出資料都會了,新增刪除修改都在文件裡面講的很清楚,這裡就不多說了。

網誌版: http://blog.wu-boy.com/2009/04/20/1180/

10
好用 Web Framework : CodeIgniter 安裝教學

最近都在 survey 一堆 PHP Web Framework,自己想學一套可以馬上上手的,其實因為目前在 PHP的開發上面講求速度,以及程式的可維護性,雖然我自己有一套自己的開發方法,包含包好的 SQL Class 以及上傳模組,不過還是覺得熟悉一套MVC 架構的寫法,將來維護或者是團隊合作方面會比較好分工,在小專案上面還可以自己來,但是大型專案就必須靠 MVC Framework了,畢竟一個人寫程式,永遠比不上團隊合作,紀錄一下最近找到的一些網路比較多人用的 FrameWork:
上面這幾套,我目前用過 Zend Framework 跟 CakePHP,這兩套在文件方面都非常多,以台灣的開發者相當推崇這兩套,至於好不好上手,看個人的狀況了,在我用一個禮拜開發 Zend AUTH 跟 login 還有 Google Calendar API,可以參考 Zend Framework Tag,那這不是重點,這次要介紹 Web Framework : CodeIgniter,今天花了一些時間安裝了 CodeIgniter,來紀錄安裝心得,包含 .htaceess 設定,css 路徑的解決,那也可以參考這一篇中文安裝,大陸那邊已經有了簡體版的官方網站,不過英文官方文件就已經寫的很清楚了,大家可以閱讀英文就可以了。
安裝方法如下:首先下載最新版 1.7.1版本,解壓縮之後,可以看到兩個資料夾 system 跟 user_guide 還有一個 index.php 檔案,user_guide這裡面就跟網站上的 Doc 是一樣的,方便您離線閱讀文件,那重點只剩下 system 跟 index.php了,其實如果都沒有改的話,只要瀏覽器打入 http://網址,這樣就可以看到 welcome 的畫面了



這樣其實很容易吧,您一定很想知道怎麼會預設讀這個檔案呢,那就是在 system/application/config 裡面的 routes.php 裡面設定的,找到

代碼: [選擇]
$route['default_controller'] = "welcome";這就是預設的 Controller,所以 index.php 會先去載入 welcome.php 這隻檔案,放在 system/application/controllers/welcome.php

代碼: [選擇]
<?php



class Welcome extends Controller {



    function 
Welcome()

    {

        
parent::Controller();   

    }

    

    function 
index()

    {

        
$this->load->view(&#39;welcome_message&#39;);

    
}

}



/* End of file welcome.php */

/* Location: ./system/application/controllers/welcome.php */
注意 Conrtroller 第一個字母要大寫喔,所以是寫 Welcome,網址只需要打 http://localhost/CodeIgniter/ 這樣就可以看到畫面,那也可以打入http://localhost/CodeIgniter/index.php/welcome ,會看到同樣的畫面,我們可以利用mod_rewrite 方式把 index.php 拿掉,只要在根目錄新增 .htaccess 檔案,寫入底下程式碼:
代碼: [選擇]
RewriteEngine on

RewriteBase /CodeIgniter/

RewriteCond $1 !^(index\.php|css|flash|images|img|includes|js|language|robots\.txt)

RewriteRule ^(.*)$ index.php/$1 [L]

首先因為我的子目錄是 CodeIgniter,所以必須設定 RewriteBase,如果你是根目錄,那就取消這行,RewriteCond這邊如果網站有 images 或者 css 檔案,請加上去,不然所有檔案都被導入到 index.php,這樣網站圖片 css效果都不會出來,可以參考 wiki 或者是論壇這篇文章,接下來自己寫一個 Blog.php 的 controller 檔案,檔內容如下:
代碼: [選擇]
<?php

class Vbs extends Controller {



  function 
__construct()

  {

      
parent::Controller();

  }

    

  function 
_remap($method)

  {

    if (
$method == &#39;comments&#39;)

    
{

      
$this->$method();

    }

    else

    {

      
$this->header();

      
$this->footer();

    }

  }

  

  function 
header()

  {

    
$this->load->helper(&#39;url&#39;);

    
$data = array(

      &
#39;sitename&#39; => &#39;VBS禾唐-VBS安穩煞車器 行車更安全&#39;,

      
&#39;page_title&#39; => &#39;首頁&#39;

    
);    

    
$this->load->view(&#39;header&#39;,$data);

  

  
}

    

  function 
footer()

  {

    
$this->load->view(&#39;footer&#39;);

  
}

}

?>

其中 $this->load->helper(’url’); 是抓取您設定的 url 網址
代碼: [選擇]
/*

* 這會去抓取 application/config/config.php 裡面的 $config['base_url'] = "http://localhost/CodeIgniter/";

*/

$this->load->helper('url');

目前還在摸索中,如果還有心得,會在繼續追加。





Related View

11
原文:Zend Framework 安裝筆記教學 Appserv + Zend Framework (一)

今天在公司上班需要用到 Zend Framework 這一套 MVC 的軟體,用來開發 Google Calendar APIs,這 API 是用 Zend Framework 下去寫得,在 Google 文件 說的很清楚,那底下來介紹一下安裝過程吧,首先環境要先有 Apache + PHP + MySQL,我本身用 Appserv 懶人套件,我是用 AppServ 2.5.10 裡面包含底下:
  • Apache 2.2.8
  • PHP 5.2.6
  • MySQL 5.0.51b
  • phpMyAdmin-2.10.3
1. 先修改 apache 設定 httpd.conf
#LoadModule rewrite_module modules/mod_rewrite.so

改成 unmark 掉
LoadModule rewrite_module modules/mod_rewrite.so

修改 include_path 在 php.ini 裡面,或者是利用 set_include_path 來修改
2. 開始安裝 Zend Framework,首先去 官方網站下載,目前版本:Zend Framework 1.7.7,了解 MVC 架構。可以參考:透視 WebMVC 這篇。


3. 資料架構:

上面這張圖就是 Zend 的目錄架構圖,我們只需要注意 application,htdocs 跟 library 就可以了,底下介紹3個資料夾的個別用途:
application 資料夾:裡面包含 controllers (MVC之C),models (MVC之M) 跟 views (MVC之V),Views 底下存放是要顯示的元件。
htdocs 資料夾:裡面 images (存放影像檔案),scripts (存放script檔) styles (存放CSS檔).htaccess (配合url rewrite之檔案) index.php (bootstrap file),這個資料夾是對應到Document root 的設定:
代碼: [選擇]
<VirtualHost *:80>

  ServerName zf-tutorial.localhost

  DocumentRoot /var/www/html/zf-tutorial/public

  <Directory "/www/cs">

    AllowOverride All

  </Directory>

</VirtualHost>

這樣只要在網址列打入 zf-tutorial.localhost 就可以對應到 localhost,然後把網址對應IP寫入到Linux:/etc/hosts 或者是Windows:c:\\windows\system32\drivers\etc\hosts,library 裡面就單一個資料夾,裡面只有Zend 這個套件,其實基本上也不用動它,升級的時厚紙需要換掉 Zend 這個資料夾即可。
接下來設定 .htaccess 跟 index.php 因為 Zend Framework會幫忙設定簡短網址,所以我們必須要設定這兩個檔案來達到全部網址都轉向 index.php,這兩個檔案都必須放到 htdocs資料夾裡面,底下就來說明這兩個檔案寫法。

htdocs/.htaccess
代碼: [選擇]
# Rewrite rules for Zend Framework

# 非 PHP 檔案不轉向到 index.php

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

# Security: Don't allow browsing of directories

# 關閉檔案列表功能

Options -Indexes

# PHP settings

# 關閉 magic_quotes_gpc register_globals

# 打開 short_open_tag

php_flag magic_quotes_gpc off

php_flag register_globals off

php_flag short_open_tag on
htdocs/index.php
代碼: [選擇]
<?php

  
/*

  * 設定 Error Report 的等級

  */  

  
error_reporting(E_ALL E_STRICT);  

  
/*

  * 設定台北時區

  */   

  
date_default_timezone_set(&#39;Asia/Taipei&#39;);  //設定時區為台北



  /*

  * 設定 include_path 固定把 library 資料夾加入 path 裡面

  */

  
define (&#39;P_S&#39;, PATH_SEPARATOR);

  
set_include_path(&#39;.&#39; .P_S .&#39;../library&#39; .P_S .&#39;../application/models/&#39; .P_S .get_include_path());



  
require_once &#39;Zend/Loader.php&#39;;

  
Zend_Loader::registerAutoload();



  
/*

  * 設定 Controller 的資料夾

  */

  
$frontController Zend_Controller_Front::getInstance();

  
$frontController->setControllerDirectory(&#39;../application/controllers&#39;);

  /*

  * 輸出程式

  */  

  
$frontController->dispatch();

  

?>
上面設定好之後,就來看一個範例吧,首先看底下的圖:

這是一張 index 的撰寫程式的圖,裡面包含 Control name,上面這張圖說明了在 index 的首頁,包含了 add editdelete 的功能,那我們必須瞭解 Control name 的命名方式跟 Zend View 的命名放置關係,Control的命名方式就是 {Contrl_Name}Controller.php 放置在 application/controller裡面,那裡面包含了indexAction(),addAction(),editAction(),deleteAction()這些功能,那對應的 html 命名方式就放在 views/scripts/{controllername}/{action_bame}.phtml 記住副檔名是 phtml,那底下是 IndexController.php 寫法。
application/controllers/IndexController.php
代碼: [選擇]
<?php

class IndexController extends Zend_Controller_Action

{

  function 
indexAction()

  {

    
$this->view->title "My Albums";

  }

  function 
addAction()

  {

    
$this->view->title "Add New Album";

  }

  function 
editAction()

  {

    
$this->view->title "Edit Album";

  }

  function 
deleteAction()

  {

    
$this->view->title "Delete Album";

  }

}

?>

會發現有4個動作,分別對應4個view 的檔案:
application/views/scripts/index/index.phtml
代碼: [選擇]
<html>

<head>

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

  <title><?php echo $this->escape($this->title); ?></title>

</head>

<body>

  <h1><?php echo $this->escape($this->title); ?></h1>

</body>

</html>

application/views/scripts/index/add.phtml
代碼: [選擇]
<html>

<head>

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

  <title><?php echo $this->escape($this->title); ?></title>

</head>

<body>

  <h1><?php echo $this->escape($this->title); ?></h1>

</body>

</html>

application/views/scripts/index/edit.phtml
代碼: [選擇]
<html>

<head>

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

  <title><?php echo $this->escape($this->title); ?></title>

</head>

<body>

  <h1><?php echo $this->escape($this->title); ?></h1>

</body>

</html>

application/views/scripts/index/delete.phtml
代碼: [選擇]
<html>

<head>

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

  <title><?php echo $this->escape($this->title); ?></title>

</head>

<body>

  <h1><?php echo $this->escape($this->title); ?></h1>

</body>

</html>

這樣大致上就可以 work 了,請打入網址:
index:http://localhost/index/index
add:http://localhost/index/add
edit:http://localhost/index/edit
delete:http://localhost/index/delete
參考網站:
Zend Framework安裝
Akra’s DevNotesGetting Started with Zend Framework
酷學園php下的MVC [Zend Framework] 教學

Related ViewTags: php, Zend Framework

原文:Zend Framework 安裝筆記教學 Appserv + Zend Framework (一)

12

原文:[jQuery] 表單取值 radio checkbox select text 驗證表單

最近在專案全面使用 jQuery 來整合後台部份,目前還沒有大量用到 AJAX 的部份,等以後有時間會全部轉換 AJAX 利用 JSON 的部份,其實之前就有寫到一篇用 datatype JSON 的方式來實現 AJAX:[jQuery] AJAX 學習筆記 (一) 如何使用 JSON 驗證使用者表單,大家可以參考看看,不過今天大概寫一下昨天在實做驗證表單取值的一些心得,在設計後台的時候,我把編輯文章跟新增文章的功能做在同一塊,然後利用 jQuery 去改變傳值狀態,利用 hidden 的 mode 欄位來決定是要新增文章還是修改文章
代碼: [選擇]
$(document).ready(function()
{
  $("#add_news_link").click(function(){
    $("#mode").attr("value", "add");
  });
})

這個時候,就把要傳送的狀態改成 add 了,不過編輯文章的資料都還留在也面上面,所以必須把很多欄位都清空,例如 textpassword textarea checkbox radio select 這些欄位全部都歸零,透過 jQuery 針對 Form 的id 值,尋找 input 欄位資訊,可以參考 jQuery Doc 的 Form Selectors 的文件,裡面提到,如果要找尋全部都欄位,就可以利用
代碼: [選擇]
$('#myForm :input')
或者是:
代碼: [選擇]
/* 前者 */
$('input:radio', myForm)

這還可以寫成
代碼: [選擇]
/* 後者 */
$('input[@type=radio]')

如果您的表單非常的大,建議可用前者,速度上面會比較快喔,所以針對整個 Form Selectors 的方式寫了一個 function 來掃全部欄位:
代碼: [選擇]
$("#news_form :input").each(
function(){
  switch($(this).attr('type')){
    case 'radio':
      /* 取消所有選取 */
      $(this).attr("checked", false);
    case 'checkbox':
      /* 取消所有選取 */
      $(this).attr("checked", false);
    break;
    case 'select-one':
      /* 把 select 元件都歸到選第一項 */
      $(this)[0].selectedIndex = 0;
    break;
    case 'text':
      /* 清空 text 來欄位 */
      $(this).attr("value", "");
    break;
    case 'password':
      /* 清空 password 來欄位 */
      $(this).attr("value", "");
    case 'hidden':
      /*
      * 不清空 hidden,通常保純此欄位     
      */
    case 'textarea':
      /* 清空 textarea 來欄位 */
      $(this).attr("value", "");
    break;
  }
});

這樣就可以清空所有欄位,不過在網路上找到更方便的 jQuery Form Plugin,這個外掛可以利用一行程式,取代掉上面的程式碼:
代碼: [選擇]
$('#news_form').clearForm();
我去看了一下程式碼,寫法就跟我差不多
代碼: [選擇]
if (t == 'text' || t == 'password' || tag == 'textarea')
    this.value = '';
else if (t == 'checkbox' || t == 'radio')
    this.checked = false;
else if (tag == 'select')
    this.selectedIndex = -1;

有興趣可以去試試看喔,那也可以檢查表單送出前欄位有無填寫完整:
代碼: [選擇]
$("#news_form").submit(
  function(e){
    if($("#news_name").val() == "") 
    {
      $("#news_name").focus();
      alert("標題沒填寫");
      return false;
    }
    else if($("#news_desc").val() == "")
    {
      $("#news_desc").focus();
      alert("內容沒填寫");
      return false;       
    }
    return true;     
  }
);

這樣檢查如果還不夠,那推薦您用 jQuery plugin: Validation,這個還不錯用,可以先試試看 demo 程式,另外這個作者也推薦剛剛說到的 jQuery Form Plugin 可以處理 AJAX 的部份喔,還不錯。
底下一些取值判斷的筆記:
代碼: [選擇]
/*
* text 欄位取值
*/
$("#news_name").val();
$("#news_name").arrt("value");
/*
* 取消 checkbox 欄位選取
*/
$(#news_top).attr("checked", false);
$(#news_top).attr("checked", "");
/*
* 判斷 checkbox 是否選取
*/
if($("#news_top").attr('checked')==undefined)
/*
* 全選 checkbox 欄位,或者反向選取
*/
$("#clickAll").click(function() {
  $("input[@name='news_top[]']").each(function() {
    if($(this).attr("checked"))
    {
      $(this).attr("checked", false);
    }
    else
    {
      $(this).attr("checked", true);
    }
  });
});
/*
* checkbox 的 value 值
*/
$('input[@name="news_top"][@checked]').val();
/*
* 選取 select 的 text 值
*/
$("select[@name='categories_id']option[@selected]").text();
/*
* 選取 select 的 value 值
*/
$("select[@name='categories_id']").val();

還有很多可以學習的,可以參考 visualjquery 這網站
參考網站:
轉:jquery radio取值,checkbox取值,select取值,radio選中,checkbox選中,select選中,及其相關
jQuery 點擊 Input / Textarea 全選、複製的寫法(Widget)
jQuery 學習筆記 (6) — 操作 DOM 物件
Related View原文:[jQuery] 表單取值 radio checkbox select text 驗證表單

13

原文:[jQuery] Javascript plotting library 畫圖 chart

沒想到 jQuery 可以做到畫圖的功能,Flot是 Javascript plotting library for jQuery,目前支援瀏覽器:Internet Explorer6/7/8,Firefox 2.x+,Safari 3.0+,Opera 9.5 和 Konqueror4.x+,瀏覽器跑起來都還不錯快,唯獨 Internet Explorer 有另外寫一個 excanvas 模擬器,也就是在 IE上面看還需要 include 另外一個 js 檔案,才可以顯示圖形,我在 google 找到一些也是 PHP Chart的好用工具,都是國外開發的:Libchart - Simple PHP chart drawing libraryXML/SWF Charts,其實還蠻多的,自己 google 就會出現一堆,不過要上去試試看。

我個人還蠻喜歡 jQuery 的,所以我就推薦 Flot 這一個 jQuery 的 library,在官網上面有很多 example 的介紹,可以去看看這裡
畫最簡單的圖,還有支援 cos sin 的三角函數喔

代碼: [選擇]
$(function () {

/*

[橫座標,縱座標]

Math.sin 支援三角函數

*/

    var d1 = [];

    for (var i = 0; i < 14; i += 0.5)

        d1.push([i, Math.cos(i)]);



    var d2 = [[0, 3], [4, 8], [8, 5], [9, 13]];



    // a null signifies separate line segments

    var d3 = [[0, 12], [7, 12], null, [7, 2.5], [12, 2.5]];

   

    $.plot($("#placeholder"), [ d1, d2, d3 ]);

});
畫出來的圖如下:


也可以加上 label 標籤喔
代碼: [選擇]
$(function () {
    var d1 = [];
    for (var i = 0; i < 14; i += 0.5)
        d1.push([i, Math.cos(i)]);

    var d2 = [[0, 3], [4, 8], [8, 5], [9, 13], [15, 20]];

    var d3 = [];
    for (var i = 0; i < Math.PI * 5; i += 0.25)
        d3.push([i, Math.sin(i)]);

   
    $.plot($("#placeholder"),
    [
        { label: "線條一",  data: d1},
        { label: "線條二",  data: d2},
        { label: "線條三",  data: d3}
    ]   
    );
});


原文:[jQuery] Javascript plotting library 畫圖 chart

14
原文:[Pear] 利用 Validate 套件驗證 E-mail 多重表單認證

最近都在玩 open source 的程式,方便加速自己開發 PHP 的專案,在申請帳號密碼部份就可以利用 Validate 套件來驗證,以及 email 填寫正確性,可以檢查 MX 或者是 A record 紀錄,還蠻方便的,也可以檢查 multiple 欄位,設計的相當不錯,也有金融相關套件可以驗證 CreditCard,金融套件名稱是 Validate_Finance 裡面的 Validate_Finance_CreditCard 部份,線上也有很多相關說明,可以參考 Validate 線上手冊,目前已經到 0.8.2 (beta),如果使用 Release 版本,請選用 0.8.1,軟體可以在此下載,0.8.2 是在 2009-01-31 Release 出來的,還不錯用,最主要的功能如下
代碼: [選擇]
Package to validate various datas. It includes :
- numbers (min/max, decimal or not)
- email (syntax, domain check, [url=http://www.w3.org/Protocols/rfc822/]rfc822[/url])
- string (predifined type alpha upper and/or lowercase, numeric,…)
- date (min, max, rfc822 compliant)
- uri ([url=http://www.w3.org/2002/11/dbooth-names/rfc2396-numbered_clean.htm]RFC2396[/url])
- possibility valid multiple data with a single method call (::multiple)
  • 驗證各種不同的日期函式
  • 驗證數字(最小/最大,是否是10進位)
  • email 驗證(正規語法驗證,check domain name 是否存在,rfc822 驗證)
  • 字串驗證(正規語法驗證,是否包含數字英文字母,可輸入最長或最短)
  • url 驗證(遵從 RFC2396 規定)
  • 多重欄位(multiple data)驗證(可以同時驗證上述功能)


來介紹 Validate 套件用法:
1. Validate::date 這部份我比較不推薦用這裡的方法,可以用 jQuery 的套件:[jQuery筆記] 好用的日期函式 datepicker,那底下是這個函式用法:必須多安裝 Pear Date 套件
代碼: [選擇]
/**
* 驗證此套件必須在加裝 Date_Calc class
*
* @param string $date  需要驗證的值
*                          'format' 可以自行制定 (%d-%m-%Y)
*
*                          'min'    array($day, $month, $year)
*                          'max'   array($day, $month, $year)
* 回傳值 true or false
*/
$values = "2009-01-10";

$opts = array(
  'format'=> "%Y-%d-%m",
  'min'  => array('02','10','2009'),
  'max'  => array('05','10','2009')
);
$result = Validate::date($values, $opts);

if($result)
{
echo $result;
}
else
{
echo "error";
}

2. Validate::email
代碼: [選擇]
/**
 *
 * @param string $email  您要驗證的 email
 * @param mixed
 *    check_domain 檢查 domain 是否有 A 或者 MX Record
 *    use_rfc822 檢查 domain 是否符合 rfc822 規範
 * 回傳值 true or false
 * 
 */
$values = "appleboy@XXXXX";

$options = array(
  'check_domain' => 'true',
  'fullTLDValidation' => 'true',
  'use_rfc822' => 'true',
  'VALIDATE_GTLD_EMAILS' => 'false',
  'VALIDATE_CCTLD_EMAILS' => 'false',
  'VALIDATE_ITLD_EMAILS' => 'false',
);
$result = Validate::email($values, $options);

if($result)
{
echo $result;
}
else
{
echo "error
";
}

3. Validate::number:
代碼: [選擇]
/**
 *
 * @param string $number  您要驗證的數字
 * param array  $options array 選單
 *    decimal 可否在數字中間出現非數字符號如:., 代表可以使用 .,
 *    dec_prec 有多少 decimal 可以出現在數字中
 *    min      最小值
 *    max      最大值
 * 回傳值 true or false
 * 
 */

$values = "12300,45";

$options = array(
    'decimal' => ',',
    'dec_prec' => '2',
    'min' => '1000',         
    );
$result = Validate::number($values, $options);

if($result)
{
  echo $result;
}
else
{
  echo "error<br />";
}

4. Validate::String
代碼: [選擇]
/**
 *
 * @param string $string  您要驗證的字串
 * param array  $options array 選單
 *    'format' 字串的格式
 *    Ex:VALIDATE_NUM(數字 0-9) . VALIDATE_ALPHA_LOWER(a-z)
 *    VALIDATE_ALPHA_UPPER (A-Z) VALIDATE_ALPHA(a-zA-Z)
 *    dec_prec 有多少 decimal 可以出現在數字中
 *    'min_length' 字串最小長度
 *    'max_length' 字串最大長度
 * 回傳值 true or false
 * 
 */
$values = "appleboy";

$options = array(
    'format' => VALIDATE_NUM,
    'min_length' => '2',
    'max_length' => '1000',         
    );
$result = Validate::number($values, $options);

if($result)
{
  echo $result;
}
else
{
  echo "error<br />";
}

5. Validate::Uri
代碼: [選擇]
/**
 * Validate an URI (RFC2396)
 * EX:
 * $options = array('allowed_schemes' => array('http', 'https', 'ftp'))
 * var_dump(Validate::uri('http://www.example.org', $options)); 
 * 注意事項:
 * 1. 在 RFC2396 裡面定義了"-" 這個符號可以使用在 URI 裡面
 *    e.g. [url]http://example.co[/url]-m 這是可以驗證通過的
 *    但是在any known TLD裡面是不被准許的
 * 2.   
 * @param string $url     您要驗證的網址列
 * @param array  $options Options used by the validation method.
 *    'domain_check' 檢查 domain 是否存在 DNS 裡
 *    'allowed_schemes' 陣列 for list protocols ex: https, http
 *    'strict'  預設值: ';/?:@$,' 空值: accept all rfc2396 foreseen chars     
 * 回傳值 true or false
 * 
 */
$options = array(
    'check_domain'=>true,
    'allowed_schemes' => array('http','https'),
    'strict' => ';/?:@$,'       
    );
var_dump(Validate::uri('http://blog.wu-boy.com/', $options));

6. Validate::multiple 結合上述的語法,整合成一個函式
代碼: [選擇]
$values = array(
    'amount'=> '13234,344343',
    'name'  => 'foo@example.com',
    'mail'  => 'foo@example.com',
    'mystring' => 'ABCDEabcde'

    );
$opts = array(
    'amount'=> array('type'=>'number','decimal'=>',.','dec_prec'=>null,'min'=>1,'max'=>32000),
    'name'  => array('type'=>'email','check_domain'=>false),
    'mail'  => array('type'=>'email'),
    'mystring' => array('type'=>'string',array('format'=>VALIDATE_ALPHA, 'min_length'=>3))
    );

$result = Validate::multiple($values, $opts);

print_r($result);

Related View原文:[Pear] 利用 Validate 套件驗證 E-mail 多重表單認證

15
原文轉貼:mydumper 取代 mysqldump 效能

這是我在 gslin 大神 那邊看到的一篇文章:mydumper (取代 mysqldump 的工具)mysqldumper 有平行跟效能方面壓力測試,效果跟時間都壓縮的比 mysqldump 還要快,簡單管理 output 資料,它把 database 每個資料表分別 dump 資料出來寫到檔案,方便觀看檔案資料,不過沒有支援 dump table 的 definitions,所以加速提取 data 寫入到檔案,gslin 大神也把它包進 FreeBSD ports 裡面,在 database/mydumper 這裡。
我想會把這個機制套用到我之前寫的 shell script 裡面:[linux&FreeBSD] 備份系統資料,MySQL 資料庫,PgSQL 資料庫的自動化 bash shell script 程式,那 mydumper 用法也相當簡單,mydumper –help 就寫的很清楚了,跟 mysqldump 用法差沒多少:
代碼: [選擇]
-h, --host               連接到 hostname 伺服器

-u, --user               使用者名稱

-p, --password           使用者密碼

-P, --port               MySQL TCP/IP port

-B, --database           Database 名稱

-t, --threads            Number of parallel threads

-o, --outputdir          輸出的檔案要存放在哪, 預設 ./export-*/

-c, --compress           gzip 壓縮每個檔案,多花一點時間

-x, --regex              Regular expression for 'db.table' matching

如果要 dump 全部的資料庫:
代碼: [選擇]
mydumper -u [user] -p [password]
經過 gzip 壓縮
代碼: [選擇]
mydumper -u [user] -p [password] -c
dump 單一資料庫
代碼: [選擇]
mydumper -u [user] -p [password] -c -B database
dump 多重備份 mysql 跟 test 資料庫
代碼: [選擇]
mydumper -u [user] -p [password] -c --regex '^(?!(mysql|test))'
參考文章:
mydumper (取代 mysqldump 的工具)
作者網站:mydumper
Related View原文轉貼:mydumper 取代 mysqldump 效能

16
本文同步於: http://blog.wu-boy.com/2008/12/19/637/


最近在弄動態下拉式選單,因為層級的關係,所以必須用到,大學裡面各學院,底下在各系所,在網路上看到一篇 ,實做起來是不會困難,可是我遇到一些怪問題就是了,目前還沒有解決,當然首推 套件 cascade,那也參考了國外的一篇文章 jQuery.cascade : Cascading values from forms ,這幾篇看完其實就差不多了,因為大家都寫得很清楚,官方網站 更是把所有應用都寫出來了,詳細很多用法可以參考 官方網站,看原始碼大概就知道在寫甚麼了。

先來說明一下使用的方法:在這個 jQuery cascade plugin 裡面,定義了一格式:
代碼: [選擇]
/*
格式就在底下總共有三攔
*/
{'when':'selectedValue','value':'itemValue','text':'itemText'}
第一個 when:這是上一層的 select 的 value 值
第二個 value:這是下一層的 select 的 value 值
第三個 text:這是下一層 option 的 text
我想有一點 html 基礎的,大概就知道我在說什麼了吧
<!--more-->

製作動態選單,可以用兩種方法,第一使用 ajax 去呼叫,也可以使用 json 的方式來達到,只是傳送的格式不同而已,第二個方法,就是在前端就輸出正確格式,然後利用 jQuery 讀近來。

先講解第一個方法:當然直接輸出就可以了,這就不必使用 ajax 去後端要資料了
首先把資料先撈出來:
代碼: [選擇]
<?PHP
$sql = "SELECT a.*, b.* FROM " . USERS_COLLEGE_TABLE . " as a, " . USERS_DEP_TABLE . " as b where a.college_id = b.college_id order by a.college_id";

if( !($result = $db->sql_query($sql)) )
{
die("Could not query config information" . $sql);
}
while($row = $db->sql_fetchrow($result)){
  /* 先把中文用 trim 輸出 */
  $row['dep_name'] = trim($row['dep_name']);
  $dep_array .= ($dep_array == '' ) ? "{'When':'".$row['college_id']."','Value':'".$row['dep_id']."','Text':'".$row['dep_name']."'}" : ", {'When':'".$row['college_id']."','Value':'".$row['dep_id']."','Text':'".$row['dep_name']."'}";
}
?>
注意輸出的部份:$dep_array 那邊,記得先用 trim 把中文的部份先使用,不然會顯示不出來,前端的寫法如下:
代碼: [選擇]
<script type="text/javascript">
<!-- 把剛剛輸出的 $dep_array 放到 list1 裡面 -->
var list1 = [<?=$dep_array?>];

function commonTemplate(item) {
return "<option value='" + item.Value + "'>" + item.Text + "</option>";
};
function commonTemplate2(item) {
return "<option value='" + item.Value + "'>***" + item.Text + "***</option>";
};

function commonMatch(selectedValue) {
//alert(selectedValue);
  return this.When == selectedValue;
};
$(document).ready(function()
{

  $("#user_department").cascade("#user_college",{
list: list1,
template: commonTemplate,
match: commonMatch
});
});
</script>
前端 html 部份:
代碼: [選擇]
<select name="user_college" id="user_college">
<option value="">請選擇</option>
<?PHP
$sql = "SELECT * FROM " . USERS_COLLEGE_TABLE;
if( !($result = $db->sql_query($sql)) )
{
die("Could not query config information" . $sql);
}
while($row = $db->sql_fetchrow($result)){
   $selected = ($row['college_id'] == $profiledata['user_college']) ? "selected" : "";
   echo '<option value="'.$row["college_id"].'" '.$selected.'>'.$row["college_name"].'</option>';
}
?>
</select>
<select name="user_department" id="user_department">
<option value="">請選擇</option>
</select>
這樣大致上就可以動了,那如果是要三層選單,那就自己再去加上 jQuery 的部份就可以了,舉一反三,我想大家都會,那底下介紹一下 ajax json 拿取得動態資料,這樣就不必先載入。

那首先修改 jQuery 寫法部份:
代碼: [選擇]
jQuery(document).ready(function()
{
  $("#user_department33").cascade("#user_college", {
  ajax: {
      url: 'ajax.php',
      type: 'GET',
      /*
complete: function(){
alert('my list is updated');
},
      */     
      data: {
        action: 'show',
        college_id: $('#user_college').val()
      },
      dataType: "json"
  },
  template: commonTemplate,
  match: commonMatch
 
  });
 
});

注意 datatype 那邊是寫 json,然後丟 GET 的 action 值過去,以及 select user_college 的 value,那 ajax.php 部份如下:
代碼: [選擇]
<?PHP
$root_path = './';
include($root_path . 'config.php');
$college_id = $_GET['college_id'];
$action = $_GET['action'];

switch($action)
{
  case "show":
 
    $sql = "SELECT a.college_id, b.dep_id, b.dep_name FROM " . USERS_COLLEGE_TABLE . " as a, " . USERS_DEP_TABLE . " as b where a.college_id = b.college_id and a.college_id = '".$college_id."' order by a.college_id";

   
    if( !($result = $db->sql_query($sql)) )
    {
    die("Could not query config information" . $sql);
    }
    $list = array();
    $dep_array = array();
    while($row = $db->sql_fetchrow($result))
    {
      $row['dep_name'] = trim($row['dep_name']);
      $row['college_id'] = trim($row['college_id']);
      $row['dep_id'] = trim($row['dep_id']);
      /* 如果不是用 json 方式,就必須用下面這程式碼 */
      //$dep_array .= ($dep_array == "" ) ? "[{'When':'".$row['college_id']."','Value':'".$row['dep_id']."','Text':'".$row['dep_name']."'}" : ",{'When':'".$row['college_id']."','Value':'".$row['dep_id']."','Text':'".$row['dep_name']."'}";
      /* json 專用格式 */
      $dep_array = array ('When' => $row['college_id'], 'Value' => $row['dep_id'], 'Text' => $row['dep_name']);
      $list[] = $dep_array;
    }   
  break;
}
echo json_encode($list);
?>
這樣大致上完成,可使有一個問題,不知道是我的問題,還是 jQuery plugin cascade,因為我用 ajax 這個方法,會讓選單,只出現一個,其他的都不會出現。

網址測試: http://appleboy.no-ip.org/plan/index.php

本文同步於: http://blog.wu-boy.com/2008/12/19/637/

17
已經在 ptt 的 PHP 提供了這個資訊,我覺得還不錯,畢竟看到大家都有這個問題

mail 這個函式在官網提供很多範例,其實都還不錯,不過個人很推 PEAR - PHP Mail and Mail_Mime

可以參考

[PHP] 好用的 PEAR - PHP Mail and Mail_Mime

http://blog.wu-boy.com/2007/12/18/129/

[PHP]解決 PEAR::Mail_Mime 標題 UTF-8 亂碼問題(不能顯示)

http://blog.wu-boy.com/2008/10/01/524/

接下來就是介紹怎麼安裝了,首先你的系統要有搭配 php pear 的套件

代碼: [選擇]
cd /usr/ports/devel/pear
make install
不過你如果裝 php5 的套件的話,她會順便一起裝進去,我想這不是重點

再來就是下載 PEAR::Mail 跟 PEAR::Mail_Mime 套件

其實作法很簡單,就是下載程式都丟到 includes 裡面,然後要用到的時候,利用底下

代碼: [選擇]
define('Document_root',dirname(__FILE__));
這個相當好用,取得絕對路徑,之後只要寫成下面底下就好

代碼: [選擇]
include(Document_root . '/includes/Mail.php');
include(Document_root . '/includes/Mail/mime.php');

再來是最普通的寄送範例:

代碼: [選擇]
  include(Document_root . '/includes/Mail.php');
  $recipients = 'joe@example.com';
  $headers['From']    = 'richard@phpguru.org';
  $headers['To']      = 'joe@example.com';
  $headers['Subject'] = 'Test message';
  $body = 'Test message';
  $mail_object =& Mail::factory('mail');
  $mail_object->send($recipients, $headers, $body);


裡面有一行
$mail_object =& Mail::factory('mail');
這個有三種方式 mail, sendmail, smtp

mail: 這是不需要任何參數的
sendmail:需要 sendmail 的程式路徑跟她所需要的參數
smtp:需要 mail 主機位址,port,是否需要認證,帳號密碼之類的

當然我們用最普通的就好,那就是 mail 就可以,不過前提你要先架好 mail Server

Mail_Mime 的部分:

這部份比較複雜,我們先看範例:

代碼: [選擇]
  include(Document_root . '/includes/Mail.php');
  include(Document_root . '/includes/Mail/mime.php');
  $text = '我是小惡魔我是小惡魔我是小惡魔我是小惡魔';
  $html = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"      "http://www.w3.org/TR/html4/loose.dtd">
  <html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
  <p>Hello World!</p>
  <p>我是小惡魔</p>
  <p>我是小惡魔</p>
  <p>我是小惡魔</p>
  <p>我是小惡魔</p>
  </body>
  </html>';
  $file = '/home/appleboy/adwii/AB2.jpg';
  $crlf = "\n";
  $param['text_charset'] = 'utf-8';
  $param['html_charset'] = 'utf-8';
  $param['head_charset'] = 'utf-8';
  $hdrs = array(
                'From'    => 'appleboy@example.org',
                'Subject' => '系統資訊',
                'Content-type' => 'text/plain; charset=utf-8'
                );
  $mime = new Mail_mime($crlf);
  $mime->setTXTBody($text);
  $mime->setHTMLBody($html);
  $mime->addAttachment($file, 'text/plain', 'AB2.jpg');
  $body = $mime->get($param);
  $hdrs = $mime->headers($hdrs);
  //echo $body;
  $mail =& Mail::factory('mail');
  $mail->send('appleboy@example.org', $hdrs, $body);


這個範例,可以附加檔案,跟寫 html 格式的 mail 寄信到對方
$mime->addAttachment($file, 'text/plain', 'AB2.jpg');
這一行就是寄送附加檔案,附加檔案的格式如下
 
代碼: [選擇]
function addAttachment($file,
                           $c_type      = 'application/octet-stream',
                           $name        = '',
                            $isfile     = true,
                           $encoding    = 'base64',
                           $disposition = 'attachment',
                           $charset     = '',
                            $language   = '',
                           $location    = '')

  1.使用 Mail_mime() 建立新的 Mail_mime 物件(constructor)。
  2.至少要使用 setTXTBody(), setHTMLBody(), addHTMLImage() 或 addAttachment()
    四者其中之一建立內文或附檔。(當然通常的情況不只使用一個囉)
  3.使用 get() 傳回內文。
  4.使用 headers() 傳回檔頭。
  5.利用傳回的內文與檔頭丟給 Mail::send() 送信。

reference

http://pear.php.net/manual/en/package.mail.mail.intro.php
http://blog.xuite.net/noi1/yamesz/8928129
http://pear.php.net/manual/en/package.mail.mail-mime.example.php

18
原文網址: http://blog.wu-boy.com/2008/08/25/331/


上面這張圖是瑞典美食小肉丸喔,沒記錯價錢的話,大概是15顆139元,那邊其實很多餐點可以點,但是那天太晚去了,剩下德國豬腳跟瑞典美食小肉丸,這兩樣而已


這是德國豬腳,真的很好吃,大家可以去嘗試看看,ikea 裡面的食物算是蠻便宜的,至少可以吃得很飽,一般男生去吃份量相當足夠

小肉丸的一些圖



德國豬腳的一些圖:


旁邊的薯條很棒喔~超好吃的啦


右邊這是兒童餐喔 60圓整,不會說很貴啦,左邊是雞腿排喔,還不錯吃



兒童餐圖片兩張

雞腿排加上薯泥


其他的餐點型錄喔

烤牛肉,這個我女朋友說還好

這個冰淇淋在1樓,大家記得去吃

這是單賣小肉丸1公斤260元,很便宜吧,畢竟在那邊15顆就139元了

香煎漢堡排,這沒吃過,大家去嘗試吧


早餐,看起來不錯,大家都很推吧,我沒吃過

我那時候蠻晚去的,所以人都蠻空的,大概9點左右吧


原文網址: http://blog.wu-boy.com/2008/08/25/331/


19
中華隊/奧運棒球 中華旗開得勝5:0完封荷蘭

http://mini101.twgg.org/2008/08/13/872/

有人做好的影片,大家可以看看,今天贏球的精華

20
可以給小孩子看這個漫畫,絕對有教育的效果

http://0rz.tw/b84cp

這是父母最後希望看到孩子的樣子~

21
最近在寫網站的時候去找的外掛,我覺得相當好用

推一下 jQuery,如果還沒使用的,可以趕快去摸索一下,我自己也還不是很熟

可以解決時間問題,不必要自己弄一堆 <select> <inpute>

[jQuery筆記] 時間日期外掛:timepicker | jQuery Plugins

[jQuery筆記] 好用的日期函式 datepicker

22
文章同步於: http://blog.wu-boy.com/2008/05/07/243/


最近去台南玩,當然就是不忘了美食,然而今天我去吃的東西,相當棒,那就是五花馬水餃館,這一間在台南相當有名,在網路上很多人推,那就一定要去吃看看,最主要是他們的手工水餃喔,超級好吃,雖然是不便宜,可是一份10顆也相當有飽足感了,其實那邊有很多東西可以選,也有陽春乾麵,卷餅,蒸餃,還蠻多樣的喔。


引用
餐廳名稱:[台南美食] 五花馬 水餃館 (大同店) 手工水餃

   地址: 台南市大同路一段143號
   電話:06-2136461
   營業時間:不確定
   價位範圍(每人):50-100之間
   可刷卡(可/不可):不確定
   有無包廂:沒有
   推薦菜色:手工水餃

首先我們點了三道菜,並不多,不過我看其他桌的菜色都很棒,因為我們只有兩個人,所以也吃不多

這一道是燙青菜,單價30元,好像幾乎都是這個價錢,他是燙空心菜,非常好吃,上面還淋上肉糙


那個肉糙看起來不錯吧

兩個人吃份量剛剛好喔

接下來我們點了普通的豬肉手工水餃,10顆,很好吃喔,10顆一份45元,所以單價一顆4元,比平常的店比起來,算貴了一點,不過重點是真材食料,很飽滿


裡面的肉餡真的很飽滿,很多,很實在,跟外面一顆三元的差很多,所以賣4.5塊,我覺得還很合理

接下來我點:牛肉手工水餃

切的不好,請大家見諒喔



裡面的料很實在吧,還不錯,好吃好吃

大家可以參可一下他們的單價,如下:


有點暗喔,不好意思喔


住在台南的可以去吃看看,真的很不錯,相當推,水餃好吃,大家可以多去看看,那邊有冷氣,也有二樓,也有洗手間喔,所以相當方便。^^

文章同步於: http://blog.wu-boy.com/2008/05/07/243/

23
剛剛看到一篇酷學園精華區文章

http://phorum.study-area.org/index.php/topic,17120.0.html

這篇裡面提到

引用
以下有部份取自原來我貼在 VBird 的文章
Apache 的 VH 其實設法相當多種,
相信大多數都是這種設法
<VirtualHost 1.2.3.80:80>
ServerAdmin admin@xxx.com.tw
DocumentRoot /home/httpd/html/enum
ServerName VH1.xxx.com.tw
ErrorLog logs/VH1-error.log
CustomLog logs/VH2-access_log common
</VirtualHost>
因為書本上教的,但是你改了這些值, httpd 要重新啟動...
高明點用 rewrite modules: (要有 RE 的基礎)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.[^.]+\.host\.com$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^www\.([^.]+)\.host\.com(.*) /home/$1$2

這樣只要新增 /home 目錄下的目錄就是新增 VirtualHost 了,且 httpd 不需重開
(有很多不同設法, http://httpd.apache.org/docs/misc/rewriteguide.html)

這一段,我拿去實做一下我的機器,發現我改成以下

代碼: [選擇]
RewriteEngine on
RewriteBase   /
RewriteCond   %{HTTP_HOST}                 ^test\.wu-boy\.com$
RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
RewriteRule   ^test\.wu-boy\.com(.*) /usr/local/www/apache22/data/test$1

我發現不會work,我把 loglevel 打開,發現他會跑無限循環

代碼: [選擇]
- - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85f8050/subreq] (3) [perdir /usr/local/www/  apache22/data/] applying pattern '^(.+)' to uri 'index.php'
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85f8050/subreq] (2) [perdir /usr/local/www/  apache22/data/] rewrite 'index.php' -> 'test.wu-boy.comindex.php'
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85f8050/subreq] (3) [perdir /usr/local/www/  apache22/data/] add per-dir prefix: test.wu-boy.comindex.php -> /usr/local/www/apache22/data/test.wu-boy.comindex.php
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85f8050/subreq] (3) [perdir /usr/local/www/  apache22/data/] strip per-dir prefix: /usr/local/www/apache22/data/test.wu-boy.comindex.php -> test.wu-boy.comindex.php
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85f8050/subreq] (3) [perdir /usr/local/www/  apache22/data/] applying pattern '^test\.wu-boy\.com(.*)' to uri 'test.wu-boy.comindex.php'
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85f8050/subreq] (2) [perdir /usr/local/www/  apache22/data/] rewrite 'test.wu-boy.comindex.php' -> '/usr/local/www/apache22/data/testindex.php'
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85f8050/subreq] (2) [perdir /usr/local/www/  apache22/data/] trying to replace prefix /usr/local/www/apache22/data/ with /
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85f8050/subreq] (1) [perdir /usr/local/www/  apache22/data/] internal redirect with /testindex.php [INTERNAL REDIRECT]
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#860c050/initial] (3) [perdir /usr/local/www/ apache22/data/] strip per-dir prefix: /usr/local/www/apache22/data/index.php -> index.php
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#860c050/initial] (3) [perdir /usr/local/www/ apache22/data/] applying pattern '^(.+)' to uri 'index.php'
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#860c050/initial] (2) [perdir /usr/local/www/ apache22/data/] rewrite 'index.php' -> 'test.wu-boy.comindex.php'
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#860c050/initial] (3) [perdir /usr/local/www/ apache22/data/] add per-dir prefix: test.wu-boy.comindex.php -> /usr/local/www/apache22/data/test.wu-boy.comindex.php
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#860c050/initial] (3) [perdir /usr/local/www/ apache22/data/] strip per-dir prefix: /usr/local/www/apache22/data/test.wu-boy.comindex.php -> test.wu-boy.comindex.php
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#860c050/initial] (3) [perdir /usr/local/www/ apache22/data/] applying pattern '^test\.wu-boy\.com(.*)' to uri 'test.wu-boy.comindex.php'
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#860c050/initial] (2) [perdir /usr/local/www/ apache22/data/] rewrite 'test.wu-boy.comindex.php' -> '/usr/local/www/apache22/data/testindex.php'
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#860c050/initial] (2) [perdir /usr/local/www/ apache22/data/] trying to replace prefix /usr/local/www/apache22/data/ with /
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#860c050/initial] (1) [perdir /usr/local/www/ apache22/data/] internal redirect with /testindex.php [INTERNAL REDIRECT]
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85efb88/initial/redir#1] (3) [perdir /usr/   local/www/apache22/data/] strip per-dir prefix: /usr/local/www/apache22/data/testindex.php -> testindex.php
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85efb88/initial/redir#1] (3) [perdir /usr/   local/www/apache22/data/] applying pattern '^(.+)' to uri 'testindex.php'
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85efb88/initial/redir#1] (2) [perdir /usr/   local/www/apache22/data/] rewrite 'testindex.php' -> 'test.wu-boy.comtestindex.php'
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85efb88/initial/redir#1] (3) [perdir /usr/   local/www/apache22/data/] add per-dir prefix: test.wu-boy.comtestindex.php -> /usr/local/www/apache22/data/test.wu-boy.          comtestindex.php
 - - [03/Mar/2008:17:03:54 +0800] [test.wu-boy.com/sid#814f870][rid#85efb88/initial/redir#1] (3) [perdir /usr/   local/www/apache22/data/] strip per-dir prefix: /usr/local/www/apache22/data/test.wu-boy.comtestindex.php -> test.wu-boy.        comtestindex.php

我不知道哪裡有寫錯了,有人有實做過嗎?
我覺得是
代碼: [選擇]
RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]這一行有問題,大家可以幫忙看一下嗎

打開 logLevel

代碼: [選擇]
RewriteEngine on
RewriteLog "/var/log/rewrite.log"
RewriteLogLevel 3

謝謝大家

24
其實是因為看到這篇 [筆記] cwRsync (rsync for win32) SSH 加密異地備份

最近正在弄Windows的機器怎麼跟Windows的機器互相備份,linux跟windows之間麼備份已經搞定了,其實我差不會利用windows的每天固定跑程式,在linux底下可以使用cron的方式來用,可是winodws底下就要使用批次檔。

再來就是安裝步驟,請把2台windows的機器都裝上 cwRsync

假設已經安裝好 cwrsync 之後,在系統服務那邊 把他啟動之後,就可以開始使用了

底下是網路上抓好的 清除你系統中沒必要的垃圾檔案

請打開記事本…

打入以下東西

代碼: [選擇]
@echo off
echo 正在清除系統垃圾檔案,請稍等……
del /f /s /q %systemdrive%\*.tmp
del /f /s /q %systemdrive%\*._mp
del /f /s /q %systemdrive%\*.log
del /f /s /q %systemdrive%\*.gid
del /f /s /q %systemdrive%\*.chk
del /f /s /q %systemdrive%\*.old
del /f /s /q %systemdrive%\recycled\*.*
del /f /s /q %windir%\*.bak
del /f /s /q %windir%\prefetch\*.*
rd /s /q %windir%\temp & md %windir%\temp
del /f /q %userprofile%\cookies\*.*
del /f /q %userprofile%\recent\*.*
del /f /s /q “%userprofile%\Local Settings\Temporary Internet Files\*.*”
del /f /s /q “%userprofile%\Local Settings\Temp\*.*”
del /f /s /q “%userprofile%\recent\*.*”
echo 清除系統LJ完成!
echo. & pause


儲存...副檔名.bat

不過先設定 rsync.conf



請注意 在windows底下 都是利用



代碼: [選擇]
# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work


路徑不要打錯,然後在打開剛剛寫好的bat檔案,加入底下



代碼: [選擇]
@cls
@echo off
rem Rsync job control file
path=C:\Program Files\cwRsyncServer\bin;%path%
rsync -avl --delete --progress --password-file=d:\backup\rsync.txt /cygdrive/d/backup appleboy@192.168.100.5::backup_NAS
echo. & pause


重點是底下這行

代碼: [選擇]
path=C:\Program Files\cwRsyncServer\bin;%path%

path要設定好,不然系統會跟您說找不到指令,其實這在linux砥也會常常遇到

這樣就可以了,然後在 開始->控制台->排定工作  新增一個排程 這樣就可以了



參考:

Rsync for Windows
[Linux] cwRsync [rsync for windows] SSH 加密異地備份

資料同步於部落格˙

http://blog.wu-boy.com/2007/04/03/89

25
系統:FreeBSD 6.0-RELEASE

安裝方式:

cd /usr/ports/security/sshit/

make install clean

設定檔 /usr/local/etc/sshit.conf

# Sample configuration file of sshit.pl

# We use pf as firewall on default 看你喜歡用什麼防火牆,我熟悉ipfw
FIREWALL_TYPE = ipfw

# Number of failed login attempts within time before we block
MAX_COUNT = 3

# Time in seconds in which all failed login attempts must occur
WITHIN_TIME = 60

# Time in seconds to block ip in firewall 失敗後禁止登入幾秒鐘
RESET_IP = 300

IPFW_CMD = /sbin/ipfw

# Make sure you don't have any important rules here already
IPFW_RULE_START = 2100
IPFW_RULE_END = 3100

IPFW2_CMD = /sbin/ipfw
IPFW2_TABLE_NO = 0

PFCTL_CMD = /sbin/pfctl
PF_TABLE = badhosts

vi /etc/syslog.conf 加上

auth.info;authpriv.info |exec /usr/local/sbin/sshit

不過安裝好之後,照常裡來說可以使用,結果發現完全沒有效果

所以我去看了一下 sshit perl的這隻程式,跟官方網站提供的log檔資料

官方網log檔如下

Jul 23 05:30:51 sshd[36291]: Failed password for root from 200.204.175.122 port 48830 ssh2
Jul 23 05:30:51 sshit.pl: BLOCKING 200.204.175.122, rule 2100FreeBSD auth.log 檔如下

Oct 30 06:53:07 bbs sshd[13935]: error: PAM: authentication error for illegal user test from 163.29.208.2
Oct 30 06:53:07 bbs sshd[13935]: Failed keyboard-interactive/pam for invalid user test from 163.29.208.2 port 48102 ssh2
Oct 30 06:53:07 bbs sshit.pl: BLOCKING 163.29.208.2, rule 2101

發現freebsd的log檔,格式跟官方網不一樣,所以程式是正確的
所以我去改了一下sshit,patch檔如下

代碼: [選擇]

--- /usr/local/sbin/sshit Sun Oct 29 23:38:08 2006
+++ /usr/local/sbin/sshit.new Mon Oct 30 08:42:10 2006
@@ -157,6 +157,8 @@
 
 ### DEFAULT SETTINGS
 
+$SSH_PORT = 22; # SSH PORT
+$FTP_PORT = 21; # FTP PORT
 $FIREWALL_TYPE = "pf"; # We use pf as firewall on default
 $MAX_COUNT = 3; # Number of failed login attempts within time before we block
 $WITHIN_TIME = 60; # Time in seconds in which all failed login attempts must occur
@@ -290,7 +292,7 @@
 
 while (<>) {
  chomp;
- if (/failed .*from (\d+\.\d+\.\d+\.\d+|[\da-fA-F:]+)/i ) { # IPv4 & IPv6
+ if (/error .*from (.*|[\da-fA-F:]+)/i ) { # Domain & IPv4 & IPv6
  $ip = $1;
  if ($list{$ip}{name}) {
  if ($list{$ip}{n} >= $MAX_COUNT) {
@@ -311,7 +313,7 @@
  {
  # Assign a rule number and do the actual block
  $list{$ip}{rulenr} = $ipfw_rulenr;
- system("$IPFW_CMD add $ipfw_rulenr deny tcp from $ip to me 21,22 > /dev/null");
+ system("$IPFW_CMD add $ipfw_rulenr deny tcp from $ip to me $SSH_PORT,$FTP_PORT > /dev/null");
  syslog(LOG_ERR, "BLOCKING $ip, rule $ipfw_rulenr\n");
  $ipfw_rulenr++;
  if ($ipfw_rulenr > $IPFW_RULE_END) { $ipfw_rulenr = $IPFW_RULE_START; }


sshit_pach檔

$SSH_PORT = 22; # SSH PORT
$FTP_PORT = 21; # FTP PORT

自行修改主機的port,這是預設值

http://anp.ath.cx/sshit/

http://blog.gfchen.org/2006/01/22/248/

文章同步於 http://blog.wu-boy.com/2006/11/04/31

26
ProFTPD Version 1.2.10

Mysql Version 4.1.0 支援 UTF8

請確定你的proftpd有支援sql module

代碼: [選擇]
proftpd -l | grep mysql

[root][~][23:28:13]# proftpd -l | grep sql
mod_sql.c
mod_sql_mysql.c
mod_quotatab_sql.c

確定有支援之後 再來就是建立mysql資料庫

    * 建立 proftp 資料庫

代碼: [選擇]
      CREATE DATABASE `ftp` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;    * 建立使用者資料表

代碼: [選擇]
      CREATE TABLE `ftp` (
      `username` varchar( 60 ) default NULL ,
      `uid` int( 11 ) NOT NULL ,
      `gid` int( 11 ) default NULL ,
      `password` varchar( 30 ) default NULL ,
      `homedir` varchar( 60 ) default NULL ,
      `shell` varchar( 11 ) default ‘/bin/false’,
      PRIMARY KEY ( `uid` ) ,
      UNIQUE KEY ( `username` )
      ) TYPE = MYISAM ;

      此資料表是在紀錄使用者的基本資訊,uid是使用者系統uid,gid是使用者group的id,passwd使用者的密碼
      homedir為使用者登入的家目錄,

      shell可以為該使用者指定相應的shell
    * 建立使用者群組資料表
代碼: [選擇]
      CREATE TABLE `groups` (
      `groupname` varchar( 30 ) NOT NULL default ‘’,
      `gid` int( 11 ) NOT NULL default ‘0′,
      `members` text default NULL
      ) TYPE = MYISAM ;

      其中grpname是組的名稱,gid是系統組的ID,members是組的成員。注意:多成員,他們之間要用逗號隔開,不能使用空格
      例如 3個使用者 test1 test2 test3 ,members就要寫 (test1,test2,test3)

#設置MySQL認證:

SQLConnectInfo 資料庫 資料庫帳號 資料庫密碼

#設置user資料表資訊『對應你的設定的資料表』

SQLUserInfo ftp username password uid gid homedir shell
#設置group資料表資訊『對應你的設定的資料表』

SQLGroupInfo groups groupname gid members

#設定使用者密碼編碼方式 ex:Plaintext 純文字

SQLAuthTypes Plaintext
#設定mysql log檔

SQLLogFile /var/log/sql.log
PersistentPasswd off
#如果home目錄不存在,則系統會為根據它的home項新建一個目錄:
SQLHomedirOnDemand on

再來呢,建立ftp的專屬group,當然你如果有許多群組,請自行建立

   1. 建立groupgroupadd ftpgroup
   2. 建立一個使用者home目錄
useradd -G ftpgroup -d /home/ftp -m -s /bin/false ftp

為FTPUSR建立HOME,把所有的FTP user 活動空間全放在此目錄下:

mkdir /home/ftp #剛剛建立使用者已經建立了
chown -R ftp:ftpgroup /home/ftp
開始建立ftp的使用者,可以的話利用phpmyadmin

代碼: [選擇]
INSERT INTO user (`userid`, `passwd`, `uid`, `gid`, `home`, `shell`) values (’test’, ‘1234′, ‘1000′, ‘1001′, ‘/home/ftp/’, ‘/bin/false’ );

INSERT INTO `groups` VALUES (’ftpgroup’, 1001, ‘test’);

上面那個是新增group對應使用者,如果你有多個使用者對應到同一個group

那麼你就要修改 group 改成 VALUES (’ftpgroup’, 1001, ‘test1,test2,test3′)

所以每增加一個使用者,就要去修改一次,有點麻煩,不過寫程式就可以解決了

大致上是如此,有問題在提出吧

我的proftpd.conf設定檔

http://bbs.ee.ndhu.edu.tw/~appleboy/proftpd.conf

資料同步在我的blog上面

http://blog.wu-boy.com/index.php/2006/10/21/22/

27
先說明一下 我的作業系統

FreeBSD 5.4 release

Apache 2.054

MYSQL  4.1.15

--

我遇到的問題是 我用這套系統 Mysql出現一點狀況

MYSQL的編碼方式  是以下

MySQL 文字編碼:  UTF-8 Unicode (utf8)

然後我建立資料表時 比對方式都以utf8_general_ci

然後 我網頁是以 big5製作

所以我在取出資料之前都會先下

SET NAMES big5;
SET CHARACTER_SET_CLIENT=big5;
SET CHARACTER_SET_RESULTS=big5;

這樣 我INSERT資料進去MYSQL的時候沒問題

取出資料到網頁 也是沒問題的

但是我用PHPMYADMIN進去看資料表的時候

中文部分都是亂碼  好奇怪  不知道為什麼會這樣

請問大家有這方面的經驗嗎  

--

還有1個問題  許蓋功 這3個字

進去資料庫之前  就要先以 mysq_escape_string的方式輸入到資料庫

而取出的時候 要取出的時候 要加入stripslashes 函式 這樣才不會有問題吧

28
關鍵好像是下面這2個
; Set to {nocache,private,public,} to determine HTTP caching aspects.
; or leave this empty to avoid sending anti-caching headers.

session.cache_limiter

; Document expires after n minutes.

session.cache_expire

我覺得很奇怪

session.cache_limiter 預設是 nocache

如果 session.cache_limiter 設定 nocache的話

session.cache_expire 就沒有作用了

但是我把  session.cache_limiter 設定成 private

然後 session.cache_expire 設定成1

我的認為 是 1分鐘之後  如果 都沒動作 系統會清掉 快取 然後session就沒作用了

然而不是這樣  當我登出以後 那些session還會在

所以我想我的觀念可能錯了

請問一下 我的觀念這樣正確嗎

http://tw.php.net/manual/en/function.session-cache-expire.php

29
BSD 討論版 / [問題]關於PROFTP的外掛
« 於: 2004-10-07 00:58 »
我用的是proftp 1.2.10.r3
但是好像沒有支援modules=mod_time
http://www.castaglia.org/proftpd/modules/mod_time.html#ClassCommandTimes
請問一下..我該如何加入那個外掛....
如何重編....謝謝大家


請問一下....如何把上面那個外掛...再重新編譯到程式裡面....

30
Windows 討論版 / [問題]關於多重開機
« 於: 2004-06-22 18:14 »
請問一下...我現在有一顆硬碟

分成c。d。e槽。。3個

現在我在e槽灌2003原本。。

但是後來我把c潮format之後

2003就不能用了。。。所以我用下列方法修復

放2003光碟片進去。。然後修復主控臺

他會有

1。c槽跟2。e槽的win讓你選

我2個都修復。。後來從開機還是沒有多重選單

不知道怎麼了。。。後來c槽灌xp也不行。。。。

大家交交我吧

給我一點提示吧。。。

頁: [1] 2