Tuesday, April 5, 2011

PHP中如何保存变量,一遍刷新后仍然可以使用

PHP中如何保存变量,一遍刷新后仍然可以使用 - ItEye问答

session_start(); //这句话要放在这里,因为每一次访问session都必须执行。
if(isset($_GET['vtag'])){
$_SESSION['vtag']=$_GET['vtag'];
$gettag=$_GET['vtag']; //这里多了个引号。。。。
echo "欢迎光临".$gettag;
}
elseif(isset ($_SESSION['vtag'])){ //这里要括起来
$gettag=$_SESSION['vtag'];
echo "欢迎再次光临".$gettag;
}
else{
echo "非法访问";
exit;
}

And for Zend:
Zend_Session::Start();
$language =new Zend_Session_Namespace('langugae');

if (isset($_GET['lang'])){
$language->lang = $_GET['lang'];
$lo = $_GET['lang'];
}elseif (isset($language->lang)) {
$lo = $language->lang;
}

    Monday, April 4, 2011

    Zend_Session会话处理实例详解(一)_ZEND中国_百度空间

    Zend_Session会话处理实例详解(一)_ZEND中国_百度空间

    在计算机语言中,会话是一种面向连接的可靠通信方式。而会话处理机制,即是指编程语言实现基于会话的通信的方式。在PHP中,会话(session)代表服务器端与客户端之间的一种持久的状态数据。使用ZendFrameworkSession可以在由相同客户端发起的多个页面请求之间,管理和保护会话数据。本章介绍如何使用Zend_Session组件来实现会话的处理。
    1 Zend_Session会话简介
    正如本章引言所说的,会话的本质是一种数据,它代表着服务器与客户端之间的一种状态。例如,论坛登录的用户数据、用户的登录时间、正在浏览的页面等都属于会话的范畴。在Zend_Session中的会话数据是对Cookie数据的扩展。但该数据又与Cookie数据有所不同。二者最明显的区别就是会话数据不储存在客户端,而Cookie则通常保存在客户端。会话数据仅在服务器端源代码使用时,才通过回应客户端的请求与客户端共享会话数据。
    Zend_Session组件中,“session data”代表存储在服务器端的$_SESSION数组中的数据。该数据使用Zend_Session来管理,由会话命名空间(Zend_Session_Namespace,该类为Zend_Session的一个子类)以对象的方式来控制。命名空间逻辑上就是一系列以字符串为键名的联合数组,这类似于普通的PHP数组。
    Zend_Session_Namespace的实例用对象存储的方式实现了$_SESSION的命名空间。Zend_Session组件封装了PHP内置的会话模块,同时还提供了一个管理会话的接口,而且也为Zend_Session_Namespace 持久化命名空间数据提供了API
    Zend_Session_Namespace为会话命名空间数据到PHP内部会话机制的持久化提供了一个标准的、面向对象的接口。Zend_Session支持现有无名的会话,同时也支持“登录会话”(提供用户名与密码的会话)。因为Zend_Session使用了PHP内置的会话函数,所以常用的配置选项和设置都仍然适用。正因为如此,储存在cookie或者URL中的会话标识,会保持客户端与服务器端会话状态数据之间的联系。
    2 Zend_Session基本用法
    上一节对Zend_Session做了一个纯理论性的简介。本节将以具体的实例来讲解Zend_Session的基本用法。其中包括如何使用Zend_Session实现会话、如何对会话命名空间进行迭代以及如何对会话命名空间进行访问。
    2.1 使用Zend_Session
    本小节来介绍如何使用Zend_Session实现会话。要使用Zend_Session会话,应该需要以下几个步骤。
    1)引用命名空间(Zend_Session_Namespace)类。
    2)为命名空间类实例化一个对象。可以使用new关键字为类实例化对象,其中要使用参数命名空间。如果不指定参数,则类的构造函数会使用默认的命名空间参数,其值为Default
    3)使用Zend_Session_Namespace类的实例的成员,可以对其进行赋值或者读取操作。下面通过一个实例来演示,如何使用Zend_Session实现最基本的会话处理。

    require_once 'Zend/Session/Namespace.php'; //加载Zend_Session_Namespace组件
    $myNamespace=new Zend_Session_Namespace('Myspace'); //为类实例化一个对象
    if(isset($myNamespace->numberOfPageRequests)) //判断指定成员是否有值
    {
    $myNamespace->numberOfPageRequests++; //如果有值则将其累加
    }
    else
    {
    $myNamespace->numberOfPageRequests=1; //如果无值,对其进行赋值操作
    }
    echo "用户的浏览次数为:";
    echo "";

    echo $myNamespace->numberOfPageRequests; //输出获取的对象成员值

    echo "";
    ?>

    计划旅行 - 4月16-17日 荷兰-科肯豪夫 比利时-布鲁日

    早8点30分香榭丽舍大道138号麦当劳门口集合出发。

    第 一 天: 巴黎(Paris) - 科肯豪夫(Keukenhof)
    早上8点30分在香榭丽舍大街138号麦当劳门口集合出发,前往荷兰,在海平面以下的国土上,观赏世界上最大的郁金香主题花园:科肯豪夫花园。让我们携手走在曾经沧海的土地上,沿百里花田之路,在万紫千红,花团锦簇的国色天香世界里,寻找自然与生活中美的源泉。 夜宿荷兰。

    第 二 天: 科肯豪夫(Keukenhof)-布鲁日(Bruges)-巴黎(Paris)
    早上前往有“北方威尼斯之称”的布鲁日,在这座号称佛兰德珍珠的城市里,我们可以乘船沿运河在城市里穿行,在充满中世纪风情的街头漫步,在爱湖之滨留下身影,在童话世界般的塔楼前抒发久违的赤子之情。晚间回到巴黎,圆满结束花香袭人的春天之旅。


    期待中, 好久没出去玩了..

    Parse Accept-Language to detect a user's language

    The Future of the Web » Parse Accept-Language to detect a user's language » Web Development with JavaScript, jQuery, PHP and MySQL


    I'm an English-speaking Canadian living in Germany. Quite often I go to a website like Google or Kayak and find myself looking at a German version of the site.
    Okay, I do live in Germany, but why assume that everyone within Germany speaks German? What about visitors from other countries, or even people living here that would prefer to use another language?
    What must be happening is these sites are taking my IP address, looking up the geographical location of that address, and choosing the official language for that country. This may work most of the time, but there is an even easier way to choose a language.
    Most browsers send an Accept-Language header. For example, mine is set to:
    en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2
    What this basically says is that I prefer (in decreasing order of preference) Canadian English, generic English, US English, German spoken in Germany, and lastly generic German. Any web site I visit is capable of looking at this list and deciding what language I would prefer.
    Of course, no matter what assumptions you make about a visitor, give them a chance to change their language if needed. For example, if you use an Internet cafe in Berlin, you shouldn't be stuck viewing websites in German!
    One really nice thing: I often see Google Ads and other geographically targeted ads in German, and this makes ignoring the ads much easier! :)
    Update: I was inspired to throw together a quick Accept-Language parser in PHP:
    $langs = array();  if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {     // break up string into pieces (languages and q factors)     preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);      if (count($lang_parse[1])) {         // create a list like "en" => 0.8         $langs = array_combine($lang_parse[1], $lang_parse[4]);               // set default to 1 for any without q factor         foreach ($langs as $lang => $val) {             if ($val === '') $langs[$lang] = 1;         }          // sort list based on value          arsort($langs, SORT_NUMERIC);     } }  // look through sorted list and use first one that matches our languages foreach ($langs as $lang => $val) {  if (strpos($lang, 'de') === 0) {   // show German site  } else if (strpos($lang, 'en') === 0) {   // show English site  }  }  // show default site or prompt for language 
    This would produce the following structure for my Accept-Language string:
    Array (     [en-ca] => 1     [en] => 0.8     [en-us] => 0.6     [de-de] => 0.4     [de] => 0.2 )

    ZF组件功能简介

    转自: ZF组件功能简介 - 在网一方的日志 - 网易博客

    Zend_Acl:为权限管理提供轻量并灵活的访问控制列表的功能
    Zend_Auth:为认证和一些通用用例情景的具体认证适配器提供一个接口
    Zend_Cache:一个缓存任何数据的一般方法
    Zend_Captcha:提交数据的验证,以判断提交者是人还是机器自动操作,防止被恶意提交
    Zend_Config:简化访问和使用配置数据
    Zend_Console_Getopt:命令参数的设置和读取
    Zend_Controller:MVC的控制器★★
    Zend_Currency:处理所有关于货币、钱的表示和格式
    Zend_Date:处理日期和时间
    Zend_Db:操作数据库★★
    Zend_Debug:输出变量的值,只有一个方法Zend_Debug::dump($var, $label=null, $echo=true);
    Zend_Dojo:Dojo Toolkit工具,1.6.0版本新增
    Zend_Dom:为使用DOM文档和结构提供工具
    Zend_Exception:ZF抛出的所有异常都是Zend_Exception的子类的对象
    Zend_Feed:处理的RSS和Atom Feed
    Zend_File:处理文件的上传和下载
    Zend_Filter:替换掉不需要不安全的数据★
    Zend_Filter_Input:多重数据过滤和校验★
    Zend_Form:利用ZF多个组件对表单的创建和处理进行简化★
    Zend_Gdata:Google服务的接口○
    Zend_Http:执行HTTP请求,处理GET和POST等
    Zend_Infocard:信息卡认证与管理○
    Zend_Json:处理JS与PHP变量交换
    Zend_Layout:布局,常用于模板,可脱离MVC使用
    Zend_Ldap:处理轻量级目录访问协议,这一组件极不完善
    Zend_Loader:加载的名称是变量的文件,require_once的升级版
    Zend_Locale:本地化和国际化组件(L10n和I18n)
    Zend_Log:通用日志组件,它支持多个日志后端,格式化发送给日志的消息,过滤被纪录的消息
    Zend_Mail:通用功能用于撰写和发送文本以及兼容MIME标准的含有多个段的邮件消息★
    Zend_Measure:处理度量衡的换算
    Zend_Memory:内存数据管理
    Zend_Mime:处理多段MIME消息的辅助类,在Zend_Mail和Zend_Mime_Message中使用了它,也可在需要MIME支持的应用程序中使用
    Zend_OpenId:OpenID的支持接口
    Zend_Paginator:数据分页,或取得所需页的数据★
    Zend_Pdf:加载存在的PDF文档,生成新的、修改和保存修改后的PDF文档
    Zend_ProgressBar:建立和控制进度条的组件
    Zend_Registry:处理对象注册表(通过把对象存储在其中,我们可以在整个项目的任何地方使用同一个对象,相当于一种全局存储)
    Zend_Rest:REST是Web Service的一种,通过XML交换数据
    Zend_Search_Lucene:通用文本搜索引擎,不需要数据库支持
    Zend_Server:基于Reflection API的标准机制,供服务器类开发者使用
    Zend_Service_Akismet:akismet.com的接口○
    Zend_Service_Amazon:amazon.com的接口○
    Zend_Service_Audioscrobbler:audioscrobbler.net的接口○
    Zend_Service_Delicious:del.icio.us的接口○
    Zend_Service_Flickr:flickr.com的接口○
    Zend_Service_Nirvanix:nirvanix.com的接口○
    Zend_Service_ReCaptcha:recaptcha.net的接口○

    Thursday, March 31, 2011

    stdClass的介绍

    一维数组,我现在特别喜欢把它写成对象,因为键盘打起来比较顺手,看起来也顺眼,如
    $andy = array();
    $andy['a'] = 1;
    $andy['b'] = 2;
    $andy['c'] = 3;
    我喜欢把它变成这样
    $andy = array();
    $andy = (object)$andy;
    $andy->a = 1;
    $andy->b = 2;
    $andy->c = 3;
    新建空数组只要$andy = array();
    新建空对像却要$andy = new Andy; 而且还得先有个class Andy{}
    或者得2行
    $andy = array();
    $andy = (object)$andy;
    用array直接改类型成object有点别扭,今天找到了答案,感谢phpx的兄弟

    Wednesday, March 30, 2011

    Zend Framework 多语言国际化

    转自: http://hi.baidu.com/tianhuimin/blog/item/ea115166dc637536aa184c17.html
    多语言”仅仅是网站国际化的一个方面,其中还包括“日期格式”、“时区”、“日 历”、“货币”等。“多语言”、“日期”和“时区”是最为关心的。这篇文章就Zend_Locale, Zend_Translate, Zend_Date, date_default_timezone_set讲述国际化的简单运用。
    1. 创建Zend_Locale对象
    $local=new Zend_Locale();
    默认情况下,按照用户浏览器设定地区。即,浏览器为中国,则网站地区为中国。
    当然可以根据服务器环境设定地区,或者直接输入参数:new Zend_Locale(‘en_US’)。
    设计思路:使用Cookie来保存用户曾经选择的地区,如果Cookie未设置,则默认根据浏览器判断。
    $locale=new Zend_Locale();
    if(isset($_COOKIE['locale'])&& Zend_Locale::isLocale($_COOKIE['locale'],true,false)){$locale->setLocale($_COOKIE['locale']);}
    2. Zend_Translate 设置多语言
    ZF提过了很多翻译适配器,其中最为常用的gettext,对应的语言数据位.mo。.mo被很多软件用来开发多语言,譬如WordPress。
    简介下Zend_Rranslate的gettext用法:
    $translate=new Zend_Translate(gettext,//适配器
    ‘languages’,//语言包文件夹,mo文件存放位置
    $locale,//Zend_Locale对象
    array(’scan’ => Zend_Translate::LOCALE_FILENAME)//自动扫描形式);
    languages文件夹下存放数据文件为:zh_CN.mo, en_US.mo, zh_TW
    Controller中使用方法$translate->_(‘msgID’),需要将$translate对象写入注册表,Zend_Registry(‘Zend_Translate’,$translate), 键值必须是 Zend_Translate,否则,得不到应有的结果。
    View中使用方法translate(‘msgID’) ?> , 通过View中的translate助手。
    关于mo文件的创建,可以下载poEdit,关于poEdit的使用我尚未完全明白,简述我的mo文件制作方法。
    (1) 通过poEdit创建zh_CN.po文件,用editPlus打开zh_CN.po,
    输入:
    msgid "welcome"
    msgstr "欢迎您"
    (2)用poEdit打开zh_CN.po,保存一下,即可生成zh_CN.mo文件。也可以另存为zh_TW,用来做繁体。
    3. 时间格式
    都知道美国人表示时间格式与中国人不同,怎样才能把数据库中的一个UNIX时间戳根据地区显示不同形式呢?Zend_Date可以达到这样的效果。
    $date=new Zend_Date(123456789,false,$locale);
    print$date;
    即可根据$locale地区设置不同时间显示格式。
    思路
    在数据库中存储UNIX时间戳,利用Zend_Date与$locale对象设置时间戳的显示格式。
    4. 时区
    让我很不解的是,好像Zend_Date里面没有时区设置,不能根据$locale自动设置时区,尝试很多,未果。我的思路如下:
    将用户选择的失去写入Cookie,如果未设置Cookie,则使用Asia/Shanghai作为默认时区。
    if(isset($_COOKIE['timezone'])){date_default_timezone_set($_COOKIE['timezone']);}else{date_default_timezone_set('Asia/Shanghai');}