顯示文章

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


主題 - uberr

頁: [1]
1
Zend_Acl

今天介紹Zend Acl的用途,意思就是權限控制。它配合Zend_Auth,Plugin來用的話,會幫你省卻很時間。

先教大家如何使用Zend_Acl
1.建立角色
2.建立資源
3.對每個來源加入角色權限控制


//建立一個zend_acl object
$acl = new Zend_Acl();

1.建立角色,我們建立最簡單的二個角色好了(guest,admin)

$guest = new Zend_Acl_Role('guest');
$admin = new Zend_Acl_Role('admin');

//把群組加到acl object裡
$acl->addRole($guest);
$acl->addRole($admin);

2.建立資源,建立admin page,auth page

$admin_resource = new Zend_Acl_Resource('admin_index');
$auth_resource = new Zend_Acl_Resource('auth_index');

//把資源加到acl object裡
$acl->add($admin_resource);
$acl->add($auth_resource);

3.對每個來源加入角色權限控制,只有登入後才能有權限對admin page進行操作,如果使用者没有登入,就會redirect使用者到auth page

//第一個param是角色,第二個param是controller,第三個param是action,第四個param是自定的callback(註:null代表全部)
//上邊的意思就是說,不准許任何角色去訪問任何的資源(controller/action)
$acl->deny(null,null,null);

//guest有權限訪問auth module->index controller->login action
$this->allow('guest','auth_index',array('login','index'));

//admin有權限訪問所有的資源,最後的param是用來驗証使用者登入狀態,如果使用者登入才會准許
$this->allow('admin',null,null,new My_Acl_AuthAssert($auth));

ACL大致就是這樣設定的。

/********************************************************************
* Zend_Auth+Zend_Acl一起使用
*********************************************************************/

Zend_Auth我不多說了請自行看我之前所寫的文章

1.首先建立一個acl object,設定好acl的權限控制(同上)

2.使用controller plugin功能,在preDispatch中去檢查使用者是否對該controller/action有權限

index.php
代碼: [選擇]
<?
//建立Zend_Acl Object,權限控制
。。。。。

//建立Zend_Auth Object
。。。。

//把helper path加進去,因為controller plugin需要使用到My_Plugin_Auth class
$view = new Zend_View();
$view->addHelperPath(APPLICATION_DIRECTORY.'/library/My/View/Helper','My_View_Helper');
$viewRender = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRender->setView($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRender);

$controller = Zend_Controller_Front::getInstance();
$controller->addControllerDirectory('application/auth/controllers','auth');
$controller->addControllerDirectory('application/admin/controllers','admin');

//加入controller plugin,檢查使用者權限
$controller->registerPlugin(new My_Plugin_Auth($auth,$acl));
?>

My/Acl/AuthAssert.php
代碼: [選擇]
/**
 * 檢查使用者是否登入
 */
class My_Acl_AuthAssert implements Zend_Acl_Assert_Interface {

/*
* @param Object
*/
private $_auth;

/*
* @param Object Zend_Auth
*/
public function __construct(Zend_Auth $auth)
{
$this->_auth = $auth;
}

/*
* @param Object Zend_Acl
* @param Object Zend_Acl_Role_Interface
* @param Object Zend_Acl_Resourece_interface
*
* @return boolean
*/
public function assert(Zend_Acl $acl, Zend_Acl_Role_Interface $role = null, Zend_Acl_Resource_Interface $resource = null, $privilege = null) {
return $this->_isLogin();
}

/*
* check user login status
*
* @return boolean
*/
private function _isLogin()
{
//你所需要的檢查程式碼
}
}

?>


My/Plugin/Auth.php
代碼: [選擇]
<?php

/*
 *  在preDispatch中去檢查使用者是否對該controller/action有權限
 */
