三:Zend 连接数据库

时间:2013年05月06日作者:锋叔 查看次数: 134评论次数:0

前面说过了zend框架走的流程,controller->view,现在缺m(数据操作)这部份。

建立数据库,新建数据库:mydb,建立表article,随便创建字段id ,name,content,postdate

插入一些测试数据:

这里举两种连接方式,均在手册上可以查到:

二者均要用到model中的指定表的文件,在models文件夹下新建Article.php文件,它继承自Zend_Db_Table(因为你要用到zend的方法,所以要继承它), 代码如下 :

<?php

class Article extends Zend_Db_Table {

protected $_name = "article";//这里是指定表名

protected $_primary = "id";///默认就是id,所以这个可以省略
}

?>

我们在IndexController中的indexAction 中测试:

一:读取配置文件:

在配置文件application.ini中:添加

[mysql]
db.adapter = "pdo_mysql"
db.params.host = "localhost"
db.params.username = "root"
db.params.password = "123456"
db.params.dbname = "mydb"

读取配置->初始化->使用

$url = constant("APPLICATION_PATH") . DIRECTORY_SEPARATOR . 'configs' . DIRECTORY_SEPARATOR . 'application.ini';
//echo $url; D:\Work\WebSite\myzend\application\configs\application.ini
$dbconfig = new Zend_Config_Ini($url,"mysql");
$db = Zend_Db::factory($dbconfig->db);
$db -> query("set names utf8");
Zend_Db_Table::setDefaultAdapter ($db);

二: 直接配置

req

标签:Zend连接数据库   分类:Zend Framework

二:zend标准目录开发

时间:2013年04月06日作者:锋叔 查看次数: 234评论次数:0

笔者使用编辑器为aptana studio 3 ,另推荐zend studio

成功配置好后,zend 的目录架构如下:

 

之所以使用框架,是由于框架定义了标准,使得开发变得规范和简单,多人开发时,也默认地约束了不同程序员间的程序规范。不会一个工程,几种风格编程,使得后期维护变得复杂。

zend framework是标准的mvc框架,mvc设计的思想是:数据输入,数据处理,数据显示。

访问的逻辑为: 默认:http://myzend.com/ 等 于 http://myzend.com/index/index

回忆之前的配置,是指向到public目录下的index.php,那里有它写好的一堆代码,由这个文件出发,到application目录下的Bootstrap.php,再到控制器controllers目录下的IndexController.php的indexAction方法

看起来加载的东西特多,但效率会不会很慢?写个程序来判断一下,分别输出加载时的时间。也不用刨根问底为什么会这样的顺序来加载,这是底层的东西了,等自己熟悉了这套程序后,再慢慢深究不迟。你开飞机,但不一定要懂得如何造飞机

OK,依次在这几个文件处加上

\public\index.php 中开始加上echo date("Y-m-d H:i:s")." \public\index.php<br>";

\application\bootstrap.php中加上:它是继承类,不能直接就echo

function __construct($app) {
parent::__construct($app);
echo date("Y-m-d H:i:s")." \Bootstrap.php<br>";
}

\application\controllers\IndexController.php中的init()方法和indexAction()方法中分别加上

echo date("Y-m-d H:i:s")." \IndexController\init<br>";

和echo date("Y-m-d H:i:s")." \IndexController\index<br>";

OK,看看这一“复杂”过程,从加载开始到结束共用了多少时间

如图:

当然,本机加载忽略了网络因素,有兴趣的朋友,放到网络

一:Zend FrameWork框架开发:配置

时间:2013年04月06日作者:锋叔 查看次数: 219评论次数:0

zend framework配置:

到zend官网(http://www.zendframework.com/)下载zend framework ,本例使用的版本是: 1.11

下载后压缩包里文件结构如图1,解压至电脑目录,我这里是D:\Work\WebSite\zf12

用zend自带的zf.bat创建工程,方法如下:

1:进入命令行 (cmd)

2: 进入解压好的zend目录的bin路径。

3:使用zf.bat create project 建立工程

4: 输入工程目录:如本例的:\Work\WebSite\myzend。

配置apache. 根据个人习惯,在本地测试时,可使用端口访问,也可以使用本机dns作解析,用伪域名访问

本例用 http://myzend.com访问(本例使用wamp集成开发组件)

1:打开apache目录,找到httpd.conf文件。

2:打开,找到所有的AllowOverride None,注释掉或者改为AllowOverride All

3:找到 # Virtual hosts
#Include conf/extra/httpd-vhosts.conf

把#号去掉,打开/extra/httpd-vhosts.conf文件,添加上

<VirtualHost *:80>
ServerName myzend.com
Options All
DocumentRoot "D:/Work/WebSite/myzend/public/"
DirectoryIndex index.html index.php
</VirtualHost>

注意:要指向到zendframework的public目录下

zend使用的是pdo_mysql,所以要把这个支持开启,打开php.ini

extension=php_pdo_mysql.dll 找到后,把前面的;去掉。

找到zf解压的文件的library,打开,把zend这个目录的文件,全部拷至用zf.bat生成的工程中的library目录下

最后,依次打开至如图位置,在末尾添加127.0.0.1 myzend.com,然后重启apache

在浏览器处输入http://myzend.com/

如图看到表示配置成功,这程序哪里出来的呢?后面继续学习

 

PHPExcel读取数据时,日期的处理

时间:2013年03月09日作者:锋叔 查看次数: 395评论次数:0

PHPExcel读取日期格式,如

2012/5/16 21:05:00时,若如普通读取一样,会返回一个形如41045.878472222的数字。

这与我们期待的结果风马牛不相干。
网上很多网友有提供一个excelTime这样的函数,确实返回了2012-05-16,

function excelTime($date, $time = false) {
 if (function_exists('GregorianToJD')) {
  if (is_numeric($date)) {
         $jd = GregorianToJD(1, 1, 1970);
   $gregorian = JDToGregorian($jd + intval($date) - 25569);
   $date = explode('/', $gregorian);
   $date_str = str_pad($date[2], 4, '0', STR_PAD_LEFT) . "-" . str_pad($date[0], 2, '0', STR_PAD_LEFT) . "-" . str_pad($date[1], 2, '0', STR_PAD_LEFT) . ($time ? " 00:00:00" : '');
   return $date_str;
  }
 } else {
        $date = $date > 25568 ? $date + 1 : 25569;
  /*There was a bug if Converting date before 1-1-1970 (tstamp 0)*/
  $ofs = (70 * 365 + 17 + 2) * 86400;
  $date = date("Y-m-d", ($date * 86400) - $ofs) . ($time ? " 00:00:00" : '');
 }

PHP 数据结构思维 用栈来反转字符串

时间:2013年02月20日作者:锋叔 查看次数: 529评论次数:0

PHP本身有内置函数strrev(),用作把一串字符反转。 但面试时,有面试题为"不利用内置函数,实现字符串反转",虽然网上有不少答案,但似乎没有是用到数据结构思维的。

如: $a = "hello world!";

echo strrev($a);    //"!dlrow olleH"

数据结构中,栈就是后放进去的先拿出来。利用这个思想,若我们把字符串$a一个个顺序放进去,再后放先出,即可实现字符串反转。

先写一个类实现栈:名为  stackX

class stackX{
 public $top;  ///类似指针
 public $stackArr = array();  //压入的数组
 
 public function __construct()
 {
  $this->top = -1; ///初始化为-1
 }
 
 public function push($str)
 {
  $this->stackArr[++$this->top] = $str;  //当压入时,先执行指针位移。 如:第一个$str=1压入时,即$this->stackArr[0] = 1;
 }
 
 public function pop()
 {
  return $this->stackArr[$this->top--];  //弹出元素,并把指针指向弹出元素的后一位
 }
 
 public function isEmpty()
 {
  return ($this->top == -1); //判断是否栈己为空
 }
}

class strRev {
 public $str;
 
 public function __construct($str)
 {
  $this->str = $str;  //构造函数带入要处理的字符串
 }
 
 public function doRev()
 {
&nbs

使用curl_init()时出现Call to undefined function curl_init()的解决方法

时间:2013年02月19日作者:锋叔 查看次数: 389评论次数:0

<?php

$ch = curl_init();
$timeout = 30;
curl_setopt ($ch, CURLOPT_URL, 'http://www.qq.com');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);

echo $file_contents;

?>

用curl抓取远程网页内容时,如果提示Call to undefined function curl_init(),则请检查是否出现了以下情况:

1:打开php.ini,找到“extension=php_curl.dll”,然后去掉前面的“;”注释,重启apache。

2:如果还出现此类问题,先检查php.ini的extension_dir值是哪个目录,在那个目录下检查有无php_curl.dll,没有的话请下载php_curl.dll,再把php目录中的libeay32.dll和ssleay32.dll拷到c:windowssystem32里面,重启apache,OK!

标签:curl  PHP抓取网页失败   分类:PHP编程

PHP设计模式之单例模式

时间:2012年12月16日作者:锋叔 查看次数: 677评论次数:0

单例模式确保一个类只有一个实例,使用单例模式, 则可以避免大量的new 操作消耗资源。

构造函数和析构函数必须声明为私有,防止外部程序new

<?php
header("Content-Type:text/html; charset=utf-8");
class Single {
 private static $_instance;
 
 private function __construct() {
  echo "This is a Constuct Methodn";
 }
 
 /*
 创建__clone,防止对象被克隆 
 */
 public function __clone() {
  trigger_error("Clone will be Wrong",E_USER_ERROR);
 }
 
 public static function getInstance() {
  if(!(self::$_instance instanceof self)) {
   self::$_instance = new self();
  }
  return self::$_instance;  
 }
 
 /*
 测试程序
 */
 public function myTest() {
  echo "Get the Singlen";
 }
}

$a = Single::getInstance();
$a->myTest();

?>

标签:PHP设计模式  单例模式   分类:PHP编程

JS控制彈出窗口

时间:2012年09月07日作者:林中之狼 查看次数: 1280评论次数:0

一、 基本变化
<SCRIPT LANGUAGE="javascript">
<!--
window.open ('page.html', 'newwindow', 'height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no,resizable=no,location=no, status=no')
//写成一行
-->
</SCRIPT>
参数解释:
window.open 弹出新窗口的命令;
'page.html' 弹出窗口的文件名;
'newwindow' 弹出窗口的名字(不是文件名),非必须,可用空''代替;
100 窗口高度;
width=400 窗口宽度;
top=0 窗口距离屏幕上方的象素值;
left=0 窗口距离屏幕左侧的象素值;
toolbar=no 是否显示工具栏,yes为显示;
menubar,scrollbars 表示菜单栏和滚动栏。
resizable=no 是否允许改变窗口大小,yes为允许;
location=no 是否显示地址栏,yes为允许;
status=no 是否显示状态栏内的信息(通常是文件已经打开),yes为允许;


二、 弹启一个全屏窗口
加入fullscreen
<SCRIPT LANGUAGE="javascript">
<!--
window.open ('page.html', 'newwindow', 'fullscreen') //全屏了,自然其他条件就都失效了
-->
</SCRIPT>

三、 打开一个和按F11所见到的一样的窗口
加入channelmode
<SCRIPT LANGUAGE="javascript">
<!--
window.open ('page.html', 'newwindow', channelmode)
-->
</SCRIPT>

四、 打开一个连标题栏都没有的窗口(无标题、最小、最大、以及关闭按钮)
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset

标签:JS  彈出窗口   分类:jQuery

PHP求水仙花数

时间:2012年09月05日作者:锋叔 查看次数: 1270评论次数:0

水仙花数是指一个数n(>=3)等于它的每个位数字的n次幂之和。 如:153  (153=1^3 + 5^3 + 3^3)

这里给出三位数字的水仙花数,代码如下 :

<?php

for($i=100;$i<1000;$i++)
{
     $a = intval($i/100);     ///取百位上的数字
     $b = intval($i/10%10);  ////取十位上的数字
     $c = intval($i%10);   /////取个位上的数字


     if($i==($a*$a*$a+$b*$b*$b+$c*$c*$c))
    {
        echo $i."<BR/>";
    }
}

?>

 

程序输出:

153
370
371
407

标签:水仙花数  PHP求水仙花数   分类:PHP编程

滑动门代码——鼠标悬垂或点击切换显示区域

时间:2012年08月20日作者:林中之狼 查看次数: 4679评论次数:0

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>林中之狼滑动门技术</title>
<style media="screen" type="text/css">
<!--
*{font-size:12px;}
html,body{margin:0;text-align:center;over-flow:hidden;height:100%;width:100%;}
UL{list-style-type:none; margin:0px;}

/* 标准盒模型 */
.ttl{height:18px;}
.ctt{height:auto;padding:6px;clear:both;border:1px solid #064ca1;border-top:0;text-align:left;}
.w936{margin:2px 0;clear:both;width:936px;/*这里调整整个滑动门的宽度*/}

/* TAB 切换效果 */
.tb_{background-image: url('http://www.dc18.com/images/barbg_tab.gif'); background-repeat: repeat-x;background-color: #E6F2FF;}
.tb_ ul{height:24px;}
.tb_ li{float:left;height: 24px;line-height:1.9;width: 94px;cursor:pointer;}

/* 用于控制显示与隐藏的css类 */
.normaltab     { background-image:url('http://www.dc18.com/images/normal_tab.gif'); background-repeat: no-repeat; color:#1F3A87 ;}
.hovertab      { background-image: url('http://www.dc18.com/images/hover_tab.gif'); background-repeat: no-repeat; color:#1F3A87; font-

标签:滑动门代码  滑动门特效   分类:jQuery