顯示具有 php 標籤的文章。 顯示所有文章
顯示具有 php 標籤的文章。 顯示所有文章

2012年6月27日 星期三

Zend Framework多資料庫設定

因為在ZF中資料庫是以資源的方式提供
所以在application.ini中設置
[production]
resources.multidb.db1.adapter = "pdo_mysql"
resources.multidb.db1.host = "localhost"
resources.multidb.db1.username = "webuser"
resources.multidb.db1.password = "XXXX"
resources.multidb.db1.dbname = "db1"
resources.multidb.db2.adapter = "pdo_pgsql"
resources.multidb.db2.host = "example.com"
resources.multidb.db2.username = "dba"
resources.multidb.db2.password = "notthatpublic"
resources.multidb.db2.dbname = "db2"
resources.multidb.db2.default = true
再由Bootstrap取得資料庫

$resource = $bootstrap->getPluginResource('multidb');
$db1 = $resource->getDb('db1');
$db2 = $resource->getDb('db2');
$defaultDb = $resource->getDb();

2012年6月22日 星期五

ZendFramework的bootstrap

在ZendFramework的bootstrap中,如果方法名稱以_init為前綴,將被當成資源方法
來自動執行,如果你手上有現成的資源插件(Pluging),可以透過前導的方法 將該資源
排定執行 但該注意的是 當你是使用module模式時 所有module下的bootstrap將會全部
執行 造成 資源重載  效能低下 後來是以取得該module name為判斷 當非執行該module就return 不繼續執行執行非該module的pluging


class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initView()
    {
        $view = new Zend_View();
        // more initialization...
        return $view;
    }
}
class FooController extends Zend_Controller_Action
{
    public function init()
    {
        $bootstrap = $this->getInvokeArg('bootstrap');
        $view = $bootstrap->getResource('view');
        // ...
    }
}

2010年11月1日 星期一

include 和 require

  • 引用方式的不同
    require 的使用方法通常使用在PHP程式的前頭,在執行前會將因入的檔案展開至原本的程式,實際上文件的內容是去替換該語句。

    include 通常放在流程控制中,在讀到那一行時才去讀取該文件內容。


  • 警告方式的不同

    include()會產生一個警告,而require()則導致一個致命的錯誤(出現錯誤,腳本停止執行)

    require() :如果文件不存在,會報出一個fatal error.腳本停止執行

2010年9月29日 星期三

ZF快速建模的工具zend-db-model-generator

羨慕ROR有好用的工具可以掃描資料庫並建出model嗎?
最近發現一個好工具,zend-db-model-generator

在開發時可以先下載這個工具

http://code.google.com/p/zend-db-model-generator/

svn checkout http://zend-db-model-generator.googlecode.com/svn/trunk/ zend-db-model-generator-read-only

然後將config資料夾下的config.php-default 複製一份成為 config.php

並修改裡面資料庫的設定


回到上一層後

執行zend-db-model-generator.php 看有什麼功能好用

--database : database name
--location : specify where to create the files (default is current directory)
--namespace : override config file's default namespace
* --table : table name (parameter can be used more then once)
--all-tables : create classes for all the scripts in the database
* --ignore-table : not to create a class for a specific table
* --ignore-tables-regex : ignore tables by perl regular expression
* --tables-regex : add tables by perl regular expression

先來試用一下

php zend-db-model-generator.php --database musicscript --all-tables

他會將你資料庫中的musicscript所有的資料表都建立model在目前資料夾底下
如果想指定位置只要設定--location參數即可。

也能指定資料表user

php zend-db-model-generator.php --database musicscript --table user

測試下--all-tables好像有錯誤訊息!!但不影響建模

當然如果你不喜歡他所建立的內容,也有模版可以自己修改在templates資料夾下

2010年9月27日 星期一

一個用php操控Mysqlnd的接口mysqlnd_uh

以往我們使用PHP連接MySQL時,大部分都是C接口
而這個是使用純粹PHP寫出的PHP功能