class My_Plugin_Auth extends Zend_Controller_Plugin_Abstract {

/*
 *@param Object
 */
private $_auth;

/*
 * @param Object
 */
private $_acl;

/*
 * @param Array
 */
private $_no_auth = array(
&#39;module&#39; => &#39;auth&#39;,
&#39;controller&#39; => &#39;index&#39;,
&#39;action&#39; => &#39;index&#39;
);

/*
 * @param Array
 */
private $_no_acl = array(
&#39;module&#39; => &#39;admin&#39;,
&#39;controller&#39; => &#39;index&#39;,
&#39;action&#39; => &#39;index&#39;
);

public function __construct(Zend_Auth $auth,Zend_Acl $acl)
{
$this->_auth $auth;
$this->_acl $acl;
}

public function preDispatch()
{
$request $this->getRequest();
$module $request->getModuleName();
$controller $request->getControllerName();
$action $request->getActionName();
$resource $module.&#39;_&#39;.$controller;
$acl $this->_acl;

//設定使用者角色,如果登入的話,把使用者設定成admin角色
if(isset($_SESSION[&#39;AUTH&#39;])) :
$role = &#39;admin&#39;;
else :
$role = &#39;guest&#39;;
endif;

//檢查資源是否加入到acl object
if($acl->has($resource)) :

//如果使用者没有對該資源的權限,把使用者redirect
if(!$acl->isAllowed($role,$resource,$action)) :
switch($role) :
case &#39;admin&#39;:
$module $this->_no_acl[&#39;module&#39;];
$controller $this->_no_acl[&#39;controller&#39;];
$action $this->_no_acl[&#39;action&#39;];
break;
default:
$module $this->_no_auth[&#39;module&#39;];
$controller $this->_no_auth[&#39;controller&#39;];
$action $this->_no_auth[&#39;action&#39;];
break;
endswitch;
endif;

//設定redirect的module/controller/action
$request->setModuleName($module);
$request->setControllerName($controller);
$request->setActionName($action);
else :

//設定redirect的module/controller/action
if($role == &#39;admin&#39;) :
$module $this->_no_acl[&#39;module&#39;];
$controller $this->_no_acl[&#39;controller&#39;];
$action $this->_no_acl[&#39;action&#39;];
else :
$module $this->_no_auth[&#39;module&#39;];
$controller $this->_no_auth[&#39;controller&#39;];
$action $this->_no_auth[&#39;action&#39;];
endif;

$request->setModuleName($module);
$request->setControllerName($controller);
$request->setActionName($action);
endif;
}
}

?>


天創科技網頁設計公司

2
Zend_Controller是整個Zend Framework的核心.主要的功能是接收你的請求(request)然後分發(dispatch)你的請求,最後接收回應(response).



從上圖中,我們可以看到Zend_Controller如何運作.

1.首先會建立一個Zend_Controller_Front,它是Singleton(getInstance).只可以創建一個,同時建立request和response Object.
註:request Object是用來儲存請求的資料.response Object是用來儲存 response 的header和body.

2.接收請求(要去哪一個controller,action,帶有什麼parameter),由Zend_Controller_Request把所需要的資料寫到$request Object.

3. 然後由Zend_Controller_Router把請求路由到所指定的controller,action,交由Zend_Controller_Dispatch_Standard,路由只會做一次.

4. 當Dispatch接收到請求後,就會把Controller同action format成它所需要的標準.
註:所接收的Controller和Action名稱都會以小寫為名.例如請求到foo Controller的bar Action.它叫會從request Object讀取array(‘controller’=> ‘foo’,’action’=> ‘bar’),然後它會把foo format成ufirst(foo).’Controller’,bar format成 bar.’Action’.
如果你要想要有大小寫之分,例如: 請求到salesInvoice Controller的addInvoice Action.哪就要把它寫成 /sales.invoice/add.invoice or /sales-invoice/add-invoice.


5.   Dispatch係會以一個loop的方式去做,它會有一個flag,當接收第一個請求的時候,它初始為true,如果你在任何動作其間重設了這個值,哪就會重新回到Dispatch起點然後分發動作給Action.
舉一個例子好了:
當你想新增一個invoice同時想把它寫進log裡頭,首先發出一個請求請求 /invoice/add

代碼: [選擇]
Class InvoiceController extends Zend_Controller_Action {

Public function addAction() {
// 如果新增成功,寫進log File裡頭
If() {
// 呼叫Log Action,同時重設Dispatch的flag
$this->_forward(‘log’);
}
}

Public function logAction() {
//寫入到log file
}
}

6.   當執行完Action動作之後,如果没有其它動作要進行,就會回傳response,如果Controller Front没有要求處理回傳的資料的話,哪就會自動把response output出去.

由Front Controller處理response例子:

Index.php
代碼: [選擇]
$controller = Zend_Controller_Front::getInstance();
$controller->setDirectory(‘./application/controllers’);
$controller->throwExceptions(false);
$controller->returnResponse(‘true’); // 要求回傳response,由自己處理

$response = $controller->dispatch();

// 處理回傳的response
If($response->isException()) :

Endif;

$response->sendResponse(); // Output你的header和body

今天只為大家介紹Zend Controller的基本概念.還有更多的東西需要學習.例如:Zend_Controller_Route,Zend_Controller_Plugin.

3
最近很忙所以都没有時間寫Zend Framework和Dojo的文章。難得今天有空,所以介紹一下Zend_Filter和Zend_Validate,並實作把它們一起使用。現在Zend Framework巳經有1.5 beta,新増了很多新的功能。多了infocard,openId,zend_form,zend_layout,utf8-support for pdf document..etc.

Zend_Filter介紹:
Zend_Filter是用來把Data過濾,例如把空白移除,HTML ,PHP的tag移除,把字串轉成upper or lower..etc.
1.Zend_Filter_Alnum //回傳 [a-zA-Z0-9]
2.Zend_Filter_Alpha //回傳 [a-ZA-Z]
3.Zend_Filter_BaseName //回傳文件的基本名
4.Zend_Filter_Digits//回傳數字[0-9]
5.Zend_Filter_Dir//回傳路徑
6.Zend_Filter_HtmlEntities//回傳轉換成HTML實體字符串
7.Zend_Filter_Int//回傳整數
8.Zend_Filter_StringToLower//回傳把字串轉成小寫
9.Zend_Filter_StringToUpper//回傳把字串轉成大寫
10.Zend_Filter_StringTrim//回傳移除空白的字串
11.Zend_Filter_StringTags//回傳把html,php tag移除的字串

Zend_Validate介紹:

Zend_Validate是用來進行験証,例如對日期,數字,IP,主機名,EMAIL,Empty..etc.作出験証。
1.Zend_Validate_Alnum//験証字串是否只含有[a-zA-Z0-9],如果是回傳true
2.Zend_Validate_Alpha//験証字串是否只含有[a-zA-Z],如果是回傳true
3.Zend_Validate_Between//験証數字是否只在MIN同MAX內,如果是回傳true
4.Zend_Validate_Date//験証日期,如果是回傳true
5.Zend_Validate_Digits//験証如果只包含數字符號,如果是回傳true
6.Zend_Validate_EmailAddress//験証電郵地址,如果是回傳true
7.Zend_Validate_Float//験証是否為float number,如果是回傳true
8.Zend_Validate_GreaterThan//験証當$value大於MIN,如果是回傳true
9.Zend_Validate_HostName//験証HostName,如果是回傳true
10.Zend_Validate_Int//験証如果是整數,如果是回傳true
11.Zend_Validate_LessThan//験証當$value小於MAX,如果是回傳true
12.Zend_Validate_NotEmpty//験証如果value不是空值,如果是回傳true
13.Zend_Validate_StringLength//験証$value長度,如果没有超出指定長度回傳true

有更多filter和validate功能我都没有列出來,如需要更多information,請自行參考Zend Framework API http://framework.zend.com/apidoc/core/

運作流程:
1.新增add.phtml,使用者可以新増一個user,可以塡入firstname,lastname,age .
firstname and last不可以是空值(empty)
age只可以between 1-140歳
2.當user submit的時候,在IndexController.php裡頭的addAction function會call User Class create一個新user,會把user的輸入傳送到user這個object,最後做験証,如果成功,就會jump到index/index,顯示user detail.如果 fail,就會顯示錯鋘。
3.験証方面是今天教學內容最重要的。
  首先會create一個filter,把空白(trim)同html,php tag移除,我們會用到Zend_Filter_StringTrim和Zend_Filter_StringTags.
  然後我會create一個defaultChain和ageChain是給験証用的。我們到Zend_Validate_NotEmpty和Zend_Validate_Between.
  最後我們會用到Zend_Filter_Input把filter同validate連在一來運用。

user.sql
代碼: [選擇]
CREATE TABLE `user` (
  `id` mediumint(9) NOT NULL auto_increment,
  `first_name` varchar(255) default NULL,
  `last_name` varchar(255) default NULL,
  `age` int(3) default NULL,
  PRIMARY KEY  (`id`)
)


index.php

代碼: [選擇]
<?php

set_include_path
(&#39;.&#39;.PATH_SEPARATOR.&#39;./library/&#39;.PATH_SEPARATOR.&#39;./application/models/&#39;);
include "Zend/Loader.php";

Zend_Loader::loadClass(&#39;Zend_Controller_Front&#39;);
Zend_Loader::loadClass(&#39;Zend_Db&#39;);
Zend_Loader::loadClass(&#39;Zend_Config_Ini&#39;);
Zend_Loader::loadClass(&#39;Zend_Registry&#39;);
Zend_Loader::loadClass(&#39;Zend_Validate_NotEmpty&#39;);// 滙入Validate Not Empty Class
Zend_Loader::loadClass(&#39;Zend_Validate_Between&#39;);// 滙入Validate Between Class
Zend_Loader::loadClass(&#39;Zend_Filter_Input&#39;);// 滙入Filter Input Class

$config = new Zend_Config_Ini(&#39;./application/config/config.ini&#39;,&#39;general&#39;);
$dbAdapter Zend_Db::factory($config->db->adapter,$config->db->config->toArray());
Zend_Registry::set(&#39;dbAdapter&#39;,$dbAdapter);

$frontController Zend_Controller_front::getInstance();
$frontController->setControllerDirectory(&#39;./application/controllers&#39;);
$frontController->dispatch();

indexController.php
代碼: [選擇]
<?php
/** Zend_Controller_Action */
require_once(&#39;Zend/Controller/Action.php&#39;);
require_once(&#39;My/class.DataManager.php&#39;);// 滙入DataManager Class
require_once(&#39;My/class.User.php&#39;);// 滙入User Class

class IndexController extends Zend_Controller_Action {

public function init() {
$this->view->baseUrl $this->_request->getBaseUrl();
}

    public function 
indexAction() {
$this->view->entities DataManager::getAllUserAsObject(); // 拿取user list,return每一個user object
    
}

public function addAction() {
if($this->getRequest()->isPost()) : //如果是由post傳送過來的data,就新増使用者
$first_name $this->_request->getParams(&#39;first_name&#39;); //拿取的data是用array,所以$first_name,$last_name,$age都是array來,因為Zend_Filter_Input是要你道入array才會幫你做験証。請記得getParam和getParams是不同的東西,一個回傳String,另一個回傳array
$last_name $this->_request->getParams(&#39;last_name&#39;);
$age $this->_request->getParams(&#39;age&#39;);

$user = new User(); //create使用者 user object
$user->setTable(&#39;user&#39;); //設定新増到哪一個table
$user->setField(&#39;first_name&#39;,$first_name); //把使用者輸入的data,設定成user object的variable
$user->setField(&#39;last_name&#39;,$last_name);
$user->setField(&#39;age&#39;,$age);
$validate_handle $user->validate(); //****做験証**** 請留意class.User.php裡頭validate function

if($validate_handle) : //如果験証回傳true,就新増使用者,然後redirect去index/index,顯示使用者information
$user->save(); 
$this->_redirect(&#39;/&#39;);
else : //如果回傳false,就顯示error
$this->view->errors $user->getErrors(); 
endif;
endif;
}
}

add.phtml
代碼: [選擇]
<h4>Add User Form</h4>
<form method="post" name="adduserform" action="<? echo $this->baseUrl; ?>/index/add">
first name: <input name="first_name" type="text" /> * must not empty <br>
last name: <input name="last_name" type="text" /> * must not empty <br>
age: <input name="age" type="text" /> // must between 1-140 <br>
<input type="submit" value="Add User" />
</form>

<?
if($this->errors):

foreach($this->errors as $error) :
echo $error."<br>";
endforeach;

endif;
?>

index.php
代碼: [選擇]
<script>
function redirect($a) {
window.location = $a;
}
</script>
<input type="button" value="Add User" onclick='redirect("<? echo $this->baseUrl; ?>/index/add");' />
<?php

if($this->entities) :
foreach($this->entities as $entity) :
echo "<h4>User</h4>";
echo $entity->__toString()."<br>"// magic function convert object to string __string(),php 5.2 之後才support magic function,如果 php 5.2之前的version就要加上->__toString()
echo "<hr>";
endforeach;
else :
echo &#39;no user found&#39;;
endif;
?>


class.User.php
代碼: [選擇]
<?php
require_once(&#39;My/class.GenericObject.php&#39;);

class User extends GenericObject {

private $_errors;

public function __construct($user_id null) {
$this->_errors = array();
$this->_user_id $user_id;
}

public function __toString() {
$result_rows parent::getAllFields();
$s = &#39;&#39;;
foreach($result_rows as $key => $value) :
$s .= $key.&#39; : &#39;.$value.&#39;<br>&#39;;
endforeach;

return $s;
}

//*********************************Important***********************************************
public function validate() {
$first_name $this->_Modify_fields[&#39;first_name&#39;];
$last_name $this->_Modify_fields[&#39;last_name&#39;];
$age $this->_Modify_fields[&#39;age&#39;];

               
$filter = array( //create一個filter
      
          &#39;*&#39; => array( //對所input都進行過濾
      
  "StringTrim"//過濾空白
      
  "StripTags" //過濾html,php tags
                
));

$defaultChain = new Zend_Validate(); //create 認證物件,套用到first_name,last_name
                
$defaultChain->addValidator(new Zend_Validate_NotEmpty(),false);  //加入Not Empty認證功能

                
$validators = array(
      
           &#39;first_name&#39; => $defaultChain
                 
);
                
$first_name = new Zend_Filter_Input($filter,$validators,$first_name); //把filter,validate連在一起,然後對first_name作認証工作。

                
$validators = array(
      
          &#39;last_name&#39; => $defaultChain
                 
);
                
$last_name = new Zend_Filter_Input($filter,$validators,$last_name);//把filter,validate連在一起,然後對last_name作認証工作。

                //因為age一定是數字,和有限制,所以不可以把defaultChain套用到age
$ageChain = new Zend_Validate(); //新増一個認證物件,套用到age
$ageChain->addValidator(new Zend_Validate_Between(&#39;1&#39;,&#39;140&#39;));//加入Between認證功能,限制age在1-140歳

                
$validators = array(
      
           &#39;age&#39; => $ageChain
                
);
               
$age = new Zend_Filter_Input($filter,$validators,$age);//把filter,validate連在一起,然後對$age作認証工作。

               //検查験証是否有錯誤出現
     
       if ($first_name->hasInvalid() || $first_name->hasMissing()) :
      
          foreach ($first_name->getMessages() as $message) :
     
     array_push($this->_errors,$message[0]); //把錯誤寫入到 $this->errors
       
          endforeach;
     
       elseif ($last_name->hasInvalid() || $last_name->hasMissing()) :
      
          foreach ($last_name->getMessages() as $message) :
     
     array_push($this->_errors,$message[0]); //把錯誤寫入到 $this->errors
       
          endforeach;
     
       elseif ($age->hasInvalid() || $age->hasMissing()) :
      
          foreach ($age->getMessages() as $message) :
     
     array_push($this->_errors,$message[0]); //把錯誤寫入到 $this->errors
                  
endforeach;
       endif;

if(sizeof($this->_errors) > 0) : //検查$this->errors裡頭有没有東西
return false;
else :
return true;
endif;
}

public function getErrors() {
return $this->_errors;
}
}

?>


class.DataManager.php
代碼: [選擇]
<?php

class DataManager {

public static function getAllUserAsObject() {
$db Zend_Registry::get(&#39;dbAdapter&#39;);
$select $db->select();
$select->from(&#39;user&#39;,&#39;*&#39;);
$result_rows $db->fetchAll($select);
$obj_array = array();

if($result_rows) :
foreach($result_rows as $rows) :
$refObjArray = &$obj_array[];
$refObjArray = new User($rows[&#39;id&#39;]);
$refObjArray->forceReloaded();

foreach($rows as $key => $value) :
$refObjArray->setField($key,$value);
endforeach;

endforeach;

return $obj_array;
else :
return array();
endif;
}
}
?>


class.GenericObject.php
代碼: [選擇]
<?php

class GenericObject {

private $_isLoaded false;
private $_table_name;
private $_class_name;
private $_result_rows = array();
private $_user_id;
protected $_Modify_fields = array();

private function _load() {
DataManager::getAllUserAsObject();
}

private function _checkLoaded() {
if(!$this->_isLoaded) :
$this->_load(); 
endif;
}

public function forceReloaded() {
$this->_isLoaded true;
}

public function setTable($table_name) {
$this->_table_name $table_name;
}

public function getField($field_name) {
$this->_checkLoaded();
return $this->_result_rows[$field_name];
}

public function getAllfields() {
$this->_checkLoaded();
return $this->_result_rows;
}

public function setField($field_name,$value) {
$this->_checkLoaded();
$this->_Modify_fields[$field_name] = $value;
$this->_result_rows[$field_name] = $value;
}

public function numberOfItem() {
$this->_checkLoaded();
return sizeof($this->_result_rows);
}

public function save() {
$user_id $this->_user_id;
$table_name $this->_table_name;
$data = array();

foreach($this->_Modify_fields as $key => $value) :
$data[$key] = $value[$key];
endforeach;

$db Zend_Registry::get(&#39;dbAdapter&#39;);

try {
if(!$user_id) :
$query_handle $db->insert($table_name,$data);
else :
$where "id = ".$user_id;
$query_handle $db->update($table_name,$data,$where);
endif;
}
catch (Exception $e) {
echo "Error: ".$e->getMessage();
}
}
}
?>


Demo:http://wingning.no-ip.org/studyarea/zend_filter/

下載:
http://wingning.no-ip.org/studyarea/download/zend_filter.tar.gz

天創科技網頁設計公司

4
今天會教大家如何使用Zend_Auth去驗証使用者.Zend_Auth是一個很方便而且很安全的認證module.只要配合Zend_Filter和Zend_Validate過濾和驗証使用者輸入的資料,就不用擔心使用者輸入一些奇怪的東西.Zend_Auth提供Storage功能,它會把login者的資料儲存到Session裡.

Zend_Filter的主要功能是把一些你不想要的東西拿掉,例如 HTML entities,alphabetic,white space,digit characters...etc.

Zend_Validate是用來證實使用者輸入的資料是你想要的type,例如 Not Empty,Alpha,Date,EmailAddress...etc

如果想要用到ACL的話.可以把Zend_Auth,Zend_Acl一起使用.是一個十分利害的武器.

不過今天我只會教大家如何使用Zend_Auth.

CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `username` varchar(50) NOT NULL,
  `password` varchar(32) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `username` (`username`)
)

運作流程:
1. 新增login.phtml,logout.phtml,success.phtml.
2. 建立一個Auth介面,把table名,認證時候要使用到column的名設定好.
4. 建立一個Auth Object.
5. 核對使用者輸入的資料.如果成功,重導使用者到success.phtml,如果不係的話就顯示錯誤信息.
6. 重導使用者到success.phtml的時候,還要重新檢查一次使用者是否登入.

index.php
代碼: [選擇]
<?php

set_include_path
(&#39;.&#39;.PATH_SEPARATOR.&#39;./library/&#39;.PATH_SEPARATOR.&#39;./application/m                                              odels/&#39;); // 設定module的位置
include "Zend/Loader.php"// 必需要include的module,它是把需要的module導入

Zend_Loader::loadClass(&#39;Zend_Controller_Front&#39;); // Zend_Controller_Front是必需的module,它是用來控制route
Zend_Loader::loadClass(&#39;Zend_Db&#39;);
Zend_Loader::loadClass(&#39;Zend_Config_Ini&#39;);
Zend_Loader::loadClass(&#39;Zend_Registry&#39;);
Zend_Loader::loadClass(&#39;Zend_Auth&#39;); // 加入 Auth Module
Zend_Loader::loadClass(&#39;Zend_Auth_Adapter_DbTable&#39;); //加入 Auth Adapter Table Module

$config = new Zend_Config_Ini(&#39;./application/config/config.ini&#39;,&#39;general&#39;); // 引入資料庫config檔案

// 設定資料庫介面
$dbAdapter Zend_Db::factory($config->db->adapter,$config->db->config->toArray());
Zend_Registry::set(&#39;dbAdapter&#39;,$dbAdapter);

$frontController Zend_Controller_front::getInstance(); // create一個Front Object
$frontController->setControllerDirectory(&#39;./application/controllers&#39;); // 設定Controller目錄的路徑
$frontController->dispatch();

IndexController.php
代碼: [選擇]
<?php

class IndexController extends Zend_Controller_Action
{
public function init() {
$this->view->baseUrl $this->_request->getBaseUrl(); // 設定baseUrl
}

    public function 
indexAction()
    {
               
// 檢查使用者是否登入
       $auth Zend_Auth::getInstance();

       if ($auth->hasIdentity()) : // 如果登入,重導使用者到success page
        $this->_redirect(&#39;/index/success&#39;);
               
else :
 
        $this->_redirect(&#39;/index/login&#39;); // 重導使用者到login page
       endif;
    }

    public function 
loginAction()
    {
               
// 檢查使用者是否登入
$auth Zend_Auth::getInstance(); // 建立一個Auth Object

        if ($auth->hasIdentity()) : // 如果登入,重導使用者到success page
      $this->_redirect(&#39;/index/success&#39;);
                
endif;

try {
if ($this->_request->isPost()) : // 如果資料是從post傳過來,就開始做認證

$db Zend_Registry::get(&#39;dbAdapter&#39;); // 引入資料庫介面
                                // 使用者輸入的資料
$username $this->_request->getParam(&#39;username&#39;);
$password $this->_request->getParam(&#39;password&#39;);

$authAdapter = new Zend_Auth_Adapter_DbTable($db,&#39;users&#39;,&#39;username&#39;,&#39;password&#39;); // 設定Auth介面.
//@ param1: database adapter
//@ param2: table
//@ param3: username column
//@ param 4: password column

                                
// 把使用者輸入的username and password儲存到Auth介面
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);

// 開始做認證工作
$validate $auth->authenticate($authAdapter); // 對比使用者輸入的資料跟資料庫是否一樣

// 如果認證成功,就把table裡頭的資料寫入到Storage裡,除了password
if ($validate->isValid()) :
$auth->getStorage()->write($authAdapter->getResultRowObject(null,&#39;password&#39;)); // 寫入到Storage裡頭
//@param1 : null代表全部column,如果你只想寫入某些資料,例如 username and realname,可以使用array,array(&#39;username&#39;,&#39;realname&#39;)
//@param2 : 不需要寫入的column,password是一個很重要的資料,千萬不要把它寫到session裡頭去.

$this->_redirect(&#39;/index/success&#39;); // 重導使用者到success page
else :
$this->view->errorMessage = &#39;Login failed,Please try again.&#39;; //如果登入失敗.重導使用者到login page,顯示失敗訊息.
endif; 
endif;
      
}
catch(Zend_Exception $e) {
echo "Error: ".$e->getMessage();
}
    }

    public function 
logoutAction()
    {
try {
Zend_Auth::getInstance()->clearIdentity(); //清除Storage裡頭的資料
$this->_redirect(&#39;/&#39;); //重導使用者到login page
      
}
catch(Zend_Exception $e) {
echo "Error: ".$e->getMessage(); 
}
    }

public function successAction()
{
               // 檢查使用者是否登入
$auth Zend_Auth::getInstance();

if (!$auth->hasIdentity()) : // 如果沒有登入,重導使用者到login page
$this->_redirect(&#39;/index/login&#39;);
endif;
}
}

login.phtml
代碼: [選擇]
<? if (!empty($this->errorMessage)) :
echo $this->errorMessage; //顯示錯鋘訊息
   endif;
?>
<form method="post" name="login" action="<?echo $this->baseUrl; ?>/index/login">
username:<input type="text" name="username" /><br>
password:<input type="password" name="password" /><br>
<input type="submit" value="login" />
</form>

success.phtml
代碼: [選擇]
<?
echo "Login successed";
?>

<form method="post" name="logout" action="<?echo $this->baseUrl; ?>/index/logout">
<input type="submit" value="logout" />
</form>

Demo:http://wingning.no-ip.org/studyarea/zend_auth/

username: demo
password: 123456

下載:
http://wingning.no-ip.org/studyarea/download/zend_auth.tar.gz

天創科技網頁設計公司

5
今天會教大家如何使用Zend Framework去連接資料庫.Zend_Db提供二種方法去連接資料庫, 1.Zend_Db   ,2. Zend_Db_Table.
今天要介紹的是Zend_Db,是比較簡的一種.Zend_Db所提供的DRBMS有以下:
IBM DB2 (pdo_ibm)
IBM DB2 and Informix Dynamic Server (IDS) (pdo_ibm)
MySQL (pdo_mysql)
MySQLi (mysqli)
Microsoft SQL (pdo_mssql)
Oracle (pdo_oci)
PostgreSQL (pdo_pgsql)
SQLite (pdo_sqlite)

你可以在這裡找到Zend_Db這個class的資料http://framework.zend.com/apidoc/core/


運制流程:
1.建立連接庫的檔案config.ini(host,database,user,password...etc)
2.建立一個連接資料庫的介面
3.開始連接資料庫
4.接收資料,然後回傳到View(頁面)

我們先在application目錄下建立一個config目錄,然後 在config目錄建立config.ini檔案.

config.ini

代碼: [選擇]
[general]
db.adapter = mysqli // 把它改成你的所使用的RDBMS
db.config.host = localhost // 資料庫的位置
db.config.username = username // 連接資料庫的用戶名
db.config.password = password // 連接資料庫的密碼
db.config.dbname = database // 資料庫的名稱

index.php
代碼: [選擇]
<?php

set_include_path
(&#39;.&#39;.PATH_SEPARATOR.&#39;./library/&#39;.PATH_SEPARATOR.&#39;./application/m                                              odels/&#39;); // 設定module的位置
include "Zend/Loader.php"// 必需要include的module,它是把需要的module導入

Zend_Loader::loadClass(&#39;Zend_Controller_Front&#39;); // Zend_Controller_Front是必需的module,它是用來控制route
Zend_Loader::loadClass(&#39;Zend_Db&#39;);
Zend_Loader::loadClass(&#39;Zend_Config_Ini&#39;);
Zend_Loader::loadClass(&#39;Zend_Registry&#39;);

$config = new Zend_Config_Ini(&#39;./application/config/config.ini&#39;,&#39;general&#39;); // 引入資料庫config檔案

// 設定資料庫介面
$dbAdapter Zend_Db::factory($config->db->adapter,$config->db->config->toArray());
Zend_Registry::set(&#39;dbAdapter&#39;,$dbAdapter);

$frontController Zend_Controller_front::getInstance(); // create一個Front Object
$frontController->setControllerDirectory(&#39;./application/controllers&#39;); // 設定Controller目錄的路徑
$frontController->dispatch();

IndexController.php
代碼: [選擇]
<?php

class IndexController extends Zend_Controller_Action
{
    public function 
indexAction()
    {
      try {
        
$db Zend_Registry::get(&#39;dbAdapter&#39;); // 引入資料庫介面
        
$select $db->select();
        
$select->from(&#39;bank&#39;,&#39;*&#39;)  // or (&#39;database&#39;,array(&#39;id&#39;,&#39;username&#39;...etc)
         
->where(&#39;bank_code != ?&#39;,&#39;BBB&#39;)
         
->order(&#39;bank_code&#39;);

        
$result $db->fetchAll($select); // 結果是以Array回傳
        
$this->view->data $result;
      }
      catch(
Zend_Exception $e) {
        echo 
"Error: ".$e->getMessage();
      }
    }
}

index.phtml
代碼: [選擇]
<?php
   
foreach($this->data as $key => $value) :
     echo 
"bankcode=".$value[&#39;bank_code&#39;]." : bank=".$value[&#39;bank&#39;]."<br>";
   
endforeach;
?>


Demo:http://wingning.no-ip.org/studyarea/zend_db/

下載[/color]http://wingning.no-ip.org/studyarea/download/zend_db.tar.gz

天創科技網頁設計公司

6
Zend Framework是php裡頭其中一種Framework.在台灣跟香港都比較難找到關於Zend Framework的文章.反而CakePHP的文章就很多.所以今天我想分享一下我的心得.我現在的Project都是用Zend Framework來完成.Zend Framework提供大量的module給你使用.它還提供連接Google,Yahoo,Flickr,Amazon..etc Web Services的module.

Zend_Auth // login module
Zend_Db // database module
Zend_Gdata // Google Application module

如果想要了解多些關於MVC,自己到google找吧.

M = Model // 設定連接資料庫的資料[當使用Zend_Db_Table才會用上]
V = View // 顯示的頁面
C = Controller // 控制器,就是你的php程式碼

運作過程:
鍵入網址->Controller->執行Action->回傳給View(顯示頁面)

運作原理:

example: http://www.example.com/auth/login
http://www.example.com // 網址
auth // Controller [控制器]
login // Controller裡面的Action [動作]

代碼: [選擇]
class AuthController extends Zend_Controller_Action
{
    public function loginAction()
    {
       // check username and password
    }
}

如果你沒有加入任何param係網址裡頭,預設是使用IndexController和Index Action

Zend Framework架構:
application/
    controllers/
        IndexController.php  // 所有Controller一定要大寫開頭
    models/
    views/
        scripts/
            index/
                index.phtml // 記得是phtml,不是html
htdocs/
    scripts/
    images/
    styles/
library/
.htaccess
index.php

安裝Zend Framework:
1.下載 Zend Framework,PHP5,MYSQL
http://framework.zend.com/releases/ZendFramework-1.0.3/ZendFramework-1.0.3.tar.gz
2.建立Zend Framework架構
3.解壓到Zend架構下的library目錄下,tar -zxf ZendFramework-1.0.3.tar.gz -C /var/www/html/[Zend 目錄]/library/
4.create .htaccess,寫入到 .htaccess
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
5.修改httpd.conf,把AllowOverride改成All

現在我們要建立index.php,IndexController.php,index.phtml.index.php 它是用來設定要重導(Route)去邊一個Controller,include module.是一個很重要的file.

廢話少說,來點實作吧~!

index.php

代碼: [選擇]
<?php

set_include_path
(&#39;.&#39;.PATH_SEPARATOR.&#39;./library/&#39;.PATH_SEPARATOR.&#39;./application/m                                              odels/&#39;); // 設定module的位置
include "Zend/Loader.php"// 必需要include的module,它是把需要的module導入

Zend_Loader::loadClass(&#39;Zend_Controller_Front&#39;); // Zend_Controller_Front是必需的module,它是用來控制route

$frontController Zend_Controller_front::getInstance(); // create一個Front Object
$frontController->setControllerDirectory(&#39;./application/controllers&#39;); // 設定Controller目錄的路徑
$frontController->dispatch();

IndexController.php
代碼: [選擇]
<?php

class IndexController extends Zend_Controller_Action
{
    public function 
indexAction()
    {
      
$this->view->message "Zend Framework tutorial"// 回傳 message
    
}

    public function 
helloAction()
    {
      
$this->view->message "Hello World"// 回傳 message
    
}
}

index.phtml
代碼: [選擇]
<?php
 
echo $this->message;
?>


http://localhost/index/index
Display Result="Zend Framework tutorial"

hello.phtml
代碼: [選擇]
<?php
 
echo $this->message;
?>


http://localhost/index/hello
Display Result="Hello World"

Demo:
http://wingning.no-ip.org/studyarea/helloworld/
http://wingning.no-ip.org/studyarea/helloworld/index/hello


下載:http://wingning.no-ip.org/studyarea/download/helloworld.tar.gz

這個二個Application是我使用Zend Framework+Dojo開發的.如果大家對Zend Framework和Dojo有興趣,我可以把我其它的心得分享出來.

http://wingning.no-ip.org/lab/invoice
username: admin
password: 123456

http://wingning.no-ip.org/lab/competition

天創科技網頁設計公司

7
Linux 討論版 / tcpdump分析問題
« 於: 2007-06-28 00:02 »
我公司裡頭有一台window sbs 2003 exchange mail server,中國哪邊有廠房,他們經常都連不進來mail server收電郵,現在我想知道是不是香港這邊問題.
我用tcpdump 去分析

NET
=========================
17:59:11.193021 00:0f:e2:49:b7:ca > 00:90:0b:08:aa:41, ethertype IPv4 (0x0800), length 62: 59.33.145.59.4808 > 192.168.0.148.110: S
1419757877:1419757877(0) win 16384 <mss 1412,nop,nop,sackOK>
        0x0000:  4500 0030  39bb 4000 7306 4074 3b21 913b  E..09.@.s.@t;!.;
        0x0010:  c0a8 0094 12c8 006e 549f c935 0000 0000  .......nT..5....
        0x0020:  7002 4000  84ab 0000 0204 0584 0101 0402  p.@.............
17:59:11.193232 00:90:0b:08:aa:41 > 00:0f:e2:49:b7:ca, ethertype IPv4 (0x0800), length 62: 192.168.0.148.110 > 59.33.145.59.4808: S
42368544:42368544(0) ack 1419757878 win 16384 <mss 1460,nop,nop,sackOK>
        0x0000:  4500 0030  93ec 0000 7f06 1a43 c0a8 0094  E..0.......C....
        0x0010:  3b21 913b 006e 12c8 0286 7e20 549f c936  ;!.;.n....~.T..6
        0x0020:  7012 4000  03c4 0000 0204 05b4 0101 0402   p.@.............
17:59:11.193259 00:0f:e2:49:b7:ca > 00:90:0b:08:aa:41, ethertype IPv4 (0x0800), length 60: 59.33.145.59.4808 > 192.168.0.148.110: R
1419757878:1419757878(0) win 0
        0x0000:  4500 0028  bb3a 4000 3a06 f7fc 3b21 913b  E..(.:@.:...;!.;
        0x0010:  c0a8 0094 12c8 006e 549f c936 0000 0000  .......nT..6....
        0x0020:  5004 0000  f13b 0000 0000 0000 0000       P....;........
17:59:11.215880 00:0f:e2:49:b7:ca > 00:90:0b:08:aa:41, ethertype IPv4 (0x0800), length 60: 59.33.145.59.4808 > 192.168.0.148.110: R
1419757878:1419757878(0) win 0
        0x0000:  4500 0028  0081 4000 3a06 b2b6 3b21 913b  E..(..@.:...;!.;
        0x0010:  c0a8 0094 12c8 006e 549f c936 0286 7e21  .......nT..6..~!
        0x0020:  5004 0000 7094 0000 0000 0000 0000       P...p.........
17:59:11.290338 00:0f:e2:49:b7:ca > 00:90:0b:08:aa:41, ethertype IPv4 (0x0800), length 60: 59.33.145.59.4808 > 192.168.0.148.110: . ack 1 win
16944
        0x0000:  4500 0028 39bc 4000 7306  407b 3b21 913b  E..(9.@.s.@{;!.;
        0x0010:  c0a8 0094 12c8 006e 549f c936 0286 7e21  .......nT..6..~!
        0x0020:  5010 4230  2e58 0000 0000 0000 0000       P.B0.X........
17:59:11.290547 00:90:0b:08:aa:41 > 00:0f:e2:49:b7:ca, ethertype IPv4 (0x0800), length 54: 192.168.0.148.110 > 59.33.145.59.4808: R
42368545:42368545(0) win 0
        0x0000:  4500 0028  93ed 0000 7f06 1a4a c0a8 0094  E..(.......J....
        0x0010:  3b21 913b 006e 12c8 0286 7e21 0286 7e21  ;!.;.n....~!..~!
        0x0020:  5004 0000  0dc3 0000                      P.......
17:59:11.311574 00:0f:e2:49:b7:ca > 00:90:0b:08:aa:41, ethertype IPv4 (0x0800), length 60: 59.33.145.59.4808 > 192.168.0.148.110: R
1419757878:1419757878(0) win 0
        0x0000:  4500 0028  bc3a 4000 3a06 f6fc 3b21 913b  E..(.:@.:...;!.;
        0x0010:  c0a8 0094 12c8 006e 549f c936 0286 7e21  .......nT..6..~!
        0x0020:  5004 0000 7094 0000 0000 0000 0000       P...p.........

===============================================
1:59.33.145.59 送SYN去 192.168.0.148
2:192.168.0.148 回ack去 59.33.145.59
3:59.33.145.59 回ack1去 192.168.0.148
之後是不是59.33.145.59中止連接?

8
Linux 討論版 / 外部無法使用sendmail寄信
« 於: 2007-06-10 12:34 »
我要幫公司起一個Mail Server,我是使用CentOS 5 和 sendmail 架設
現在問題是,如果在公司內部接收和寄出信件是沒有問題的.至於外部只可以接收信件,但無法從外部連接到Server寄信件.
我巳經把router port 25 打開和forward去伺服器
我的流程:
1.修改 /etc/mail/sendmail.mc
把 127.0.0.1 改成 0.0.0.0
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

m4 /etc/mail/sendmail.mc >/etc/mail/sendmail.cf
2.修改/etc/mail/local-host-names
hk796.idv.tw
3.修改 /etc/sysconfig/saslauthd
MECH=shadow
測試:
testsaslauthd -u terry -p xxxxx
OK!
4.restart sendmail and saslauthd
service sendmail restart
service saslauthd restart
service dovecot start

5.關閉firewall
service iptables stop

Seliux 巳經關閉了.

請問 /etc/access 是不是修改?

9
程式討論版 / 認證問題 (session or cookies)
« 於: 2007-05-29 18:09 »
我想問一下,使用者登入後,當他去別的頁面,如何避免再次檢查認證(username and password).是否使用cookie or session 去記錄他們登入的資料?

10
我想問一下Window server 2003 Terminal Service可不可以限制使用者開啓software的次數.如果可以,請問在哪裡設定.=)

11
Linux 討論版 / backup samba
« 於: 2007-04-24 12:32 »
大家好,我公司有個客戶SAMBA SERVER 出現了一些問題,當USER 在 WINXP login後,有時候會自動斷線,需要重新login.
大家知不知道什麼原因.因為現在沒辦法看log file.
我正打算重裝samba.有哪些需要backup?是不是只要backup smb.cnf 和 smbpasswd 檔就可以了.
公司的samba server是用來做 file server 用的.

12
Windows 討論版 / monitor file
« 於: 2007-04-02 12:40 »
我想問一下有沒有一些free software 可以用來 monitor create/delete/modify file?
記錄低使用者新增,移除和修改資料.

13
我有二個hard disk,是行raid 1
現在兩個都中毒.
有沒有方法可以backup啲data
我要format hard disk 1 or hard disk 2?
請大家幫幫忙.

14
網頁技術 / IE min-height problem
« 於: 2007-03-19 16:02 »
min-height 在firefox上,一點問題都沒有
但是在IE 6 就無法成功。
請問有解決方法嗎?
我是想當中間container高度為700時,左手邊menu bar高度自動調為700
而預設值是 min-height:450px;

15
網頁技術 / javascript 問題
« 於: 2007-02-05 14:23 »
我的問題是,我從一個xml文件裡,拿取照片的檔案名和目錄.然後經過javascript在html裡顯視.可是我在圖片裡加上onClick="loadSubGralley('+gBook+')" [註:gBook是從xml裡回傳回來的] ,就會出現必須要有')'的錯誤.
我試過如果不加上gBook,問題就沒有了.可是如果不加就無法達到我的目的


代碼: [選擇]

/* handle the receiving Gralley Book result from server */
function handleGralleyBook() {
// continue if the xmlHttpGetMessage process is completed
if (xmlHttpGralleyBook.readyState == 4 && xmlHttpGralleyBook.status == 200){
// get the value from the xml result
var xmlResponse = xmlHttpGralleyBook.responseXML;
var xmlRoot = xmlResponse.documentElement;
// continues if gralley book exist
gBookArray = xmlRoot.getElementsByTagName("gBook");
if (gBookArray.length != 0) {
dirArray = xmlRoot.getElementsByTagName("dir");
gBookImageArray = xmlRoot.getElementsByTagName("gBookImage");
displaygBook(dirArray,gBookImageArray);
}
}
}

/* display the Gralley Book */
function displaygBook(gBookArray,gBookImageArray) {
// set the variables
var div = document.getElementById('gralley');
for (var i = 0; i < dirArray.length; i++) {
var gBook = dirArray.item(i).firstChild.data;
var gBookImage = gBookImageArray.item(i).firstChild.data;
div.innerHTML += "<div class='gBook'>[b][color=red]<img src='gralleyResize.php?xScale=0.3&yScale=0.3&dir="+gBook+"&gBookImage="+gBookImage+"' class='gralleyBook' onClick='loadSubGralley("+gBook+")'>[/color][/b]"+
"<p >"+gBook+"</p></div>";
}
}

16
程式討論版 / XSL下無法使用pop up menu
« 於: 2007-01-20 17:11 »
我在html下可以透過css來造出pop up menu,但是在xsl 下就無法達到這個效果.請問有沒有解法辦法.

xslt code:
<?xml version="1.0" encoding="big5"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="big5" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd"/>
<xsl:template match="/">
   <div align="center"><h2>Shopping Cart</h2></div>
   <table align="center" class="itemTable">
      <tr class="title">
         <td>ID</td>
         <td>供應商</td>
         <td>商品名稱</td>
         <td>價格</td>
         <td>更改</td>
      </tr>
      <tr>
         <xsl:for-each select="data/row">
         <xsl:element name="tr">
         <xsl:attribute name="id">
         <xsl:value-of select="id"/>
         </xsl:attribute>
         <td class="id"><xsl:value-of select="id"/></td>
         <td><xsl:value-of select="supplyCode"/></td>
         <td><xsl:value-of select="description"/></td>
         <td><xsl:value-of select="price"/></td>
         <td><div id="menu">
                                <ul>
                                <li>Edit
                                  <ul>
                                    <li>Update</li>
                                    <li>Cancel</li>
                                  </ul>
                                </li>
                                </ul>
            </div>
         </td>
         </xsl:element>
         </xsl:for-each>
      </tr>
   </table>   
   <table align="center" class="pageTable">
      <tr>
         <td align="left"><xsl:value-of select="/data/totalRow"/> Items</td>
         <td align="center"><xsl:if test="/data/perviousPage > 0 ">
               <xsl:element name="a">
               <xsl:attribute name="href">#</xsl:attribute>
               <xsl:attribute name="onClick">changePage(<xsl:value-of select="/data/perviousPage"/>)</xsl:attribute>
               PreviousPage
               </xsl:element>
            </xsl:if></td>
         <td align="center"><xsl:if test="/data/nextPage > 0">
               <xsl:element name="a">
               <xsl:attribute name="href">#</xsl:attribute>
               <xsl:attribute name="onClick">changePage(<xsl:value-of select="/data/nextPage"/>)</xsl:attribute>
               NextPage
               </xsl:element>
               </xsl:if></td>
         <td align="right">page <xsl:value-of select="/data/pageNum"/> of <xsl:value-of select="/data/totalPage"/></td>
      </tr>
   </table>
   <div align="right" id="Error"></div>
</xsl:template>
</xsl:stylesheet>

CSS code:
<!-- Menu Drop Down Menu -->
#menu {
width: 12em;
}

#menu ul {
list-style: none;
margin: 0;
padding: 0;
}

#menu h2 {
   color: #FFFF66;
   text-transform: uppercase;
   display: block;
   border-width: 1px;
   border-style: solid;
   border-color: #ccc #888 #555 #bbb;
   margin: 0;
   padding: 2px 3px;
   font-family: arial, helvetica, sans-serif;
   font-size: 11px;
   line-height: 16px;
   font-weight: bold;
   background-color: #FF6600;
   text-align: center;
}


#menu li {
position: relative;
display: block;
}
#menu ul ul li,#menu ul ul ul li {
   border-width: 1px;
   border-style: solid;
   border-color: #ccc #888 #555 #bbb;
   margin: 0;
   padding: 2px 3px;
   font-family: arial, helvetica, sans-serif;
   font-size: 11px;
   line-height: 16px;
   font-weight: bold;
   background-color: #FFFFCC;
   text-align: center;
   color: #CCCCCC;
}

#menu  ul ul,#menu ul ul ul{
position: absolute;
top: 0;
left: 100%;
width: 100%;

}

#menu  ul ul,#menu ul ul ul
{display: none;}

#menu ul li:hover ul,#menu ul li:hover ul ul
{display: block;}

/* Fix for IE Browser */
body {
behavior: url(csshover.htc);
}
#menu ul li {float: left; width: 100%;}

17
網頁技術 / XSL下無法使用pop up menu
« 於: 2007-01-20 16:36 »
我在html下可以透過css來造出pop up menu,但是在xsl 下就無法達到這個效果.請問有沒有解法辦法.

18
請大家幫幫忙.
現在我無法在php上顯示香港字和把香港字寫入mysql資料庫中.
(例如:啲,咗.....等等)
請問有沒有辦法把問題解決.
我所使用OS FC5,mysql 5,php5

19
網頁技術 / table 的問題!
« 於: 2006-08-29 13:17 »
希望各位幫忙.
我有一個關於table 排位的問題
如果我用firefox的話.就沒有出現這個問題,例如
table1 table2 table3
table4 table5 table6

但是如果用IE的話哪它就不會自動排位.,例如
table1 table2 table3 table4 table5 table6

有沒有什麼辦法令到在IE上可以自動排位.
這裡是我的code

for($i=0;$i<$rows;$i++){
print <<<EOT
<table height="1" width="1" border="1" cellspacing="1" cellpadding="2" align="left"  >
<tr><td  height=" 30" align="center">
標題:<span class="messagebody"> $description[$i]</span>
</td></tr>
<tr><td  height="150" align="center">
<a href='$filepath[$i]'><img src="resize.php?row=$display"/></a>
</td></tr>
<tr><td   height=" 1" align="center">
<input type="checkbox" name="click$i">
<input type="hidden" name="description$i" value="$description[$i]">
<input type="hidden" name="date$i" value="$date[$i]">
<input type="hidden" name="filepath$i" value="$filepath[$i]">
日期:<span class="messagebody"> $date[$i]</span>
</td></tr>
</table>
EOT;
$display=$display+1;
}

20
你好,小弟正嘗試寫一個php聊天室,但遇上一些技術上的問題.請各位給一些意見.

當我每次reload完browser之後都無法把使用者所打的字保存下來
因為reload的時間都是一秒,所以當使用在哪一秒內所打的字都無法顯示.
例子:
client 打: this is a test program.
當reload完之後,只會顯示.
this is a test prog

請問有沒有辦法解決這個問題.

頁: [1]