这几天公司要做一个限时购物的功能.这就要做到倒计时,要有实时的倒计时.要求:1) 要有小时分钟秒的实时倒计时的显示2)用户端修改日期时间不会影响到倒计时的正常显示(也就是以服务器时间为准)其实这和很多的考试等系统的时间限制功能同样的要求.解决思路:1)总不能用ajax每秒都获取服务器时间吧.所以实时倒计时一定要用javascript实现.这很简单.网上一大把的例子.2)现在问题是解决用户端修改日期时间对我们的显示的影响.解决的办法是计算出用户端的时间和服务器的时间差.这样问题的完成解决了.这样只需要运行一次php.实时倒计时的时间就和服务器的时间同步了.理论是同步的,但实际测试会有1秒的误差.(具体原因就是和网速有关,网速越快,误差就越小),但这决不会影响到我们上面的要求了.实例: 代码<?php//php的时间是以秒算。js的时间以毫秒算date_default_timezone_set("Asia/Hong_Kong");//地区//配置每天的活动时间段$starttimestr = "09:00:00";$endtimestr = "18:30:00";$starttime = strtotime($starttimestr);$endtime = strtotime($endtimestr);$nowtime = time();?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>PHP实时倒计时!</title><script language="JavaScript"><!-- //var EndTime=<?=$endtime*1000?>;var NowTime = new Date();//计算出服务器和客户端的时间差。var dTime = <?=$nowtime*1000?>-NowTime.getTime();function GetRTime(){var NowTime = new Date();var nMS = EndTime - NowTime.getTime()-dTime;var nH=Math.floor(nMS/(1000*60*60)) % 24;var nM=Math.floor(nMS/(1000*60)) % 60;var nS=Math.floor(nMS/1000) % 60;document.getElementById("RemainH").innerHTML=nH;document.getElementById("RemainM").innerHTML=nM;document.getElementById("RemainS").innerHTML=nS;if(nMS>5*59*1000&&nMS<=5*60*1000){alert("还有最后五分钟!");}setTimeout("GetRTime()",1000);}window.onload=GetRTime;// --></script></head><body><h1><strong id="RemainH">XX</strong>:<strong id="RemainM">XX</strong>:<strong id="RemainS">XX</strong></h1></body></html>实例2:修改了上面的一些bug 代码<?php//php的时间是以秒算。js的时间以毫秒算date_default_timezone_set("Asia/Hong_Kong");//地区//配置每天的活动时间段$starttimestr = "09:00:00";$endtimestr = "18:30:00";$starttime = strtotime($starttimestr);$endtime = strtotime($endtimestr);$nowtime = time();?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>PHP实时倒计时!</title><script language="JavaScript"><!-- //var EndTime=<?=$endtime*1000?>;var NowTime = new Date();//计算出服务器和客户端的时间差。var dTime = NowTime.getTime()-<?=$nowtime*1000?>;var runtimes = 0;function GetRTime(){var NowTime = new Date();var dTimeNew = NowTime.getTime()-<?=$nowtime*1000?>;var dTimesM = Math.abs(Math.floor((dTimeNew-runtimes*1000-dTime)/1000));//客户端时间和服务器当前时间的差if (dTimesM>1) {//如果用户修改了客户端时间,就重新load本页window.location.reload();}var nMS = EndTime - NowTime.getTime()+dTime;var nH=Math.floor(nMS/(1000*60*60)) % 24;var nM=Math.floor(nMS/(1000*60)) % 60;var nS=Math.floor(nMS/1000) % 60;document.getElementById("RemainH").innerHTML=nH;document.getElementById("RemainM").innerHTML=nM;document.getElementById("RemainS").innerHTML=nS;if(nMS>5*59*1000&&nMS<=5*60*1000){alert("还有最后五分钟!");}runtimes++;setTimeout("GetRTime()",1000);}window.onload=GetRTime;// --></script></head><body><h1><strong id="RemainH">XX</strong>:<strong id="RemainM">XX</strong>:<strong id="RemainS">XX</strong></h1></body></html> 实例3:思路不同,简单多了.代码<?php//php的时间是以秒算。js的时间以毫秒算date_default_timezone_set("Asia/Hong_Kong");//地区//配置每天的活动时间段$starttimestr = "09:00:00";$endtimestr = "13:50:00";$starttime = strtotime($starttimestr);$endtime = strtotime($endtimestr);$nowtime = time();if ($nowtime<$starttime){die("活动还没开始,活动时间是:{$starttimestr}至{$endtimestr}");}$lefttime = $endtime-$nowtime; //实际剩下的时间(秒)?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>PHP实时倒计时!</title><script language="JavaScript"><!-- //var runtimes = 0;function GetRTime(){var nMS = <?=$lefttime?>*1000-runtimes*1000;var nH=Math.floor(nMS/(1000*60*60))%24;var nM=Math.floor(nMS/(1000*60)) % 60;var nS=Math.floor(nMS/1000) % 60;document.getElementById("RemainH").innerHTML=nH;document.getElementById("RemainM").innerHTML=nM;document.getElementById("RemainS").innerHTML=nS;if(nMS>5*59*1000&&nMS<=5*60*1000){alert("还有最后五分钟!");}runtimes++;setTimeout("GetRTime()",1000);}window.onload=GetRTime;// --></script></head><body><h1><strong id="RemainH">XX<
Zend AMF使用总结-服务端pasting Zend_Amf 教程Zend AMF Server 的使用笔记 使用Flash Builder 4和Zend AMF创建数据为中心的简单应用
Zend_Db数据库知识例子:Model文件:$this->fetchAll("is_jian=1","id DESC",0,2)->toArray();//根据is_jian=1,按id倒序排列取前2条记录当第一个参数为null时,则直接按id倒序排列ASC为正序。路由文件:$video=new Video();//实例化数据库类$this->view->get2Video =$video->get2Video();//取到2条首页推荐的数据index.phtml文件:<?php foreach ($this->get2Video as $video): ?><?=$video['id']; ?><?=$video['name']; ?><? endforeach; ?>添加引号防止数据库攻击quote用法$value = $db->quote('St John"s Wort');// $value 现在变成了 '"St John"s Wort"' (注意两边的引号)// 为数组加引号$value = $db->quote(array('a', 'b', 'c'));// $value 现在变成了 '"a", "b", "c"' (","分隔的字符串)quoteInto用法echo $where = $db->quoteInto('id = ?', 1);// $where 现在为 'id = "1"' (注意两边的引号)// 在where语句中为数组加上引号$where = $db->quoteInto('id IN(?)', array(1, 2, 3));// $where 现在为 'id IN("1", "2", "3")' (一个逗号分隔的字符串)(1)数据查询总结直接进行查询. ( 使用完整的sql语句)//function quoteInto($text, $value, $type = null, $count = null)$db = $this->getAdapter();$sql = $db->quoteInto('SELECT * FROM `m_video` WHERE `is_guo` =?', '1');$result = $db->query($sql);// 使用PDOStatement对象$result将所有结果数据放到一个数组中$videoArray = $result->fetchAll();fetchAll用法fetchAll($where = null, $order = null, $count = null, $offset = null)取回结果集中所有字段的值,作为连续数组返回,如果参数不设置就写成null可以取回结果集的指定条数$videoArray=$this->fetchAll("is_jian=1 and is_guo=1","id DESC",0,2)->toArray();fetchAssoc用法fetchAssoc($sql, $bind = array())取回结果集中所有字段的值,作为关联数组返回, 第一个字段作为码$db = $this->getAdapter();$videoArray=$db->fetchAssoc("SELECT * FROM m_video WHERE `is_jian` = :title",array('title' => '1'));fetchCol用法fetchCol($sql, $bind = array())取回所有结果行的第一个字段名$db = $this->getAdapter();$videoArray=$db->fetchCol("SELECT name FROM m_video WHERE `is_jian` = :title",array('title' => '1'));fetchOne用法fetchOne($sql, $bind = array())只取回第一个字段值$db = $this->getAdapter();echo $videoArray=$db->fetchOne("SELECT count(*) FROM m_video WHERE `is_jian` = :title",array('title' => '1'));fetchPairs用法fetchPairs($sql, $bind = array())取回一个相关数组,第一个字段值为码(id),第二个字段为值(name)返回:Array( [1] => 十二生肖奇缘 [2] => 桃花运),1,2:为id字段。$db = $this->getAdapter();$videoArray=$db->fetchPairs("SELECT id, name FROM m_video WHERE is_jian = :title",array('title' => '1'));fetchRow用法fetchRow($where = null, $order = null)只取回结果集的第一行$videoArray=$this->fetchRow("is_jian=1 and is_guo=1", 'id DESC')->toArray();query用法//function query($sql, $bind = array())$db = $this->getAdapter();$result = $db->query('SELECT * FROM `m_video`');//$result = $db->query('SELECT * FROM `m_video` WHERE `name` = ? AND id = ?',array('十二生肖奇缘', '1'));//$result->setFetchMode(Zend_Db::FETCH_OBJ);//FETCH_OBJ为默认值,FETCH_NUM,FETCH_BOTH//while ($row = $result->fetch()) {// echo $row['name'];//}//$rows = $result->fetch();//$rows = $result->fetchAll();//$obj = $result->fetchObject();//echo $obj->name;// echo $Column = $result->fetchColumn(0);//得到结果集的第一个字段,比如0为id号,用于只取一个字段的情况print_r($rows);select用法$db = $this->getAdapter();$select = $db->select();$select->from('m_video', array('id','name','clicks'))->where('is_guo = :is_guo and name = :name')->order('name')// 按什么排序列,参加为数组(多个字段)或字符串(一个字段)->group()//分组->having()//分组查询数据的条件->distinct()// 无参数,去掉重复的值。有时候与groupby返回的结果一样->limit(10);// 读取结果使用绑定的参数$params = array('is_guo' => '1','name'=>'十二生肖奇缘');//$sql = $select->__toString();//得到查询语句,可供调试$result = $db->fetchAll($select,$params);执行select的查询$stmt = $db->query($select);$result = $stmt->fetchAll();或用$stmt = $select->query();$result = $stmt->fetchAll();如果直接用$db->fetchAll($select)结果一样多表联合查询用法$db = $this->getAdapter();$select = $db->select();$select->from('m_video', array('id','name','pic','actor','type_id','up_time'))->where('is_guo = :is_guo and is_jian = :is_jian')->order('up_time')->limit(2);$params = array('is_guo' => '1','is_jian'=>'1');$select->join('m_type', 'm_video.type_id = m_type.t_id', 'type_name');//多表联合查询$videoArray = $db->fetchAll($select,$params);find()方法,可以使用主键值在表中检索数据.// SELECT * FROM round_table WHERE id = "1"$row = $table->find(1);// SELECT * FROM round_table WHERE id IN("1", "2", 3")$rowset = $table->find(array(1, 2, 3));(2)数据删除总结第一种方法:可以删任意表//quoteInto($text, $value, $type = null, $count = null) $table = 'm_video';// 设定需要删除数据的表$db = $this->getAdapter();$where = $db->quoteInto('name = ?', 'ccc');// 删除数据的where条件语句echo $rows_affected = $db->delete($table, $where);// 删除数据并得到影响的行数第二种方法:只能删除本表中的 //delete用法// delete
准备工作前置条件:PHP>=5.14,Apache开启mod_rewrite支持,开启php的pdo扩展。Zend Framework 要求 PHP版本不低于5.1.4,但强烈建议使用 5.2.3 或更高版本,因为在这两个版本之间有许多重大安全和性能方面的改善和提高。下载Zend framework目前最新版本:1.10下载地址:http://framework.zend.com/download/latest下载zend framework 完整包解压后结构如图:其中:bin文件包含了Zend tool,用于在命令行中创建Zend framework项目,libraray则为Zend framework的类库。创建项目:途径一 利用Zend_Tool创建Zend Framework 项目打开bin文件夹,复制路径,添加到系统环境变量。以Windows操作系统为例,如图: 附:设置环境变量,修改系统变量中的Path值。添加上bin文件夹路径和php.exe所在目录,我添加的是E:wampbinphpphp5.2.6;E:wampwwwbin(两个路径分号间隔)。修改环境变量是为了,使用cmd时,在任意文件目录都可以使用zf命令。如果没有环境变量的话,只能在bin目录下才能使用zf命令,而且php.exe目录如果不在环境变量中,就没法被执行。 打开命令行窗口,输入C:Usersliu>zf show version 回车,如果输出 Zend Framework Version: 1.10.2,那么就可以利用Zend_tool来创建Zend framework项目了。接下打开命令行窗口,进入到网站目录,输入zf create project zf-demo 回车(这里不需要加“;”),如果输出:Creating project at D:AppServwwwzf-demo,则成功创建了名为“zf-demo”的项目。打开zf-demo文件夹,可以看到一个Zend framework应用的文件结构,如图。上图这个结构中,application为程序主目录,配置文件,控制器,模板,模型等都在这里实现;library文件夹放置zend framework类库,所以,需要将下载的Zend framework下面library下的Zend文件夹复制一份到这里;public文件夹为网站目录,程序入口文件(index.php)、CSS文件,图片文件一般放置在这里;tests文件夹放置测试程序。其他子文件夹接下来继续介绍。好了,现在可以测试运行一下第一个zend framework的程序了,在浏览器地址栏中输入http://127.0.0.1/zf-demo/public回车,如果出现以下界面,则Zend framework的开发环境已经配置好了。创建一个Hello World页面上图是用Zend_tool生成的zend framework默认的首页,完整的访问路径为http://127.0.0.1/zf-demo/public/index/index,是访问了index控制器下的index方法。打开application/controllers下的IndexController.php文件,可以看到源文件代码大致如下:在这里,我们先添加一个名为helloAction的空方法,它现在什么也不做,添加后代码如下:<?phpclass IndexController extends Zend_Controller_Action{ public function init() { /* Initialize action controller here */ } public function indexAction() { // action body } public function helloAction() { }}?>我们在application/views/scripts下新建一个名为hello.phtml的模板文件。这里先简单说一下模板文件的命名规则,Zend framework的模板文件默认放置在application/views/scripts/{控制器名}下,模板文件后缀默认为.phtml,文件名与方法名同名。在这个例子中,index控制器下的hello方法对应的模板文件为application/views/scripts/index/hello.phtml。现在,我们修改hello方法,将“Hello World“输出到页面。先看代码:<?phpclassIndexControllerextends Zend_Controller_Action{publicfunctioninit(){ /* Initialize action controller here */ }publicfunctionindexAction(){ // action body }publicfunctionhelloAction(){$this->view->content = "Hello World"; }}?>在hello方法中,我们只添加了一句$this->view->content = "Hello World";目的是将值为“Hello World”的content变量传递到hello.phtml模板文件,然后在hello.phtml中作以下修改:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>第一个Zend framework程序</TITLE></HEAD><BODY><?phpecho $this->content;?></BODY></HTML>现在,访问http://127.0.0.1/zf-demo/public/index/hello,应该可以看到Hello World出现了。途径二:手工配置zend framework项目建立项目目录,这个根据习惯,项目需求自己规划了,下图结构供参考index.php(网站入口)文件及说明:<?php error_reporting(E_ALL|E_STRICT);//错误报告级别 date_default_timezone_set('Asia/Shanghai');//默认时区 东八区set_include_path('.' .PATH_SEPARATOR .'./library'.PATH_SEPARATOR .'./application/models/'.PATH_SEPARATOR . get_include_path()); require_once "Zend/Loader/Autoloader.php"; //载入zend框架 Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true); //静态载入自动类文件 $registry = Zend_Registry::getInstance(); //配置数据库参数,并连接数据库 $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()); $dbAdapter->query('SET names gbk'); Zend_Db_Table::setDefaultAdapter($dbAdapter); Zend_Registry::set('dbAdapter',$dbAdapter); //设置视图 $view = new Zend_View(); $view->setScriptPath('./application/views/scripts/');//设置模板显示路径 $registry['view'] = $view;//注册View //设置控制器 $frontController =Zend_Controller_Front::getInstance(); $frontController->setBaseUrl('/')//设置基本路径 ->setParam('noViewRenderer', true) ->setParam('useDefaultControllerAlways', true) ->setControllerDirectory('./application/controllers') ->throwExceptions(true) ->dispatch();?>IndexController.php文件及说明:<?php class IndexController extends Zend_Controller_Action{ function init(){ $this->registry = Zend_Registry::getInstance(); $this->view = $this->registry['view']; $this->view->baseUrl = $this->_request->getBaseUrl(); } function indexAction(){$this->view->content = "Hello World"; echo $this->view->render('index.phtml'); }?>index.phtml模板文件说明:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>第一个Zend framework程序</TITLE></HEAD><BODY><?phpecho $this->content;?></BODY></HTML>访问http://127.0.0.1/zf/index/index,又可以看到Hello World出现了。 转载于:LAMP开发资源网 原文链接:http://www.lampres.com/php/zf/2010/0516/245.html
其实zend做的只是把一个超级牛的专业phper的全部知识打包成一个程序包,提供给大家使用.当然这个phper的习惯不一定符合你的需求,只拿需要的内容吧.这些都看过之后,可以自己挑部分源码出来,搞个MyZ专用zend framework或者是马永占专用zend framework…或者专门做MVC的zend framework.1 Zend_AclAccess control list 实现角色对资源的权限模型.只是个概念,我正在用的权限方式基本上跟acl差不多,acl在权限方面并没有什么创新的.而且需要去扩展acl要写更大量的代码.不如自己写.2 Zend_Auth验证,只负责验证,传说中有HTTP认证和支持openID.对我来说只是传说…验证就是去对比一下是或否,然后分别操作.3 Zend_Cache缓存.这个比较有用,最起码教给我们一种最简单的缓存方法,一对if else,有缓存,读缓存,没缓存读数据库存缓存.zend_cache有三大特色,也就是让你用zend_cache不用其他的缓存的三个优势.1标识缓存记录唯一性,省的自己做了.2生命周期,也省的自己做了.3条件执行…其实zend_cache最值得我们学习的是分开了前端和后端,这两个分别负责不同的事情,后端负责存储,前端负责参数等等.关于缓存,基本上是系统有,程序有,服务器有,连smarty都有…4 Zend_Config传说中的操作配置,这个配置的操作在PHP中已经有支持,做的也不错.Config中最好的是可以读xml格式…其实能读什么和xml的配置是什么格式都是zend规定的.我看了他们最常用的DB的配置.那种结构不是普通的配置文件.更多的层次.更多的规则.也许会更清晰吧.5 Zend_Console_Getopt帮助命令行程序解析它们的选项和参数.这句是抄来了.确实和现实的开发没什么关系,有人用过吗?听说可以把这句(rm * -fr)解释出来,但是解释出来后干什么???解释它做什么???6 Zend_Controller这个是最关键部分之一,zend最核心内容之一,最让PHPER感到zend可用的部分之一,跨时代的php产物之一.内容太多了.需要注意:MaYongZhanController::blogMmmYyyAction()在URL中是这样的ma-yong-zhan/blog-mmm-yyy ,或者中间是用 . 分隔开.所以建议还是写成这样:MayongzhanController::blogmmmyyyAction().当然还有很多很多很多的地方需要注意.zend的规范实在是多了些.7 Zend_Currency这个是处理钱的问题的,就是根据不同的地区,使用不同的货币格式.$1000 or ¥1000.8 Zend_Date典型的西方式的日期解决方案,就是关于日期型数据的操作.9 Zend_DB大多数项目所必须的,既然结合了zend来开发项目,就要看一看zend_db提供的类到底比我们的好在哪里.Zend_DB使用的是pdo,所以一定要打开这个扩展…费话.仅次于Controller的zend第二大被经常使用的类.包括各种数据库的操作封装,连select都有专门的使用方法.再也不用写完整的sql语句了?不好吧.反正我用到的只是其中一少部分.包括连接.查询.特别的插入,更新,删除操作.10 Zend_Debug这个用于调试,简单的调试.相当于echo $some;当然它会输出更详细的信息.11 Zend_Exception异常处理,Zend使用过程中的异常.有兴趣拿DB测试一下,自己抛着玩.12 Zend_FeedWeb应用吧,可以试一下我的Feed:http://Blog.csdn.net/mayongzhan/rss.aspxFeed中最需要看的就是rss和atom,感觉atom更现代一点,最少是看上去比rss更好一些.13 Zend_Filter各种乱七八糟的过滤.需要的时候去查一下,也许你会发现php的函数使用起来会比这个东西方便.只是也许.14 Zend_Form这个东西似乎是为标准程序员准备的,所谓标准程序员就是一点也不考虑界面,当然标准程序员一定不是一个好的web程序员.没有web程序员不懂html的.呵呵.这个意义对我来说不大,对其他人我就不知道了.用来生成一个html表单.15 Zend_GdataGdata是Google Data的缩写,当然也就是google的东西,但是不包括著名的gmail,search,map.这个只是google data API.对google的API感兴趣的可以研究一下.俺不是GOOGLE迷…也不是baidu迷.16 Zend_Http这部分是我目前主要研究php的方向.当然zend做了很多有意义的事情.zend_http很像php的curl,感觉没有curl强大,不过curl的操作有点不透明,使用起来感觉对了都不知道怎么对的.这个东西还需要改进啊.比如可以在这个东西的基础上开发一个检测http的类.呵呵.我比较喜欢.17 Zend_InfoCard传说中的个人身份认证信息.只是传说中的,应用很少的.18 Zend_JsonJavaScript Object Notation,这个东西负责对json的操作,其实就是编码解码…对json感兴趣的研究一下.我是没什么兴趣…19 Zend_Layout一个和view有关的,实现了二级视图的东西.这个我更习惯于使用zend controller或者shtml来解决.方法不同.20 Zend_Loader动态加载,当然是和静态的include做对比.可以根据需要加载.当然这是一个模糊的概念,不过确实省去了不少的工作.很不错的代码.效率?呵呵.21 Zend_Locale国际化?本地化?就当成是国际化的东西吧.谁想知道马永占翻译成意大利语是什么?反正我是用不到.22 Zend_Log通用的log记录.很像操作系统内的log也很像apache里的log.有点像我写的log…Zend_log里面最好的两个概念:1分级error级notice级等等,zend分了8级,2保存log,zend可以把log放到输出,数据库,文件当中.当然我们最常用的就是输出到文件.zend_log给了我不少的启发.用于改进我的MyZ_log.很有用的东西.23 Zend_Mail目前我在用的是一个php写的smtpMail类…当然zend也是php写的…如果你正好要用mail,或者觉得原来的mail函数不够好的话,建议看看zend_mail.24 Zend_Measure用于转换,最简单的例子是把英尺转成公尺.对于我们这样的小庙…用不上啊…25 Zend_Memory内存管理,恩.这个来头不小.程序级的内存管理.不了解…底层程序员也许会关心这个程序级的内存管理吧.26 Zend_Mime多用于mail函数的mime,当然也可以自己使用.27 Zend_OpenIDOpenID啊.很火的东西,目的是整合世界上所有的帐号,不过现实的情况是每个厂商也不愿意被整合.都想着怎么整合别人.所以这个东西发展的不是很好.28 Zend_PdfPdf一种文件格式,是adobe的,就是电子书最经常用的格式.zend被宣传说支持pdf操作,我想这东西有必要宣传吗?难道是zend的主要功能?太小题大做了吧.29 Zend_Registry将一个东西(变量,数组,类…)注册到全局应用当中,就是write once use anywhere ,当然这个anywhere是指你的整个项目.开销是不是大了些?但是如果你经常用的话,这样做会很有帮助.免去了每次使用都要new class.30 Zend_Rest这个来头也不小.zend里面到处都是经典的程序.rest类似于xmlrpc和soap,是一种目前最新的web service,使用似乎没有xmlrpc多.也没有soap多.传说中我还有一份rest之父的论文…传说中的zend31 Zend_Search_Lucence基于文本的搜索引擎,当然是改编于那个Lucence,现在开始怀疑,zend是不是象称霸php.怎么什么都写…没试过.32 Zend_Server为其他zend的类提供支持.是一个基础类.当然也可以自己拿出来用.也许你能开发出来比rest更优秀的web service靠这个东西…33 Zend_Service网络上的除了google的各种服务,为啥要把google单拿出来呢?不好实现?还是google太强大了…这些我是一个也没用过…会用到的.当初在csdn看到一个牛人用delicious在自己的csdn博客上加上了相关文章…(我多次请求csdn,加上相关文章,结果石沉大海…这老兄真的很猛.csdn给不了我们的.我们自己做.没有枪没有炮,我们自己造.)34 Zend_Session这个是个好东西,提供存储session和提供session的API,当然这个是为了跨域名,跨服务器准备的.当然也能代替传统的session_start()…如果你想这么做的话…35 Zend_Translate解决了语言问题...最另我高兴的是看到了zend使用.mo文件.这个mo文件是在drupal里的语言包.zend做的不错.36 Zend_Uri验证url的类,这个也是基础,是被其他zend成员调用的.也能自己用.37 Zend_Validate校验器,前面有个filter是过滤的.这个是验证的.本质都是一样的.是判断是否符合规则,然后validate是返回对错.filter是直接把不符合的地方去掉.当然我们大家一定都有自己的过滤和校验器.好好的参考一下zend ,然后进行修改吧.38 Zend_Version这个是zend里源码最好读的一部分…是最简单的.建议无论是否想学习zend都去看一下…这样在和被人吹牛的时候就能这么说:zend啊.前几年我看过它的源码,写的不错…39 Zend_ViewZend MVC当中一员.也能算上是五虎上将之一.不过在我这却没有被使用…我使用了smarty作为替换…感觉有点对不住zend,zend这么多东西,我只用了几个…哎…不过zend_view的helper很不错.可以替代手写,生成各种需要在view层显示的代码.40 Zend_XmlRpcWeb service,xmlrpc是最简单的一种.当然zend的这的类也是完成80/20使命.我想用的人很少吧.Zend也挺符合2/8理论的,20%的程序被经常使用.剩下的用的很少.但是作为一个完整的framework,zend是经典的. 转自:http://blog.csdn.net/mayongzhan/archive/2008/04/28/2340402.aspx
Zend Framework教程列表出来也有几天了,只有少许PHPer给本人提出意见以及建议..那没办法..我现在只有按照我自己的想法去写这一系列的教程..我答应过PHPer会在这周出最少一篇的教程..今天,我有点时间我就来写第一篇吧.OK!开工了...第一步:确认你的PHP环境: 1.请PHPer确认你的PHP版本是否在5.2.0以上..如果不是的话..请更新到5.2.0,否则.Zend Framework 好像用不了..我自己有试过. 遇到过这样的问题..所以请你们自己测试一下..PHP源码最新版下载地址为:http://www.php.net/downloads.php. 2.你的PHP环境配置好了之后,请打开php.ini文件,确认PDO扩展是否打开.如果没有请把extension=php_pdo.dll之前的;号给去掉. 3.打开APACHE文件夹里面的httpd.conf文件.查找到apache的mod_rewrite模块,确认LoadModule rewrite_module modules/mod_rewrite.so是否打开.如果没有请去掉 它前面的#号. 4. 查找到httpd.conf文件,如果AllowOverride为None的话..请一定把None都改成all.这样你写.htaccess这样的文件才会起到作用.. 5.重新启动你的APACHE服务器..这样我们的PHP环境就可以运用Zend Framewrok了. 第二步:获取Zend Framework源码: 1.下载最新版的Zend Framework源码.现在最新版好像是1.7.0.但是怕不稳定..所以请PHPer们自己决定用什么版本的.大家可以在这里下载http://www.zendframework.com/download/latest最新版本的源码.第三步:建立项目目录: 我也不想去多说什么..我把图片给展示出来..是我的这个教程的项目目录...我在上面都有说明..大家可以按照下面的方式来建立目录..当然下面我会提供源码下载. 不过建议朋友们一定要自己动手..才可以学到更多..我给也源码也只是给大家做为一个参考. 第四步:程序说明:这里我不多说什么.因为每个文件里面都有注解.我想不会有太难.要是有的朋友不懂请在博客上给我留言.我会关注这个博客..尽量回答你们的问题..谢谢.. index.php(网站入口)文件及说明:<?phperror_reporting(E_ALL|E_STRICT);date_default_timezone_set('Asia/Shanghai'); set_include_path('.' .PATH_SEPARATOR .'./library'.PATH_SEPARATOR .'./application/models/'.PATH_SEPARATOR .get_include_path());require_once 'Zend/Loader.php';Zend_Loader::registerAutoload();//设置Zend Framework 自动载入类文件$registry = Zend_Registry::getInstance();//设置模板显示路径$view = new Zend_View();$view->setScriptPath('./application/views/scripts/');$registry['view'] = $view;//注册View//设置控制器$frontController =Zend_Controller_Front::getInstance();$frontController->setBaseUrl('/zendframework')//设置基本路径->setParam('noViewRenderer', true)->setControllerDirectory('./application/controllers')->throwExceptions(true)->dispatch(); IndexController.php文件及说明:<?phpclass IndexController extends Zend_Controller_Action{function init(){$this->registry = Zend_Registry::getInstance();$this->view = $this->registry['view'];$this->view->baseUrl = $this->_request->getBaseUrl(); } function indexAction(){//这里给变量赋值,在index.phtml模板里显示$this->view->bodyTitle = '<h1>Hello World!</h1>';echo $this->view->render('index.phtml');//显示模版} } index.phtml模板文件说明:<?=$this->bodyTitle; ?> <!-- 这里输出控制器里Action传过来的值:hello world --> 整个文件源码下载...地址.在这里..不过我的library里面没有加上Zend. 请各位PHPer自己加上..因为空间有限...哈哈...好了...这个教程就算是搞定了..要是有什么问题..请朋友给我留言...有空就常关注册一下我的博客.....现在这个博客还没什么人气....呵呵...源码下载地址: 源码下载... 转自:http://www.oophp.cn/article/view/aclass/68-0/id/156
很久一段时间没更新博客了,由于近段时间一直在忙 挑战杯 的项目,所以没怎样把一些总结放上来。这次,总结下 php 的一个 函数 : boolean isset($test),返回值:boolean类型,传入参数不为空,返回true,反之,false参数:常用一个 $ 变量 该函数和empty 差不多,用于判断变量是否已经被定义,之前的我,在一些项目代码中看见过,但是并没有觉得它的功能很起眼,现在的我觉得,这个函数真的是项目开发必备。 说下我遇到的问题和使用 isset 解决的过程吧,我在我们参赛项目组中是负责微信公众平台这块的,由于测试的时候使用的服务器是 新浪云 ,而最终比赛是要迁移代码到我们的硬件板子上面,它是基于linux系统的开发板,一个移动服务器。 在迁移代码的时候,重新在微信公众平台验证token的时候,成功,功能测试时,抛出很多次,某个变量没被定义, undefined 的错误。当时我就觉得神奇了,同样的代码,在新浪云上面能够正常使用。后来百度了下,找到了 isset。 使用三目运算 isset($a)?$a:"" 试了一下,果然,问题全部解决。 原因是: undefined 这个本身不算是错误,是一个安全提醒,在不同版本的php 中,会有不同安全处理。说白了,就是一个编码习惯,对要get,post得到的值,最好用这个 套一下。
(出处:http://www.cnblogs.com/linguanh/) 1,前序由于要重构APP(社交类) 服务端接口的部分代码,故接触到了 innoDB,以及事务这个词,下面主要是以例子的形式显示它的用法,理论的东西不过多讲述。 2,何为事务鄙人在编程方面的解释:多条命令操作放在一起处理 , 例如提交的时候一起提交,撤销的时候也是一起撤销,书本对这个词的定义内容很多。 3,myisam 与 innoDB 它们都是mysql数据库的引擎,我们一般建表默认的是 myisam 引擎,比较:http://www.cnblogs.com/vicenteforever/articles/1613119.html,个人认为,类似于insert、update、delete 这种操作如果涉及多表或单表互联操作的情况,为了避免数据写脏,请使用事务。因为整个过程中若一条错误,便可以回滚到开始时的状态。 4,分享个基于php的类 1 <?php23 /**4 * Created by PhpStorm.5 * User: 林冠宏6 * Date: 2016/4/287 * Time: 10:208 */9 include "Config.php"; /** 数据库配置信息类,自行完善 */1011 class Sql{12 public $link = null;13 private $config = null;14 /**15 * 是否直接开启事务16 */17 public function Sql($begin = false){18 $this->config = new Config();19 $this->connect();20 mysql_query("SET AUTOCOMMIT=0",$this->link); /** 设置不自动提交,默认是自动提交 */21 if($begin){22 $this->SWBegin();23 }24 }2526 public function connect(){27 $this->link = mysql_connect($this->config->host,$this->config->user,$this->config->pw); /** 连接数据库 */28 mysql_query("SET NAMES 'utf8'",$this->link); /** 经验总结,使用mysql设置页面编码,最好等链接了,再设置,意思是在连库函数后面使用 */2930 if(!$this->link){31 exit("connect_dataBase_wrong");32 }33 if(!mysql_select_db($this->config->db,$this->link)){34 exit("select_db_wrong");35 }36 }3738 /**39 * 命令、是否判断行数、出错是否自动启用回滚、链式提交40 */41 public function exec($query,$judgeLength=false,$rollBack = false,$isCommit=false){42 $res = mysql_query($query,$this->link);43 if($judgeLength){ /** 是否判断行数 */44 if(mysql_num_rows($res)<=0){45 return null;46 }47 }else{48 if(!$res){49 if($rollBack) {50 $this->rollBack();51 }52 exit($query); /** 抛出出错的 sql 语句 */53 }54 }55 if($isCommit){56 return $this;57 }else{58 return $res;59 }60 }6162 /** 开始事务 */63 public function SWBegin(){64 mysql_query("BEGIN",$this->link);65 }6667 /** 回滚 */68 public function rollBack(){69 mysql_query("ROLLBACK",$this->link);70 }7172 /** 提交事务 */73 public function commit($getThis=false){74 mysql_query("COMMIT",$this->link);75 if($getThis){76 return $this;77 }else{78 return null;79 }80 }81 }8283 ?>5,例子1 <?php2 /**3 * Created by PhpStorm.4 * User: 林冠宏5 * Date: 2015/10/246 * Time: 11:237 */89 include "Sql.php";10 $sql = new Sql();1112 /** 往 aa 表中插入一批数据,注意建aa表的时候要选择 innoDB 引擎 */13 for($i=0;$i<10;$i++){14 $temp = $i."k";15 $query = "insert into aa (a,w) values('$i','$temp')";16 $sql->exec($query);17 }1819 /** 下面的注释君请自行开启看效果 */20 //$sql->rollBack(); /** 回滚的话,上面的所有insert不会被执行 */21 //$sql->commit(); /** 不commit提交的话,上面的insert也不会被执行 */2223 /** select 操作不用commit也可以直接使用 结果集 */24 /*25 $result = $sql->exec("select * from aa");26 while($row = mysql_fetch_assoc($result)){27 print($row)."</br>";28 }29 */3031 ?>View Code
目录 前序用途功能及事项使用方法代码及注释 前序:总体来说,我更应该是一个 android 移动开发者,而不是一个 phper,如果说只做移动端的 APP ,我也不会学这么多,这 2年来,几乎所有的服务器接口都也是 由我一手操办,用的是 pHp,我是在很不愿意的情况下完成这个类的,因为 项目分工的 后台程序员,没完善这块,所以等不了他了,只能自己来搞,但这样自己的任务时间就少了。这个类的功能还是挺强大的,适合很多地方。 Whatever,enjoy this `Class`. 用途:按照时间范围生成 sql 语句,然后以此获取改时间范围内的数据集合,常见的功能模块含有此类数据的有:曲线图,图标的数据按照时间显示;数据按照日期排序显示。对于这部分的功能数据返回,一半是由负责服务器后台的人来完成的,我们移动前端开发者,只需要调用接口就可以了。 功能及事项:1,使用后产生的是,要查找的时间范围,根据传入参数选择生产,也可以组合 sql 语句返回,本例就是;2,已实现:1) 按 日 生成范围2)按周 生成范围3)按月 生成范围4)按年 生成范围3,所用语言是 php,服务器解析需要安装 Apache,或者 Nginx;4,格式是时间戳,切记,拥有时间戳,就可以任意处理,可以生产这种日期时间格式: 2016-7-08 12:1:3;5,常见的使用场景是,根据 时间范围 搜索数据;6,我会提供一个链接供大家直接点击看 输出效果。 使用方法:$controller =new TimeRangeHelper(); // 实例化$func =$_REQUEST['func']; // 以 get 的方式或者 post 的方式 传入要调用的 函数名称$controller->$func(); // 这里就会自动调用了例如:链接xxx ?func=RangeTest试一试?点击我就能看到啦就可以看到代码及注释: 1 <?php2 /**3 * Created by PhpStorm.4 * Author: 林冠宏5 * Date: 2016/6/46 * Time: 16:067 *8 * 前序:9 * 总体来说,我更应该是一个 android 移动开发者,而不是一个 phper,如果说只做移动端的 APP ,10 * 我也不会学这么多,这么 2年来,几乎素有的服务器接口都也是 由我一手操办,用的是 pHp,目前大三,11 * 我是在很不愿意的情况下完成这个类的,因为 项目分工的 后台程序员,没完善这块,我来搞,时间就不12 * 够了。 Whatever,enjoy this `Class`.13 *14 * 功能:15 * 1,产生 要查找的 时间范围16 * 2,格式是 时间戳,拥有时间戳,可以任意处理17 * 3,常见的使用场景是,根据 时间范围 搜索数据18 */1920 class TimeRangeHelper{2122 /** 一天 和 一周的时间轴 大小是肯定的,月的天数不能确定,年也是,故不作定义 */23 private $DayTime ;24 private $WeekTime ;25 private $openLog ; /** 是否开启调试信息输出 */2627 function TimeRangeHelper(){28 $this->DayTime = 24*60*60;29 $this->WeekTime = 7*24*60*60;30 $this->openLog = true;31 }3233 /** 整体测试函数 */34 public function RangeTest(){35 /** 日 测试 */36 $this->GetTimeRang("日","2016-6-5");37 $this->GetTimeRang("日");38 $this->GetTimeRang("日","2015-6-1");39 echo "</br>";40 /** 周 测试 */41 $this->GetTimeRang("周");42 $this->GetTimeRang("周","-1");43 $this->GetTimeRang("周","14");44 $this->GetTimeRang("周","6");45 echo "</br>";46 /** 月 测试 */47 $this->GetTimeRang("月");48 $this->GetTimeRang("月","2015-5");49 $this->GetTimeRang("月","2016-7");50 $this->GetTimeRang("月","2016-11");51 echo "</br>";52 /** 年 测试 */53 $this->GetTimeRang("年","2011");54 $this->GetTimeRang("年");55 $this->GetTimeRang("年","2015");56 }5758 public function GetTimeRang($timeType = null,$selectTime = null){59 header("content-type: text/html;charset=utf-8");60 error_reporting(E_ALL^E_WARNING^E_NOTICE);//显示除去E_WARNING E_NOTICE 之外的所有错误信息61 /** 默认是周 */62 if($timeType == null){63 $timeType ="周";64 $this->GetWeekRange($timeType);65 }else{66 switch($timeType){67 case "日": // 24小时内所有68 $this->GetDayRange($selectTime);69 break;70 case "周": // 一周内所有71 $this->GetWeekRange($selectTime);72 break;73 case "月":74 $this->GetMonthRange($selectTime);75 break;76 case "年":77 $this->GetYearRange($selectTime);78 break;79 default:80 echo("参数错误!");81 break;82 }83 }84 }8586 /** -----------------获取 日 的范围----------------87 * $selectTime 是否获取特定的 某一天 格式是 y-m-d88 */89 private function GetDayRange($selectTime){90 /** 防止 日后 添加 日 可选功能,格式是 y-m-d */91 if($selectTime==null){92 $timeF = strtotime(date("Y-m-d",time()));93 }else{94 $timeF = strtotime($selectTime);95 }96 $timeL = $timeF + $this->DayTime;97 if($this->openLog) {98 echo "日获取范围->" . date("Y-m-d H:i:s", $timeF) . "-----" . date("Y-m-d H:i:s", $timeL) . "</br>";99 }100 return " and (entryTime between '$timeF' and $timeL''";101 }102103 /** -----------------获取 周 的范围----------------104 * $selectTime 是否获取特定的 某一周 格式是 整数,含负数105 */106 private function GetWeekRange($selectTime){107 $timeF = strtotime(date("Y-m-d",time()));108 $dayOfWeek = date("N",time());109 $timeF = $timeF - (int)$dayOfWeek * $this->DayTime + 1; // 加一 纠正110 /** 防止 日后 添加 周 可选功能,格式是 整数,含负数,指示 是距离当前这周的第几周 */111 if($selectTime!=null){112 switch($selectTime){113 case 0: // 特殊情况 0 是本周114 $timeL = $timeF + $this->WeekTime;115 break;116 case 1: // 特殊情况 1 下一周117
1. 安装目录不可读写---赋予权限chmod -Rf 777 public2.安装环境参考https://lnmp.org/install.html3.wget 若没有安装 yum 安装
首次搭建自己的网站,在本地wamp服务上没有任何错误,但是同步到阿里云上就报错了,是什么原因呢?原来,首次搭建网站要给予某些目录权限,否则权限无法运行,肯定报错的。我是把Application下的目录全部给与了777权限。chmod-R777/home/wwwroot/xiaokai/Application/
public function CheckMobileUser($data){$sql='select phone,username from wlzbpre_user where phone="'.$data['phone'].'" or username="'.$data['phone'].'" and status="1" limit 1';$phone=M()->query($sql);$phone =$phone[0]['phone'];$username=$phone[0]['username'];if(empty($phone)){$remark=array('RespCode'=>'081','RespDesc'=>'手机号/用户名不存在','AcctDetails'=>array('token'=>''),);}else{$remark=array('RespCode'=>'000','RespDesc'=>'手机号已存在','AcctDetails'=>array('phone'=>$phone,'username'=>$username),);}return $remark;}
在配置好cakephp之后,我们输入网址后都一般默认显示index/index 文件,那么怎么设置呢?1.D:wwwcakephpappConfigroutes.php
在新搭建好cakephp矿建时,准备开发的时候我们会发现页面上有cakephp的标识,影响美观,和开发任务。那么怎么去掉呢?1.找到FrontDeskappViewLayoutsdefault.ctp文件2.复制一份备份保留为default.ctp13.屏蔽或者删除非必要部分4.测试效果
1. 引入Model类2.调用model类(Guarantee)下的getCity()方法3.写sql语句 并返回获得值4.foreach循环取得的城市
cakephpstrtotime:将英文文本日期时间解析为 Unix 时间戳<?php if(time()<strtotime(Configure::read("Shuang_START"))):?>alert('活动尚未开始~');return;<?php endif;?><?php if(time()>strtotime(Configure::read("Shuang_END"))):?>alert('活动已经结束~');return;<?php endif;?>
1.2.引入 循环遍历正确:
php有一个函数可以获取网页文件的所有meta标签,该函数就是get_meta_tags,函数最终返回一个数组。本文章向大家介绍php get_meta_tags的使用实例,需要的朋友可以参考一下。
我们大家都知道,php header函数可以实现页面跳转,那么当页面执行跳转后,php代码是否就停止运行呢?本文章通过实例向大家分析php header页面跳转后代码是否继续运行。需要的朋友可以参阅一下。