http://pecl.php.net/package/mysqlnd_uh


可以用來使用PHP Mysql Proxy的功能


關於Mysqlnd是PHP5.3以上提供的庫,為資料源提供緩衝
也可節省更多資源的消耗詳情請看

http://www.javaeye.com/news/380

2010年9月22日 星期三

PHP的Include與Autoload性能比較

直譯語言在運行期時可以動態載入欲執行的物件,在速度上都會認為Autorun其實不然

請看autoload 與 include性能比較
http://calos-tw.blogspot.com/2009/08/php-autoload-include.html

文中測試結果
迴圈為1 時 . include_once 比較快
迴圈為1000時. __autoload 快很多

當重覆載入時__autoload比較快,但實際上在開發,要重覆載入一個物件的機會可能比較少,使用時
Autorun倒是可以減少許多手工寫code的部份&^^

2010年9月20日 星期一

取得PHP物件中的屬性及方法

在使用第三方的物件時由於文件缺乏,可以使用

get_class_vars 返回由類的默認屬性組成的數組
get_class_methods 返回由類的方法名組成的數組

method_exists(物件名稱, 屬性) 該物件是否有該方法


來取得該物件的屬性及方法

2010年9月9日 星期四

字串切隔取得副檔名

$aryExtend = explode('.', 'abc.gif');
# /**
# * $filename 是 abc.gif
# * $aryExtend為陣列
# */
$extend = end($aryExtend);

2010年9月6日 星期一

PHP中讀取YAML

先至http://sourceforge.net/projects/spyc/files/

下載spyc可供使用
基於Ruby帶動了一股使用YAML的風潮,想在PHP中使用可以試試spyc物件。
YAML就結構上比XML更簡潔。


include('spyc.php');

// 讀取YAML文件,生成陣列
$yaml = Spyc::YAMLLoad('spyc.yaml');

// 將陣列轉換成YAML文件
$array['name'] = 'lrenwang';
$array['site'] = 'blog.lrenwang.com';
$yaml = Spyc::YAMLDump($array);

Spyc::YAMLDump只是提供轉換,想修改檔案可以參考一下

file_put_contents('spyc.yaml',$yaml);

2010年5月17日 星期一

最近關注的網站

http://code.google.com/p/memcache-cluster-failover-php/


http://code.google.com/p/phuselage/

http://www.agavi.org/

http://www.michaelheid.de/gophe-search-service/

2010年4月27日 星期二

常用的PHP function

在php開發中,我們經常會遇到一些函數,下面是整理好的,可以直接使用,方便開發效率,不過建議大家一定要先看懂,然後在這個基礎上增加功能就提高了自身能力了

1.產生隨機字符串函數

function random($length) {

$hash = @#@#;

$chars = @#abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz@#;

$max = strlen($chars) - 1;

mt_srand((double)microtime() * 1000000);

for($i = 0; $i < $length; $i ) { $hash .= $chars[mt_rand(0, $max)]; } return $hash; } 2.截取一定長度的字符串 注:該函數對gb2312使用有效 function wordscut($string, $length ,$sss=0) { if(strlen($string) > $length) {

if($sss){

$length=$length - 3;

$addstr=@# ...@#;

}

for($i = 0; $i < $length; $i ) { if(ord($string[$i]) > 127) {

$wordscut .= $string[$i].$string[$i 1];

$i ;

} else {

$wordscut .= $string[$i];

}

}

return $wordscut.$addstr;

}

return $string;

}

3.取得客戶端ip 地址

function getip(){

if (getenv("http_client_ip") && strcasecmp(getenv("http_client_ip"), "unknown"))

$ip = getenv("http_client_ip");

else if (getenv("http_x_forwarded_for") && strcasecmp(getenv("http_x_forwarded_for"), "unknown"))

$ip = getenv("http_x_forwarded_for");

else if (getenv("remote_addr") && strcasecmp(getenv("remote_addr"), "unknown"))

$ip = getenv("remote_addr");

else if (isset($_server[@#remote_addr@#]) && $_server[@#remote_addr@#] && strcasecmp($_server[@#remote_addr@#], "unknown"))
$ip = $_server[@#remote_addr@#];

else

$ip = "unknown";

return($ip);

}
4. 創建相應的文件夾

function createdir($dir=@#@#)

{

if (!is_dir($dir))

{

$temp = explode(@#/@#,$dir);

$cur_dir = @#@#;

for($i=0;$i
if(!empty($url))

$html .="";

$html .="";

$html .="



";

$html .="";

$html .="";

$html .="";

$html .="";

$html .="".$title."";

$html .="";

$html .="
".$message."

";

if (!empty($url))

$html .="系統將在3秒後返回
如果您的瀏覽器不能自動返回,請點擊[這裡]進入";
else

$html .="[返回]";

$html .="";

$html .="";

echo $html;

exit;

}

7. 分頁(兩個函數配合使用)

function getpage($sql,$page_size=20)

{
global $page,$totalpage,$sums; //out param

$page = $_get["page"];

//$eachpage = $page_size;

$pagesql = strstr($sql," from ");

$pagesql = "select count(*) as ids ".$pagesql;

$result = mysql_query($pagesql);

if($rs = mysql_fetch_array($result)) $sums = $rs[0];

$totalpage = ceil($sums/$page_size);

if((!$page)||($page<1)) $page=1; $startpos = ($page-1)*$page_size; $sql .=" limit $startpos,$page_size "; return $sql; } function showbar($string="") { global $page,$totalpage; $out="共& lt;font ".$totalpage."color=@#red@#>".$totalpage."< /font>頁";

$linknum =4;
$start = ($page-round($linknum/2))>0 ? ($page-round($linknum/2)) : "1";

$end = ($page round($linknum/2))<$totalpage ? ($page round($linknum/2)) : $totalpage; $prestart=$start-1; $nextend=$end 1; if($page<>1)

$out .= "第一頁 ";

if($start>1)

$out.="..<< ";

for($t=$start;$t<=$end;$t ) { $out .= ($page==$t) ? "[".$t."] " : "$t ";
}

if($end<$totalpage) $out.=">>..";

if($page<>$totalpage)

$out .= " 最後頁";

return $out;

}

8.獲取新插入數據的 id

2010年4月23日 星期五

檢查數值是否存在於陣列的Key或Value

在PHP中常用的in_array是用來檢查

$array = array("a", "b, "c");


in_array("a",$array);

這樣結果為真,那當你想知道是否在鍵中可以用

$array = array("a"=>0, "b"=>1, "c"=>0);

array_key_exists("a", $array)

結果為真

2010年4月13日 星期二

使用PHP來做人臉辨識

透過利用OPENCV來製作人臉辨識的效果



http://ithelp.ithome.com.tw/question/10036727

2010年3月9日 星期二

Zend Framework Session

ZF的Session可以在全域使用
可用再換頁時的資料傳遞

$DF = new Zend_Session_Namespace('DF');

指定
$DF->contacts = array('A', 'B','C');

取用

$contacts = (array) $DF->contacts;

2010年1月1日 星期五

MVC與肯X基

MVC與肯X基

晚上睡不著覺,妹妹在肯X基上班,跟他聊上班的事情,聊著聊著感覺很熟悉
MVC架構為什麼跟肯X基的的工作流程這麼像,所以就記錄下來,希望對想了解
架構的人能有所幫助。

註:mvc是Xeroe PARC在20世紀80年代為程式語言Smalltalk-80所發明的一種開發模式


演出人員:

櫃檯V小姐(通常都要有點好看,所以view很重要)
總配C阿姨(通常就是看客人多少負責發落漢堡手、麵包手做事的人)
漢堡手M1、麵包手M2、飲料手M3(就是壓麵包然後做漢堡出來跟把炸雞的人)
最後當然還有客人(就是所謂的Client、EndUser)


動作是這樣的
1.等了好久客人終於進門了
2.櫃檯V小姐展示一下產品並問客人說請問你要點什麼
3.客人:我要一份X號餐(一份漢堡、一杯可樂、一份薯條)
4.櫃檯V小姐把他key在收銀機上
5.總配C阿姨從後面的螢幕上看到了客人訂餐的資料
6.依照客人的需要總配C阿姨發落漢堡手M1、麵堡手M2及飲料手M3製作各自的東西
7.漢堡手去找漢堡皮、肉片、萵苣絲,薯條手開始鏟薯條,飲料手開始做飲料
8.總配檢查了一下做好的東西,看看是內用還是點餐車道,把它呈上透明的保溫箱裡或外帶的車道窗口
9.櫃檯小姐把產品拿給客人


如果換成網頁程式的MVC架構是這樣解釋的
1.也是在等使用者上這個網站
2.使用者GET網頁,展示網頁畫面至使用者的瀏覽器(VIEW)
3.使用者點擊某一頁,告訴Server我要這一頁
4.無對應的動作
5.Ctrl接受到使用者的要求
6.依照使用者點擊的頁面的功能,開始跟Model要資料
7.Model會依需求跟資料庫來自同一個表或不同的表查詢出資料,並做成Ctrl所能接受的資料
8.Ctrl依照剛剛使用者的要求,看回傳給View用頁面呈現,還是Ajax來呈現
9.View將所需求的資料呈現出來

2009年12月25日 星期五

Zend FrameWork的交易

$this->db->beginTransaction();

try {

//執行SQL語法

$this->db->insert('dbname' , array('欄位1' => '值1'));
$this->db->insert('dbname' , array('欄位2' => '值2'));
$this->db->insert('dbname' , array('欄位3' => '值3'));
$this->db->commit();//成功就執行
}catch (Zend_Db_Exception $e){
$this->db->rollback();//失敗就回去上一步
throw $e;

}

2009年12月13日 星期日

PHP的框架及ORM框架

PHP框架

CoreMVC官方網站
CodeMVC_google

fleaphp

ThinkPHP

CakePHP

CodeIgniter


EasyFramework


戲法人人會變,看你喜歡用哪一種摟

最近在看阿六文章

有段玩笑話說
使用Zend就像加入共產黨
FleaPHP像是改革開放
ThinkPHP開始實施共產主義
所有都試過後發現無黨派的最自由

PHP的ORM框架

doctrine

ZendFramework資料庫的設置

ZendFramework設定資料庫時config.ini,跟ROR一樣有個專門的設定檔

[general]
db.adapter=PDO_MYSQL //使用PDO的MySQL接口
db.config.host=localhost //MySQL的主機IP
db.config.username=root //填入資料庫的使用者
db.config.password= //填入資料庫的密碼
db.config.dbname=zendoophp //填入使用的資料庫名稱



然後在單一進入點的index.php
註冊這組設定
$config=new Zend_Config_Ini('./application/config/config.ini',null, true);
Zend_Registry::set('config',$config);

$dbAdapter=Zend_Db::factory($config->general->db->adapter,
$config->general->db->config->toArray());

設定資料庫接口從Zend_Db::factory(接口,設定陣列);

$dbAdapter->query('SET NAMES UTF8');
先送出一個SQL,將資料庫的連線語系設定為中文

2009年11月29日 星期日

如何動手學程式

如何動手學程式以PHP為例

其實PHP有著溫和的學習曲線
可以提供對有興趣的程式設計者
有不錯的信心。

2009年10月22日 星期四

如何在Aptana設定SFTP



先開啟一個PHP專案











填入專案名稱


完成專案新增後,在專案的名稱按右鍵










選擇SFTP



設定好SFTP,這樣就能按Ctrl+S存檔的時候自動上傳



如果選自動上傳SFTP有問題可以參考



開啟 Aptana 的 upload current file on save
http://www.joehorn.idv.tw/archives/2009/09/04/631/