Submitted by on 2007, May 31, 6:50 PM
PDO,全称PHP DATA OBJECTS,在PHP中定义了一个轻量级别的数据操作接口。在PHP5.1及其之后的版本中得到完全的支持。PDO,实现了事务、不同数据库之间的抽象。这是我最喜欢的原因。
1、简单的PDO操作。
实现连接数据库,查询数据。
| 代码: |
<?
try{
$db=new PDO("mysql:host=localhost;dbname=test",$user,$psw);//连接数据库
foreach($db->query("select * from test") as $row){//查询数据库
print_r($row);
}
$db=null;//关闭数据库连接
}catch(PDOException $e){
}
?> |
2、事务操作。
pdo能实现事务处理,但记住必须要你的数据库支持这种操作。
$pdo->beginTransaction();开启事务
$pdo->commit();提交事务
$pdo->rollback();回滚
具体例子可以参考手册上的。
3、prepared statement 和存储过程。
使用prepared statement主要有两个好处:
a、SQL查询语句只要解析一次,但是能够执行多次。这样能提高执行的速度。因为一般来说SQL语句都是要经过分析/编译/优化这个循环的。但使用PS就能减少步骤,提高速度。
b、能够避免SQL注入的危险。PS能够自动帮你实现的。
具体列子看手册。推荐使用prepared statement
最后,如果是PHP5.1以上环境,推荐使用PDO来处理。
之前我用adodb等一些封装类来实现crud,以后只要环境支持(php5.1+)尽量中使用PDO来代替。
Tags: PDO
网站|PHP学习 | 评论:0
| Trackbacks:0
| 阅读:1116
Submitted by on 2007, May 31, 6:47 AM
在这个世界上。在璀璨的星辰陨落,也黯淡不了星空灿烂,再绚烂的花朵凋零,也荒芜不了整个春天。所以人生要尽全力度过每一关,不管遇到什么困难都不可轻言放弃。活着,就是我们人最大的欲望。
生活这个骗子给我们看到的都是光鲜一面和太多美丽谎言,你如果信以为真,就真的错了。
如墨深夜,寂静如死。
还真像生活呢,都是让人无话可说。
没有谁能有资格选择命运,但是每个人都有资格反抗命运.当生活中灾难真正来临的时候,被命运强奸的人有的会从头到尾的怨天尤人,既不喜欢被强奸又不做什么挣扎;有的人却是摆个舒服的姿势尽量享受强奸,而有的人就是一直在反抗在挣扎,最后一种人是扼住命运的咽喉,然后强奸她.我是最普通的第一种人。
不是因为寂寞才想起你的容颜,而是因为想起你的容颜才会泛起漫漫寂寞。
我坚强,但是我还是会哭,我哭了,我还坚强吗?
性,永远都是暂时的,爱,才是永恒。
夜风更冷,丝丝缕缕的慢慢将人环绕渗透,等到霍然惊醒的时候,才发觉遍体寒意,想要驱赶的时候,才知道,那种冷已经深入骨髓。
一声叹息,为了那个自己熟悉却又陌生的少年,那段或许是很浪漫,结果却又如花开花落,无可奈何的爱情。
花瓣飞舞起来固然浪漫,但是落地成泥的时候,浪漫就变成了无奈。
把这么多的感慨堆砌在一起,有些无谓。那就偶尔挑上一两条对上号好了,清风这厮如是考虑着。
Tags: 言论
生活|我的生活 | 评论:0
| Trackbacks:0
| 阅读:1027
Submitted by on 2007, May 20, 2:52 AM
显示器是迷蒙的,那是它服役太久了。
眼睛是迷蒙的,
那是因为风沙的入侵,因为光线的昏暗,还是其他太多的因为。
心情是迷蒙的,那是因为发生得突然。
未来是迷蒙的,那是因为想的多,做的少。
玩耍的小孩不会迷蒙,那是因为他们不懂的太多,至少不懂生存的艰难。
其实我对自己是很失望的,
三年了,
我就像只笨拙的小猫,
不停的转圈,除了晕眩自己,没有结果。
忘记了怎样进取,忘了怎样说话,忘了怎样活着
但愿迷蒙的今天,明天不会重复着进行。
生活|我的生活 | 评论:0
| Trackbacks:0
| 阅读:985
Submitted by on 2007, May 19, 7:57 PM
$_SERVER["PHP_SELF"] #当前正在执行脚本的文件名,与 document root相关。
$_SERVER["argv"] #传递给该脚本的参数。
$_SERVER["argc"] #包含传递给程序的命令行参数的个数(如果运行在命令行模式)。
$_SERVER["GATEWAY_INTERFACE"] #服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。
$_SERVER["SERVER_NAME"] #当前运行脚本所在服务器主机的名称。
$_SERVER["SERVER_SOFTWARE"] #服务器标识的字串,在响应请求时的头部中给出。
$_SERVER["SERVER_PROTOCOL"] #请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。
$_SERVER["REQUEST_METHOD"] #访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。
$_SERVER["QUERY_STRING"] #查询(query)的字符串。
$_SERVER["DOCUMENT_ROOT"] #当前运行脚本所在的文档根目录。在服务器配置文件中定义。
$_SERVER["HTTP_ACCEPT"] #当前请求的 Accept: 头部的内容。
$_SERVER["HTTP_ACCEPT_CHARSET"] #当前请求的 Accept-Charset: 头部的内容。例如:“iso-8859-1,*,utf-8”。
$_SERVER["HTTP_ACCEPT_ENCODING"] #当前请求的 Accept-Encoding: 头部的内容。例如:“gzip”。
$_SERVER["HTTP_ACCEPT_LANGUAGE"]#当前请求的 Accept-Language: 头部的内容。例如:“en”。
$_SERVER["HTTP_CONNECTION"] #当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。
$_SERVER["HTTP_HOST"] #当前请求的 Host: 头部的内容。
$_SERVER["HTTP_REFERER"] #链接到当前页面的前一页面的 URL 地址。
$_SERVER["HTTP_USER_AGENT"] #当前请求的 User_Agent: 头部的内容。
$_SERVER["REMOTE_ADDR"] #正在浏览当前页面用户的 IP 地址。
$_SERVER["REMOTE_HOST"] #正在浏览当前页面用户的主机名。
$_SERVER["REMOTE_PORT"] #用户连接到服务器时所使用的端口。
$_SERVER["SCRIPT_FILENAME"] #当前执行脚本的绝对路径名。
$_SERVER["SERVER_ADMIN"] #管理员信息
$_SERVER["SERVER_PORT"] #服务器所使用的端口
$_SERVER["SERVER_SIGNATURE"] #包含服务器版本和虚拟主机名的字符串。
$_SERVER["PATH_TRANSLATED"] #当前脚本所在文件系统(不是文档根目录)的基本路径。
$_SERVER["SCRIPT_NAME"] #包含当前脚本的路径。这在页面需要指向自己时非常有用。
$_SERVER["REQUEST_URI"] #访问此页面所需的 URI。例如,“/index.html”。
$_SERVER["PHP_AUTH_USER"] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
$_SERVER["PHP_AUTH_PW"] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
$_SERVER["AUTH_TYPE"] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。
Tags: SERVER
网站|PHP学习 | 评论:0
| Trackbacks:0
| 阅读:964
Submitted by on 2007, May 18, 6:57 PM
Submitted by on 2007, May 12, 6:27 PM
轻型数据库SQLite结合PHP的开发
SQLite是一款轻型的数据库,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,它支持的SQL包括:
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
Create INDEX
Create TABLE
Create TRIGGER
Create VIEW
Delete
DETACH DATABASE
Drop INDEX
Drop TABLE
Drop TRIGGER
Drop VIEW
END TRANSACTION
EXPLAIN
expression
Insert
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
Select
Update
同时它还支持事务处理功能等等。也有人说它象Microsoft的Access,有时候真的觉得有点象,但是事实上它们区别很大。比如SQLite支持跨平台,操作简单,能够使用很多语言直接创建数据库,而不象Access一样需要Office的支持。如果你是个很小型的应用,或者你想做嵌入式开发,没有合适的数据库系统,那么现在你可以考虑使用SQLite。目前它的最新版本是 3.2.2,它的官方网站是:
http://www.sqlite.org,能在上面获得源代码和文档。同时因为数据库结构简单,系统源代码也不是很多,也适合想研究数据库系统开发的专业人士。
现在我们开始简单的介绍,主要我是想讲清楚几个问题,一是如何安装使用,二是如何跟PHP结合开发。
一、安装
1. Windows平台
下载windows下的文件,其实就是一个命令行程序,(下载地址:
http://www.sqlite.org/sqli...),这个命令行程序用来包括生成数据库文件、执行SQL查询、备份数据库等等功能。
下载后比如我们解压缩到 D:\Downloads\sqlite\sqlite-3_2_2 这个目录下,那么我们进入cmd,并且进入该目录:
cd D:\Downloads\sqlite\sqlite-3_2_2
D:\Downloads\sqlite\sqlite-3_2_2>sqlite3 test.db
# 如果test.db不存在,那么就产生一个数据库文件,如果存在就直接使用该数据库文件,相当于mysql中的use
SQLite version 3.2.2
Enter ".help" for instructions
sqlite>
# SQLite的提示符,如果想查看命令帮助输入 .help,在sqlite中所有系统命令都是 . 开头的:
sqlite> .help
.databases List names and files of attached databases
.dump ?TABLE? ... Dump the database in an SQL text format
.echo ON|OFF Turn command echo on or off
.exit Exit this program
.explain ON|OFF Turn output mode suitable for EXPLAIN on or off.
.header(s) ON|OFF Turn display of headers on or off
.help Show this message
.import FILE TABLE Import data from FILE into TABLE
.indices TABLE Show names of all indices on TABLE
.mode MODE ?TABLE? Set output mode where MODE is one of:
csv Comma-separated values
column Left-aligned columns. (See .width)
html HTML <table> code
insert SQL insert statements for TABLE
line One value per line
list Values delimited by .separator string
tabs Tab-separated values
tcl TCL list elements
.nullvalue STRING Print STRING in place of NULL values
.output FILENAME Send output to FILENAME
.output stdout Send output to the screen
.prompt MAIN CONTINUE Replace the standard prompts
.quit Exit this program
.read FILENAME Execute SQL in FILENAME
.schema ?TABLE? Show the Create statements
.separator STRING Change separator used by output mode and .import
.show Show the current values for various settings
.tables ?PATTERN? List names of tables matching a LIKE pattern
.timeout MS Try opening locked tables for MS milliseconds
.width NUM NUM ... Set column widths for "column" mode
sqlite>
# 我们创建一个数据库catlog
sqlite> create table catalog(
...> id integer primarykey,
...> pid integer,
...> name varchar(10) UNIQUE
...> );
sqlite>
# 如果表存在就会提示:
SQL error: table catalog already exists
# 我们创建索引信息
create index catalog_idx on catalog (id asc);
# 我们查看表的信息,看有多少个表
sqlite> .table
aa catalog
# 查看表的结构:
sqlite> .schema catalog
Create TABLE catalog(
id integer primary key,
pid integer,
name varchar(10) UNIQUE
);
Create INDEX catalog_idx on catalog(id asc);
# 给数据表插入一条记录
sqlite> insert into catalog (ppid,name) values ("001","heiyeluren");
# 成功无任何提示,如果表达式错误提示错误信息:
SQL error: near "set": syntax error
# 检索有多少条记录
sqlite> select count(*) from catalog;
1
# 检索搜索记录
sqlite> select * from catalog;
1|1|heiyeluren
反正使用标准的SQL来操作就没有问题,不清楚可以去官方网站上查看帮助信息。另外还要说明的是SQLite不支持修改表结构,如果要修改表结构,只有删除表重新再建立,所以建立表的时候一定要考虑扩展性。估计以后这方面的功能会加强。
2. Linux/Unix 平台
error: 目前还没装过,呵呵,不过估计跟Windows差不多,改天把这部分内容补上。
二、PHP对SQLite的开发
PHP 5开始不再默认支持Mysql,而是默认支持SQLite,可见它的影响力多么大,所以如果你想做SQLite的PHP开发,建议你使用PHP 5.0.0以上版本,我目前使用的是 PHP 5.0.4版本,直接支持SQLite扩展,这里我就不仔细讲如何安装PHP扩展,如果不清楚可以查看PHP相关文档。
这里我主要是讲针对SQLite的开发。目前PHP的主流DB类都支持SQLite的驱动,包括PEAR::DB类、ADOdb类都支持,所以使用DB来来做开发也是个好的选择。
(以下操作为了简便,都是再Windows xp平台进行的)
1. 使用PHP操作已经建立好的sqlite数据库
如果你有一个已经通过sqlite.exe建立好了的数据库和表结构,那么你就能够直接对它进行操作。php中针对sqlite的处理函数比较多,你可以查看PHP手册获得详细信息。
我们使用sqlite_open()函数来打开一个sqlite数据库,它成功返回一个操作资源,失败返回false,那么以后的所有操作都是在这个资源上进行的,执行一个sql查询使用sqlite_query函数。
下面我假设你在当前PHP程序目录下有一个abc.db的sqlite数据库文件,我们对该文件进行操作:
<?php
//打开sqlite数据库
$db = @sqlite_open("abc.db");
//异常处理
if (!$db) die("Connection Sqlite failed.\n");
//添加一个叫做foo的数据库
@sqlite_query($db, "Create TABLE foo (bar varchar(10))");
//插入一条记录
@sqlite_query($db, "Insert INTO foo VALUES ("fnord")");
//检索所有记录
$result = @sqlite_query($db, "select bar from foo");
//打印获取的结果
print_r(sqlite_fetch_array($result));
?>
我们看到的输出结果是:
Array
(
[0] => fnord
[bar] => fnord
)
证明我们代码执行成功,没有输入请检查程序,或者你的数据库文件是否存在。
那么有了这个基本操作,你就能够考虑使用更复杂的操作和SQL来操作它,让它帮你管理信息,你可以做一个留言本,或者做一个CMS系统,我想都是没有问题的。
2. 使用PHP建立数据库并且操作
如果你没有任何sqlite.exe之类的工具,那么你也能够通过php来创建一个sqlite数据库,并且对它进行管理。
其实通过sqlite.exe程序建立的数据库,内容是空的,其实只有后来等创建表,添加数据以后,数据库文件才有,那么我们是不是能够手工添加一个文件,比如一个空的 test.db 文件,并且对它进行操作。这是完全可以,下面我们就使用PHP程序来完成创建一个数据库,并且执行简单的建立数据表,插入数据和检索数据的功能。
首先我们来看代码:(代码比较长,但比较容易理解)
<?php
/**
* 文件:sqlite.php
* 功能:对sqlite数据库的处理
* 作者:heiyeluren
* 时间:2005-8-5
*/
define("LN", __LINE__);//行号
define("FL", __FILE__);//当前文件
define("DEBUG", 0);//调试开关
$db_name = "heiyeluren.db";
//创建数据库文件,文件内容为空
if (!file_exists($db_name)) {
if (!($fp = fopen($db_name, "w+"))) {
exit(error_code(-1, LN));
}
fclose($fp);
}
//打开数据库文件
if (!($db = sqlite_open($db_name))) {
exit(error_code(-2, LN));
}
//产生数据表结构
if (!sqlite_query($db, "Drop TABLE test")) {
exit(error_code(-3, LN));
}
if (!sqlite_query($db, "Create TABLE test (id integer primary key,pid integer,name varchar(10) UNIQUE)")) {
exit(error_code(-3, LN));
}
//插入一条数据
if (!sqlite_query($db, " Insert INTO test (name) VALUES ("heiyeluren") ")) {
exit(error_code(-4, LN));
}
//把数据检索出来
if (!($result = sqlite_query($db, "Select * FROM test"))) {
exit(error_code(-5, LN));
}
//获取检索数据并显示
while ($array = sqlite_fetch_array($result)) {
echo "ID: ". $array[id] ."<br>Name: ". $array[name] ;
}
/* 错误信息代码函数 */
function error_code($code, $line_num, $debug=DEBUG)
{
if ($code<-6 || $code>-1) {
return false;
}
switch($code) {
case -1: $errmsg = "Create database file error.";
break;
case -2: $errmsg = "Open sqlite database file failed.";
break;
case -3: $errmsg = "Create table failed, table already exist.";
break;
case -4: $errmsg = "Insert data failed.";
break;
case -5: $errmsg = "Query database data failed.";
break;
case -6: $errmsg = "Fetch data failed.";
break;
case -7: $errmsg = "";
break;
default: $errmsg = "Unknown error.";
}
$m = "<b>[ Error ]</b><br>File: ". basename(FL) ." <br>Line: ". LN ."<br>Mesg: ". $errmsg ."";
if (!$debug) {
($m = $errmsg);
}
return $m;
}
?>
如果你操作无误的话,那么程序最后输出:
ID: 1
Name: heiyeluren
我们以上的程序包括了比较完整的功能,有调试、异常处理、存取数据库等功能,算是一个简单应用。如果你有兴趣也可以进行扩展。
* 结束:
我们基本的操作就讲到这里,以后有空我会把内容补全。如果大家有兴趣可以去研究一下,也许你的个人主页就需要这样的小型数据库来帮助你。
Tags: SQLite
网站|PHP学习 | 评论:0
| Trackbacks:0
| 阅读:1070
Submitted by on 2007, May 12, 6:07 PM
PHP为什么在主流的应用中总是那么不出色,总是不如.Net/Java,就是因为在PHP处理大型应用的时候,那些不完整的面向对象机制、数据库处理的单一,不通用性等等,影响了PHP做大型应用。
* 作者:heiyeluren
* 时间:2005-8-29
* 联系:heiyeluren_at_gmail.com
一、DPT介绍
PHP为什么在主流的应用中总是那么不出色,总是不如.Net/Java,就是因为在PHP处理大型应用的时候,那些不完整的面向对象机制、数据库处理的单一,不通用性等等,影响了PHP做大型应用。那么,如何来改变这个状况呢?当然就是需要引进一些新的设计方法,把PHP中不健全的面向对象机制完整起来,进行更好的PHP大中型应用的开发。
从Java过来的MVC模式非常流行,而且已经有部分已经引伸进了PHP领域,设计模式的引进,就是为了更好的控制项目开发。今天我要说一种设计模式,类似于MVC,它叫DPT模式。其实有时候我也觉得有点象Java里面的DAO(Data Access Object),不过DAO是夹在业务逻辑层和数据库资源层之间的,而DPT更多的是把业务逻辑也封装在类里,和DAO层在相同的内容中。
D - Data,数据收集层
P - Php,PHP数据调用层
T - Template,模板层
首先,我们要对它进行简单的了解。
Data,就是我们的数据层,它不是数据库抽象类,而是通过数据库接口,执行一些SQL,把数据获取的过程,一般把这种操作封装在类里面,就形成了我们的数据收集层。
Php,就是对我们收集的数据进行整理,规划,同时解析模板进行数据的显示。
Template,模板层,就是我们的HTML页,里面不包含任何PHP代码,只有模板标签的内容,通过它来控制数据在页面中有格式的显示。
我们这里三层中,每一层都是鼓励由一个人来开发,然后通过PHPDoc之类的工具,把源代码中的API生成文档,由P层的人进行调用。
那么,在实际的项目开发中,它是怎么运作的呢,我们又如何把这种设计模式引进我们的项目中呢?
我们下面将运用一个实际的项目来讲解DPT模式。阅读一下内容必须具备基本的PHP4的面向对象编程、数据库抽象类、模板等知识。
我们目前为了加速PHP的开发,都使用PHP封装了部分功能,比如数据库操作抽象类,模板类等等,这些都是为了开发复杂应用而应运而生的。目前比较主流的数据库抽象类有phplib db、PEAR::DB、ADODB等等,模板处理类有phplib template、smartTemplate、Smarty等等。本文中都是使用PHP Group推荐的产品,数据口抽象类使用PEAR::DB,模板处理类使用Smarty,如果对这两个类库不熟悉的读者,请参考文章后面的链接。
二、项目体系结构
下面我们来构建我们基于DPT模式的PHP应用。(以下部分内容参考《MVC模式、类封装还是黑客代码》)
文件目录结构(只涉及到关键的目录)
class 类库,包含所有的数据收集层
template 模板文件存放目录
include 常用库,包括PEAR、Smarty等类库,同时还有自己定义的基本函数
config.inc.php 基本配置文件,包括数据库配置,其他基本信息配置
security.inc.php 安全处理页,主要多传递的变量进行处理
init.inc.php
error.php 错误处理页
class目录中存放了我们数据收集层中的内容,一般的建议是每个类文件只是针对一个表进行操作,比如cmsMessage.class.php,那么这个类就是属于功能CMS里面的,只负责操作Message这个表。所有的数据库交互和操作都是封装在类里的,在P层不允许出现任何直接操作数据库的语句。
template目录中存放了我们的网页模板,模板中都是使用Smarty标签进行排列的,同时,在模板中,都是建议使用JS+CSS来控制页面,模板中只有DIV标签来简单的排版,这样,非常利于网站改版和更换皮肤。
include目录就是对常用文件的包含,比如PEAR::DB类、Smarty类库文件等。config.inc.php就是基本的配置文件,包括数据库、基本常量等等,security.inc.php是安全处理页,我们这里主要是做一个变量的安全检查,下面内容我们将仔细介绍。init.inc.php是一个初始化操作的页面,包括初始化数据库链接,实例化模板处理类等等操作,error.php是错误信息处理页,所有的错误信息通过URL编码后转到该页。
三、项目基本配置代码
关键页代码实例:
/**
* config.inc.php
* 配置文件
*/
/* 数据库配置 */
define("DB_HOST", "localhost"); //数据库主机
define("DB_USER", "root"); //数据库链接用户
define("DB_PASS", ""); //连接密码
define("DB_NAME", "cms"); //默认数据库
define("DB_PORT", "3306"); //数据库端口
define("DB_TYPE", "mysql"); //数据库类型
define("DB_OPT", "1"); //是否长期链接
/* 模板信息配置 */
define("TPL_TEMPLATE_DIR", "./template/"); //模板目录
define("TPL_COMPILE_DIR", "./template/templates_c/"); //模板编译目录
define("TPL_CONFIGS_DIR", "./template/configs/"); //模板配置文件目录
define("TPL_CACHE_DIR", "./template/cache/"); //模板缓存目录
define("TPL_LIFTTIME", "1"); //缓存时间
define("TPL_CACHEING", "true"); //是否缓存
define("TPL_LEFT_DELIMITER", "{"); //左边界符
define("TPL_RIGHT_DELIMITER", "}"); //右边界符
/* 网站路径配置 */
define("ROOT_PATH", dirname(__FILE__)); //网站所在根目录
define("URL_PATH", dirname($_SERVER[PHP_SELF])); //网站URL地址路径
define("DB_PATH", ROOT_PATH."/include/db"); //PEAR::DB目录
define("TPL_PATH", ROOT_PATH."/include/smarty"); //Smarty目录
/**
* security.inc.php
* 安全过滤文件
*/
/* 过滤规则 */
$arr_filtrate = array(""", """, "\");
/* 过滤函数 */
function var_filtrate($var)
{
global $arr_filtrate;
foreach ($arr_filtrate as $value)
{
if (eregi($var, $value)) {
return true;
}
return false;
}
}
/* 获取不同版本下的GET和POST数组 */
if (phpversion() < "4.1.0") {
$get = &$HTTP_GET_VARS;
$post = &$HTTP_POST_VARS;
} else {
$get = &$_GET;
$post = &$_POST;
}
/* 检查GET变量 */
if (count($get)) {
foreach ($post as $get_var) {
if (var_filtrate($get_var)) {
exit("Commit get parameter falsity");
}
}
}
/* 检查POST变量 */
if (count($post)) {
foreach ($post as $post_var) {
if (var_filtrate($post_var)) {
exit("Commit post parameter falsity");
}
}
}
其实,以上过滤的方法也不是最好的,建议参考我的另两篇防注入文章获取更好的方法,链接参考附录。
/**
* error.php
* 错误处理页面
*/
if (!isset($get[msg])) {
exit("Not commit parameter");
}
echo "Error Message: ". $get[msg];
echo "<p><a href="javascript:history.back()">返回上一页</a>";
就是一些错误处理的作用,一般出的GET方式传递过来的消息都是经过urlencode()过的字符。
/*
* init.inc.php
* 初始化程序
*/
require_once(dirname(__FILE__)."config.inc.php");
require_once(ROOT_PATH."security.inc.php");
require_once(DB_PATH."DB.php");
require_once(TPL_PATH."Smarty.class.php");
/* 初始化数据库链接 */
$db = DB::connect("DB_TYPE://DB_USER@DB_PASS:DB_HOST/DB_NAME", DB_OPT);
if (DB::isErro($db)) {
return $dg->getMessage();
}
$tpl = &new Smarty();
/* 初始化模板 */
$tpl->templates_dir = TPL_TEMPLATE_DIR;
$tpl->compile_dir = TPL_COMPILE_DIR;
$tpl->cache_dir = TPL_CACHE_DIR;
$tpl->configs = TPL_CONFIGS_DIR;
$tpl->lifetime = TPL_LIFTTIME;
$tpl->caching = TPL_CACHEING;
$tpl->left_delimiter = TPL_LEFT_DELIMITER;
$tpl->right_delimiter = TPL_RIGHT_DELIMITER;
基本文件描述完毕。代码写了不少,只是为了更好的理解这个模式。
四、框架实际开发
说明:
我们以下项目代码都是以cms数据库中topic表做例子,代码只是为了演示框架结构,没有对代码进行测试,不保证能够正常运行。
topic的表结构:
Create TABLE `topic` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(255) NOT NULL default "",
`addtime` int(11) default NULL,
`author` varchar(50) default NULL,
`type` int(11) default NULL,
`option` int(11) default NULL,
PRIMARY KEY (`id`),
KEY `id` (`id`)
);
(一)Data层:数据采集层
Data层主要就是针对数据库的所有操作都封装起来,然后通过接口的形式提供给Php层进行调用,同时在Data层里也封装了一些原始的数据库操作(类似于Java中的DAO)。一般Data层都是类的形式,保存在我们上面的 /class目录下,一般的准则是一个类文件操作一个数据表,就是说不管具体的业务逻辑如何,所有的数据表操作都是封装在一个类文件里的。比如说我们有一个数据表叫做topic,那么我们对应操作的类文件就是:topic.class.php。其实这里是可以做扩展的,比如说,我们的项目非常庞大,有很多内容,比如包括有CMS、Blog、BBS等等,那么我们就必须给每一个栏目分配一个数据库,那么针对当前操作数据库的话,就使用类中封装的链接方法进行链接,就可以抛弃我们上面init.inc.php中初始化的操作,而操作在类里面进行的链接。
假设我们目前操作的栏目是CMS系统,数据库名叫做cms,那么我们下面构造一个操作cms数据库里面的topic表的类来。
/**
* cms_topic.class.php
* 文章处理类
*/
class cmsTopic
{
var cmsDBName; //数据库名
var cTableName; //当前操作的表名
var cDsn; //数据链接源
var cDebug; //是否打开调试,1为是,0为否
var cDbPointer //链接资源
var cfetchMode //获取数据库资料的方式
var cEncode //数据库中数据保存的编码格式,默认是UTF-8
/* 构造函数 */
function cmsTopic()
{
//配置信息从config.inc.php中设置
$this->cfetchMode = DB_FETCHMODE_DEFAULT;
$this->cTableName = "topic";
$this->cDsn = "mysql://".
DB_USER.":".
DB_PASS."@".
DB_HOST."/".
DB_NAME;
$this->cEncode = "utf8";
}
/* 链接数据库 */
function connectDatabase()
{
if (!is_object($cDbPointer))
{
$this->cDbPointer = DB::connect($this->cDsn);
if ($this->cEncode=="utf8") {
$this->cDbPointer->query("set names "utf8"");
}
$this->cDbPointer->setFetchMode($this->cfetchMode);
if (DB::isError($this->cDbPointer)) {
return false;
}
return $this->cDbPointer;
}
}
/* 关闭数据库连接 */
function closeDatabase()
{
if (is_object($this->cDbPointer)) {
$this->cDbPointer->disconnect();
}
}
/*--------------- 数据库基本操作 --------------*/
/* 插入操作 */
function insert($arr)
{
if(!is_array($arr) || count($arr) == 0){
return false;
}
if("" == $this->cTableName) return false;
$db = $this->connectDatabase();
$res = $db->autoExecute($this->cTableName,$arr,DB_AUTOQUERY_Insert);
if(DB::isError($res)){
return $res;
}else{
$insertId = ($db->getOne("select LAST_Insert_ID();"));
if($insertId>0) {
return $insertId;
} else {
return true;
}
}
}
/* 更新操作 */
function update($id,$arr)
{
if("" != $id && !(is_array($arr))){
return false;
}
$db = $this->connectDatabase();
$res = $db->autoExecute($this->cTableName,$arr,DB_AUTOQUERY_Update,"id = "$id"");
if(DB::isError($res)){
return false;
}else{
return true;
}
}
/* 删除操作 */
function delete($id)
{
$db = $this->connectDatabase();
$res = $db->query("Delete FROM ".$this->cTableName." Where id = "$id"");
if(DB::isError($res)){
return false;
}else{
return true;
}
}
}
上面的代码一个很基本的针对一个表操作的类雏形已经描述出来了,包括连接数据库,基本的数据库原始操作都有了。你肯定会问,为什么没有把select的操作封装进去?主要是因为select是SQL里最复杂的操作,不可能写那么通用的一个方法去操作它,所以好不如不写,自由发挥。
那么我们需要加上一些基本的功能呢?比如读取内容、新增加一篇文章等操作,那么我们还必须在类里面添加一些方法,比如我们增加提取一篇文章内容、提取指定时间的文章、提取指定类别的文章、统计目前所有文章的总数等操作。
/**
* cms_topic.class.php
* 文章类增强
*/
class cmsTopic
{
// ...上面已经描述的方法省略
/**
* 函数: getTopicContentById()
* 功能: 获取指定ID的文章的内容
* 参数: $id 指定要获取的ID
* $cols 要提取的字段值
* 返回: 成功返回数据集数组,失败返回错误信息
*/
function getTopicContentById($id, $cols="*")
{
$db = $this->connectDatabase($this->cDsn);
$sql = "Select $cols FROM ". $this->cTableName ." Where id = "$id"";
$result = $db->getAll($sql);
if (DB::isError($result)) {
return $result->getMessage();
} else {
$db->disconnect();
return $result;
}
}
/**
* 函数: getTopicBySpecifyTime()
* 功能: 获取指定时间的文章的列表
* 参数: $startTime 指定开始时间
* $endTime 结束时间
* $cols 要提取的字段值
* 返回: 成功返回数据集数组,失败返回错误信息
*/
function getTopicBySpecifyTime($startTime=0, $endTime=0, $cols="*")
{
$db = $this->connectDatabase($this->cDsn);
$start = ($startTime == 0) ? "" : "Where addtime > $startTime";
$end = ($endTime == 0) ? "" : "AND addtime < $startTime";
$sql = "Select $cols FROM ". $this->cTableName ." ".$start ." ".$end;
$result = $db->getAll($sql);
if (DB::isError($result)) {
return $result->getMessage();
} else {
$db->disconnect();
return $result;
}
}
/**
* 函数: getTopicByType()
* 功能: 获取指定类别的文章的列表
* 参数: $type 指定的类型
* $cols 要提取的字段值
* 返回: 成功返回数据集数组,失败返回错误信息
*/
function getTopicByType($type, $cols="*")
{
$db = $this->connectDatabase($this->cDsn);
$sql = "Select $cols FROM ". $this->cTableName ." Where type = "$type"";
$result = $db->getAll($sql);
if (DB::isError($result)) {
return $result->getMessage();
} else {
$db->disconnect();
return $result;
}
}
/**
* 函数: getTopicSum()
* 功能: 获取所有文章总数,如果指定类别,则获取指定类别总数
* 参数: $type 指定的类型
* 返回: 成功返回获取的总数,失败返回错误信息
*/
function getTopicSum($type="")
{
$db = $this->connectDatabase($this->cDsn);
$typeStr = ($type == "") ? "" : " Where type = "$type"";
$sql = "Select count(id) FROM ". $this->cTableName ." ".$typeStr;
$result = $db->getOne($sql);
if (DB::isError($result)) {
return $result->getMessage();
} else {
$db->disconnect();
return $result;
}
}
}
上面我们构造了一些数据提取类,这应该就是我们Data层的核心了。写方法的时候要尽量考虑到扩展性,比如对列的提取,比如一个方法适合多种情况,比如排序等等,考虑的越多,以后维护起来就比较容易,当然,我推荐的方法是一个方法尽量就做一件事情,如果一个函数要做多个事情,那么就写成多个函数,这样便于代码重用和维护性,我个人认为一个方法最用不要超过100行。
如果函数中有涉及到数据库的操作,一定记得结尾的时候把数据关闭掉,不然很容易把服务器资源占用光。当然,你也可以在PHP层去关闭连接。比如,你需要很多次调用同一个方法,那么这个方法如果反复的连接数据库又关闭数据库,也很浪费资源,而且速度慢,这个时候就可以把关闭数据库的操作在Php层进行关闭,你可以先构造好一个方法来进行,比如我们上面的 closeDatabase() 方法。
(二)Php层:数据调用层
PHP层主要就是把从Data层收集的数据再这一层进行调用。因为我们基本的原则就是把所有跟数据库的操作都封装在Data层里,在其他层都不涉及到任何的直接对数据库的操作,这样能够进行良好的封装,这样有点类似于 JSP和Javabean,Javabean的类负责和数据库交互,JSP负责调用Javabean来输出数据。我们这里的PHP层就相当于JSP层,前面的Data层就相当于Javabean层,这样玻璃他们之间的耦合度,能够方便程序日后的维护。
我们这里的PHP层主要就是复杂从数据库种提取数据,完成一些简单的逻辑,然后把数据输出到Template(模板层)。现在我们利用示例代码来看看PHP层是如何调用Data层的数据的。
/**
* topic_list.php
* 文章列表程序
*/
/* 包含基本文件 */
require_once("init.inc.php");
require_once("class/cms_topic.class.php");
//实例化Data层对象
$topic = new cmsTopic();
//获取文章类型变量
$topicType = intval(get("type"));
//从Data层中把数据提取过来
$topicList = getTopicByType($topicType);
//给模板变量赋值后输出页
$tpl->assign("topic", $topicList);
$tpl->assign("topic.html");
代码是不是很简单?就是把数据获取过来,然后解析到模板层中去处理,所以这样如果以后出现问题改起来比较容易,比如是数据获取的问题,那么直接改上面的类文件就行,如果是模板显示的问题,那么直接修改模板层中的对应的模板页就可以,非常便于维护。
(三)Template层:模板层
这个模板层就是我们常说的网页了,不过这里就是包含了一些Smarty的模板变量和HTML混和,模板页处理的时候就对页面中的模板变量进行替换,最后我们看到的结果就是模板页和PHP层中的程序输出混和的结果。
一般模板页设计的时候,最好遵循Web标准,就是说尽量在页面中不使用表格等html标签来控制页面,而是使用div层来存放数据,使用css样式表来控制页面布局,这样对包括JavaScript脚本的编写,以后页面的改版等等非常有好处。而且如果要还模板也很简单,只需要把css文件替换就可以达到效果。当然,如果对web标准不了解,那么建议去阅读一下《网站重构》这本书。
我们下面就简单的描述一下Template(模板层)的代码是如何的。
{* 加载头部文件 *}
{include file="header.html"}
{* 模板主体 *}
<div>
{* 左边导航条 *}
</div>
<div>
<h3>文章列表</h3>
{section name=topicList loop=$topic}
标题:<a href="">{$topic[topicList].title|escape:"html"|truncate:30:"...":true}</a> |
时间:{$topic[topicList].addtime|date_format:"%Y年%m月%d日"} |
作者:{$topic[topicList].author|escape:"html"}<br />
{sectionelse}
暂时没有任何文章
{/section}
</div>
{* 加载底部文件 *}
{include file="foot.html"}
模板页中大致可能有一些JavaScript程序,或者有样式文件,一般使用样式文件来控制页面的布局和显示效果。我们这里没有详细的描述,在实际项目中可以由网页制作人员去负责。
五、使用DPT模式的项目规划
一般在所有的软件项目或者是网站项目中,要保证一个项目能够顺利完整的完成,那么便需要技术主管或者架构师良好的设计和管理。一般所有项目中人是最难控制的因素,你可以把项目指定的非常完善,架构可以选择的非常合理,但是你不能控制人的因素,不能保证项目的中的某个成员可能在任何时候离开项目。当在PHP项目中,如果一个项目角色忽然的离去,可能导致项目要停顿,要重新找人来接替,影响了项目的进度,那么如何有效的控制和解决这些问题。
在一个使用DPT设计模式的项目中,项目中个个角色分别有网页设计师、网页制作人员、客户端脚本JavaScript程序员、服务器端PHP程序员。他们的分工都是什么呢?网页设计师负责设计网页的界面,生成效果图,然后由网页制作人员去做成网页,当然,如果是遵循Web标准的项目的话,那么网页制作人员主要的任务就是负责页面布局样式的编写。客户端程序员主要是负责客户端脚本的编写,比如针对页面中需要使用的JavaScript进行编写,PHP程序员主要是负责我们上面Data & PHP & Template 三层的代码编写,当然,如果项目足够庞大,完全可以拆分出来,有PHP程序员负责Data层,有PHP程序员负责Php和Template层,分工清晰,Php层程序员只是需要调用Data层程序员已经写好的类库进行调用,不用关心类是如何实现的。
这样一个项目架构下来,可以按照任务需要来安排某个模块的人的数量,最大限度的把项目规划好。当然,项目中一些必要的因素是要考虑的,比如,如何让网页制作人员、客户端脚本程序员和PHP程序员良好的合作,那么就是分离他们的责任,比如,模板页必须由PHP程序员来编写,然后提交给JavaScript程序员制作客户端脚本,最后再由网页制作人员通过CSS来控制布局,那么Php程序员在模板页中就必须使用div等标签来定义一个块的数据,如果任何一块出了问题,那么对应找相应责任人,就能够很好的避免彼此推卸责任,或者权责不分的情况,这样有利于管理,也有利于每个开发成员之间的良好合作。
为了防止项目失控,或者不会因为项目成员的离开而影响项目的进度和管理,必须有相应的方法和规则。我们主要针对PHP程序员来进行描述,部分方法同样适用于网页制作人员和客户端脚本程序员。
(1)编码规范
项目开发中为了便于维护和以后其他人接手代码,必须统一编码规范,包括对目录、文件名、类、函数、变量、注释等等都必须遵循标准,而且为了代码的维护,必须要求PHP程序员编写注释。目前基本遵循的是Fredrik Kristiansen写的《PHP 编码规范》,或者是PEAR中代码的规范。
如果代码为了做成接口,或者需要做成参考的文档方便以后维护代码,使用phpDoc等工具,那么为了能够使用PEAR包中的phpDoc能够正常识别,所以一般建议遵循PEAR包的规范,主要是DPT模式中Data层中类的的编码必须规范。
PEAR中pear.php中基类的部分代码:
class PEAR
{
/* 属性的描述 */
// {{{ properties
/**
* Whether to enable internal debug messages.
*
* @var bool
* @access private
*/
var $_debug = false;
//其他属性省略...
// }}}
/* 对方法的描述 */
// {{{ constructor
/**
* Constructor. Registers this object in
* $_PEAR_destructor_object_list for destructor emulation if a
* destructor object exists.
*
* @param string $error_class (optional) which class to use for
* error objects, defaults to PEAR_Error.
* @access public
* @return void
*/
function PEAR($error_class = null)
{
//方法内部代码省略...
}
// }}}
}
对于上面内部标签的解释请参考文章结尾链接中的《php Documentor 1.2.2 使用说明规范》
(2)单元测试
单元测试是对程序进行的第一步测试,并且是程序员自己做的测试,没有谁比自己更了解自己写的代码,所以单元测试对保证程序的稳定性尤为重要。所以一般项目中,特别是写类库的程序员,一定要对自己写的代码进行单元测试,只要保证数据能够稳定的获取,才能保证Php层的程序员能够正确的获取数据。针对PHP的单元测试工具目前有SimpleTest和PEAR包中的phpUnit/phpUnit2,phpUnit2是针对PHP 5的测试工具,这个可以按照项目的实际情况来决定使用什么测试工具。SimpleTest和phpUnit的使用参考文章请参考文章最后的链接。
(3)程序安全
在今天这个黑客横行,SQL Injection泛滥的时候,为了保证程序能够正确完整的运行,那么就必须要求程序员对自己的程序进行安全的编码。
主要是两方面,一方面是服务器端的安全,主要就是要过滤用户提交的变量,记得网络上流行的一句话:“不要相信用户提交的任何数据”,因为你不能保证这个用户是恶意的还是善意,是普通用户还是黑客,所以不管是谁,一定要过滤掉它的变量,不过是通过GET方式还是POST方式过来的数据,统统过滤。主要是过滤一些特殊自如,比如/""等等,保证服务器和数据的安全。
另一方面就是针对客户端的威胁,比如提交一些恶意的JavaScript代码,当普通用户查看该页的时候,那么将给对方带来影响或者伤害,那么会极大的影响网站或者软件的声誉,这是要避免的。同样的,这个也是要良好的过滤变量,如果无法在用户提交数据的时候过滤,那么就在显示输出的时候进行过滤,主要是过滤一些HTML标签和JavaScript代码,保证客户浏览的安全。
关于一些基本的安全问题可以参考文章后面的链接。
(4)代码同步(版本管理)
但一个项目是多人开发的时候,那么代码同步或者说是版本管理就尤为重要,因为为了保证每个开发成员的代码都是最新的,最稳定的,那么必须要使用CVS等版本管理工具,当然,你想使用VSS也无可厚非。一般建议是专门使用一台服务器来供所有开发人员开发,不建议把代码保存在开发人员的本地上,因为大部分人都是使用Windows等操作系统,如果发生病毒感染、设备损坏或者其他因素,那么代码将壮烈牺牲,这样造成又要重复开发的浪费,如果把代码直接存放在服务器上,一般服务器安装都是Unix/Linux系统,能够基本保证代码的安全和完整。
CVS的安装使用文章可以参考文章最后的链接。
(5)多模块通信
如果项目足够庞大,门户级的应用,那么肯定涉及到多栏目/模块之间的通信
六、结束语
DPT模式也许在很多项目中你已经应用了,只是没有认证的进行定义,如果阅读本文能够获得同感,或者恍然大悟乃至垂手顿足,那么我想本文就给了你一定帮助,这就足够了。
写作文章前前后后花了快一个月,只是一直太懒惰,怕的写的不好,怕这个东西出来没有意义。。。但是不管如何,还是写出来了。
如果可能,尝试考虑把你的PHP应用移植到PHP5上,也许,那才是你需要的。
Writer by heiyeluren <heiyeluren_AT_gmail.com>
2005年8月29日 下午 17:38
>>>>>> 附录:(文章相应链接)<<<<<<
PEAR
http://pear.php.net
Smarty
http://smarty.php.net
phpUnit
http://phpunit.sourceforge...
SimpleTest
http://simpletest.sourcefo... |
http://www.lastcraft.com/s...
phpDocumentor
http://www.phpdoc.org
《PEAR:创建中间的数据库应用层》
http://www-128.ibm.com/dev...
《模板引擎SMARTY》
http://www-128.ibm.com/dev...
《MVC模式、类封装还是黑客代码》
http://www-128.ibm.com/dev...
《PHP中的代码安全和SQL Injection防范》
http://blog.csdn.net/heiye...
《在PHP中使用SimpleTest进行单元测试》
http://www.hsboy.com/blog/...
《用phpUnit帮你调试php程序》
http://www.ccw.com.cn/htm/...
《php Documentor 1.2.2 使用说明规范》
http://www.phpx.com/happy/...
《PEAR:使用PHPDoc轻松建立你的PEAR文档》
http://www-128.ibm.com/dev...
《PHP 编码规范》
http://www.phpe.net/html/p...
《CVS使用手册》
http://www.chedong.com/tec...
Tags: MVC, 设计模式, DPT
网站|PHP学习 | 评论:0
| Trackbacks:0
| 阅读:1207
Submitted by on 2007, May 12, 1:10 PM
一些比较常用属性
font 字体
color 颜色
font-size 字体大小
text-align 文本位置
background 背景
margin 外补丁
padding 内补丁
border 边框
float 布局
下边是实例
CSS布局常用的方法:float:none|left|right
取值:
none:?默认值。对象不飘浮
left:?文本流向对象的右边
right:?文本流向对象的左边
它是怎样工作的,看个一行两列的例子
xhtml代码:
<div id="wrap">
<div id="column1">这里是第一列</div>
<div id="column2">这里是第二列</div>
<div class="clear"></div> /*这是违背web标准意图的,只是想说明在它下面的元素需要清除浮动*/
</div>
CSS代码:
#wrap{width:100;height:auto;}
#column1{float:left;width:40;}
#column2{float:right;width:60;}
.clear{clear:both;}
position:static|absolute|fixed|relative
取值:
static:?默认值。无特殊定位,对象遵循HTML定位规则
absolute:?将对象从文档流中拖出,使用left,right,top,bottom等属性相对于其最接近的一个最有定位设置的父对象进行绝对定位。如果不存在这样的父对象,则依据body对象。而其层叠通过z-index属性定义
fixed:?未支持。对象定位遵从绝对(absolute)方式。但是要遵守一些规范
relative:?对象不可层叠,但将依据left,right,top,bottom等属性在正常文档流中偏移位置
它来实现一行两列的例子
xhtml代码:
<div id="wrap">
<div id="column1">这里是第一列</div>
<div id="column2">这里是第二列</div>
</div>
CSS代码:
#wrap{position:relative;/*相对定位*/width:770px;}
#column1{position:absolute;top:0;left:0;width:300px;}
#column2{position:absolute;top:0;right:0;width:470px;}
他们的区别在哪?
显然,float是相对定位的,会随着浏览器的大小和分辨率的变化而改变,而position就不行了,所以一般情况下还是float布局!
CSS常用布局实例
单行一列
body{margin:0px;padding:0px;text-align:center;}
#content{margin-left:auto;margin-right:auto;width:400px;}
两行一列
body{margin:0px;padding:0px;text-align:center;}
#content-top{margin-left:auto;margin-right:auto;width:400px;}
#content-end{margin-left:auto;margin-right:auto;width:400px;}
三行一列
body{margin:0px;padding:0px;text-align:center;}
#content-top{margin-left:auto;margin-right:auto;width:400px;width:370px;}
#content-mid{margin-left:auto;margin-right:auto;width:400px;}
#content-end{margin-left:auto;margin-right:auto;width:400px;}
单行两列
#bodycenter{width:700px;margin-right:auto;margin-left:auto;overflow:auto;}
#bodycenter#dv1{float:left;width:280px;}
#bodycenter#dv2{float:right;width:420px;}
两行两列
#header{width:700px;margin-right:auto;margin-left:auto;overflow:auto;}
#bodycenter{width:700px;margin-right:auto;margin-left:auto;overflow:auto;}
#bodycenter#dv1{float:left;width:280px;}
#bodycenter#dv2{float:right;width:420px;}
三行两列
#header{width:700px;margin-right:auto;margin-left:auto;}
#bodycenter{width:700px;margin-right:auto;margin-left:auto;}
#bodycenter#dv1{float:left;width:280px;}
#bodycenter#dv2{float:right;width:420px;}
#footer{width:700px;margin-right:auto;margin-left:auto;overflow:auto;clear:both;}
单行三列
绝对定位
#left{position:absolute;top:0px;left:0px;width:120px;}
#middle{margin:0px190px0px190px;}
#right{position:absolute;top:0px;right:0px;width:120px;}
float定位
xhtml代码:
<div id="wrap">
<div id="column">
<div id="column1">这里是第一列</div>
<div id="column2">这里是第二列</div>
<div class="clear"></div>/*用法web标准不建议,但是记住下面元素需要清除浮动*/
</div>
<divid="column3">这里是第三列</div>
<divclass="clear"></div>/*用法web标准不建议,但是记住下面元素需要清除浮动*/
</div>
CSS代码:
#wrap{width:100;height:auto;}
#column{float:left;width:60;}
#column1{float:left;width:30;}
#column2{float:right;width:30;}
#column3{float:right;width:40;}
.clear{clear:both;}
float定位二
xhtml代码:
<div id="center"class="column">
<h1>Thisisthemaincontent.</h1>
</div>
<div id="left"class="column">
<h2>Thisistheleftsidebar.</h2>
</div>
<div id="right"class="column">
<h2>Thisistherightsidebar.</h2>
</div>
CSS代码:
body{
margin:0;
padding-left:200px;/*LCfullwidth*/
padding-right:190px;/*RCfullwidth CCpadding*/
min-width:200px;/*LCfullwidth CCpadding*/
}
.column{
position:relative;
float:left;
}
#center{
width:100;
}
#left{
width:200px;/*LCwidth*/
right:200px;/*LCfullwidth*/
margin-left:-100;
}
#right{
width:190px;/*RCwidth*/
margin-right:-100;
}
写一些比较简单的,这些应该多去实践才会真正的掌握
我写的这个
xhtml代码:
<div id="enter"><a href="
http://www.tsingfeng.com&a...清风徐来</a></div>
<div id="ziuotext">时光一逝永不回,往事只能回味.<br />忆童年时竹马青梅,两小无猜日夜相随.<br />春风又吹红了花蕊,你已经也添了新岁.<br />你就要变心像时光难倒回,我只有在梦里想依偎.</div>
<div id="copyright">Powered By <a href="/">Tsingfeng.com</a> CopyRight 2005-2007 <a href="
http://www.miibeian.gov.cn... target="_blank">苏ICP备000000号</a></div>
CSS代码:
body {background-color:#FFFFFF;margin: 0px;text-align:center;line-height:150%;font-size:12px;color:#AA0000;font-family:"宋体"}
#enter{;font-size:20px;font-family:Impact;margin-top:100px;}
#enter a{font-size:36px;color:#AA0000; text-decoration:none}
#enter a:hover{color:#FFFFFF; background:#AA0000; padding:2px;}
#ziuotext{margin-top:30px;}
#copyright{margin-top:50px;}
a{color:#AA0000; text-decoration:none}
a:hover{color:#FFFFFF; background:#AA0000; padding:2px;}
主要用到的是
padding与
margin
一些常用的css 命名
页头:header
登录条:loginbar
标志:logo
侧栏:sidebar
广告:banner
导航:nav
子导航:subnav
菜单:menu
子菜单:submenu
搜索:search
滚动:scroll
页面主体:main
内容:content
标签页:tab
文章列表:list
提示信息:msg
小技巧:tips
栏目标题:title
加入:joinus
指南:guild
服务:service
热点:hot
新闻:news
下载:download
注册:regsiter
状态:status
按钮:btn
投票:vote
合作伙伴:partner
友情链接:friendlink
页脚:footer
版权:copyright
CSS ID 的命名
外 套: wrap
主导航: mainnav
子导航: subnav
页 脚: footer
整个页面: content
页 眉: header
页 脚: footer
商 标: label
标 题: title
主导航: mainbav(globalnav)
顶导航: topnav
边导航: sidebar
左导航: leftsidebar
右导航: rightsidebar
旗 志: logo
标 语: banner
菜单内容1: menu1content
菜单容量: menucontainer
子菜单: submenu
边导航图标:sidebarIcon
注释: note
面包屑: breadcrumb(即页面所处位置导航提示)
容器: container
内容: content
搜索: search
登陆: Login
功能区: shop(如购物车,收银台)
当前的 current
在编辑样式表时可用的注释可这样写
<-- Footer -->
内容区
<-- End Footer -->
样式文件命名
主要的 master.css
布局,版面 layout.css
专栏 columns.css
文字 font.css
打印样式 print.css
主题 themes.css
网站常用中英文对照表
网站导航 Site Map
公司简介 Profile or Company Profile or Company
公司设备 Equipment Equipment
公司荣誉 Glories Glories
企业文化 Culture Culture
产品展示 Product Product
资质认证 Quality Certification
企业规模 Scale Scale
营销网络 Sales Network
组织机构 organization organization
合作加盟 Join In Cooperation
技术力量 Technology Technology
经理致辞 Manager`s oration
发展历程 Development History
工程案例 Engineering Projects
业务范围 Business Scope
分支机构 Branches
供求信息 Supply & Demand
经营理念 Operation Principle
产品销售 Sales Sales
联系我们 Contact Us Contact Us
信息发布 Information Information
返回首页 Homepage Homepage
产品定购 order order
分类浏览 Browse By Category
电子商务 E-business
公司实力 Strength Strength
版权所有 Copy Right
友情连结 Hot Link
应用领域 Application Fields
人力资源 Human Resource Hr
领导致辞 Leader`s oration
企业资质 Enterprise Qualification
行业新闻 Trade News
行业动态 Trends
客户留言 Customer Message
客户服务 Customer Service
新闻动态 News & Trends
公司名称 Company Name
销售热线 Sales Hot-Line
联系人 Contact Person
您的要求 Your Requirements
建设中 In Construction
证书 Certificate Certificate
地址 ADD Add
邮编 Postal Code Zipcode
电话 TEL Tel
传真 FAX Fax
产品名称 Product Name
产品说明 Description Description
价格 Price
品牌 Brand
规格 Specification
尺寸 Size
生产厂家 Manufacuturer Manufacturer
型号 Model
产品标号 Item No.
技术指标 Technique Data
产品描述 Description
产地 Production Place
销售信息 Sales Information
用途 Application
论坛 Forum
在线订购 On-line order
招商 Enterprise-establishing
招标 Bid Inviting
综述 General
业绩 Achievements
招聘 Join Us
求贤纳士 Join Us
大事 Great Event
动态 Trends
服务 Service
投资 Investment
行业 Industry
规划 Programming
环境 Environment
发送 Delivery
提交 Submit
重写 Reset
登录 Enter
注册 Login
社区 Community
业务介绍 Business Introduction
在线调查 Online Inquiry Inquiry
下载中心 Download
会员登陆 Member Entrance
意见反馈 Feedback
常见问题 FAQ
中心概况 General Profile
教育培训 Education & Training
游乐园 Amusement Park
在线交流 Online Communication
专题报道 Special Report
Tags: div, css, div命名, css命名
网页|前台相关 | 评论:0
| Trackbacks:0
| 阅读:1537
Submitted by on 2007, May 4, 12:43 PM
1,在函数中,传递数组时
使用 return 比使用 global 要高效
比如
function userloginfo($usertemp){
$detail=explode("│",$usertemp);
return $detail;
}
$login=userloginfo($userdb);
比
function userloginfo($usertemp){
global $detail;
$detail=explode("│",$usertemp);
}
userloginfo($userdb);
要高效
2,(这个代码用于得到程序目录对应的网址,推荐使用)
$urlarray=explode("/",$HTTP_SERVER_VARS["REQUEST_URI"]);
$urlcount=count($urlarray);unset($urlarray[$urlcount-1]);
$ofstarurl="
http://".$HTTP_SER...["HTTP_HOST"].implode("/",$urlarray);
这段代码比
$pre_urlarray=explode("/",$HTTP_SERVER_VARS["HTTP_REFERER"]);
$pre_url=array_pop($pre_urlarray);
要高效
3,在循环中判断时,数值判断使用恒等要比等于高效
$a=2;$b=2;
比如
if($a==$b)$c=$a;
比
if($a===$b)$c=$a;
高效
4,mysql 查询时尽量使用where in 少用 limit
limit查多记录的前几条, 速度很快, 但是查询最面几条就会慢
使用in .在查询连续性记录,非常快, 非连续性记录第一次运行会稍微慢一点,但是之后将比较快!
5,NT服务器数据操作稳定性不及unix/linux
6,输出前使用尽量使用 ob_start(); 可以加快输出速度,适用NT或nuli/linux,对unlix类服务器 如果使用 ob_start("ob_gzhandler");输出效率将更高
7,判断的时候尽量使用if($a==他的值) 否定的时候尽量使用if(empty($a)),因为这样程序运行更快速
8,使用不等时 != 与 <> 效率相当
9,个人经验得 使用 $a="11111111111111"; 的效率和 $a="11111111111111"; 相当.并不象书本说的相差很大
10,使用规范的SQL语句, 会有利于MySQL的解析
11,使用
if($online){
$online1=$online;
setcookie("online1",$online,$cookietime,$ckpath,$ckdomain,$secure);
}
COOKIE将马上生效
使用
if($online)
setcookie("online1",$online,$cookietime,$ckpath,$ckdomain,$secure)
COOKIE需要再刷新一次才能生效
12,使用
$handle=fopen($filename,wb);
flock($handle,LOCK_SH);
$filedata=fread($handle,filesize($filename));
fclose($handle);
比
file($filename);
无论在速度还是稳定上都要优秀
13,截断字符串优化函数(可避免?字符出现)
function substrs($content,$length) {
if(strlen($content)>$length){
$num=0;
for($i=0;$i<$length-3;$i++) {
if(ord($content[$i])>127)$num++;
}
$num%2==1 ? $content=substr($content,0,$length-4):$content=substr($content,0,$length-3);
$content.=" ...";
}
return $content;
}
比如$newarray[1]=substrs($newarray[1],25);
14,程序中屏蔽大小写
for ($asc=65;$asc<=90;$asc++)
{ //strtolower() 此函数在一些服务器会产生乱码!
if (strrpos($regname,chr($asc))!==false)
{
$error="为了避免用户名混乱,用户名中禁止使用大写字母,请使用小写字母";
$reg_check=0;
}
}
15,不使用 file();和不使用 fget();(不稳定或速度慢) 取一数组函数
function openfile($filename,$method="rb")
{
$handle=@fopen($filename,$method);
@flock($handle,LOCK_SH);
@$filedata=fread($handle,filesize($filename));
@fclose($handle);
$filedata=str_replace("\n","\n<ofstar:>",$filedata);
$filedb=explode("<ofstar:>",$filedata);
//array_pop($filedb);
$count=count($filedb);
if($filedb[$count-1]==""){unset($filedb[$count-1]);}
return $filedb;
}
//这个函数虽然代码比较多,不过在速度和稳定性上优势很大!
16,PHP不管选择什么编码,网页都能正常显示
if (function_exists("mb_internal_encoding")) {
mb_internal_encoding("gb2312"); // 这里的gb2312是你网站原来的编码
mb_http_output("HTML-ENTITIES");
ob_start("mb_output_handler");
}
网站|PHP学习 | 评论:0
| Trackbacks:0
| 阅读:1050
Submitted by on 2007, May 2, 2:51 AM
引用
我的初恋女友初恋时21岁;
我的现任女友初恋时16岁。
我的初恋女友是我的大学同学;
我的现任女友是我在泡吧时认识的。
我连哄带骗一年半以后才与我初恋女友发生了关系;
我与现任女友认识的第二天就睡在了一起。
我和初恋女友发生关系的地点在我们宿舍;
我和现任女友在四星酒店开的房。
送初恋女友一个“史卢比”她高兴好几天,不停地向她室友炫耀;
送现任女友一个铂金戒子.她看了两眼,放?樘?原来是嫌它太小。
初恋女友买衣服时,逛的是大型批发市场;
现任女友买衣服时,逛的是品牌专卖店。
与初恋女友吵架,她边抽泣边小声问道:“难道你不再爱我了吗?”;
与现任女友吵架,她坐在沙发上指着我骂道:“你们男人他妈的没一个好东西!!”
与初恋女友在一起时,她把家里每个月寄给她的生活费存到我的食堂饭卡上;
与现任女友在一起时,我每个月的工资存到她的存折上。
与初恋女友在一起,早上我醒来时候,她已经买好了早餐等我起来吃;
与现任女友在一起,她躺在床上对我说:“老公,我饿!去给我买早餐”。
初恋女友下课后在我教室门口等我一起去食堂吃饭.甚至有时打了饭送来给我吃;
现在我经常下班了回来买菜做饭等现任女友回来吃.甚至有时还得给她送过去。
初恋女友经常坐在我身边陪我上网到天亮,最后她伏在桌子上睡了;
现任女友经常打麻将打天亮 ,我坐在旁边看着,最后我坐在凳子上睡着了。
初恋女友听见我和死党们说黄色笑话会脸红;
现任女友经常把她手机里的黄色短信转发给我。
初恋女友看见这篇文章,一定会感慨万千;
现任女友看见这篇文章,一定会怨声连连。
初恋女友等我老了,我还依然记得她;
现任女友等我老了,我不知道我能否还记得她。
第一次和初恋女友约会,吃的是二块钱一碗的刀削面。她说吃不了还夹了一大半给我;
第一次和现任女友约会,吃的是八十八元一份的西式牛排。完了她还要了一份水果沙拉。
第一次走路送初恋女友回家,她神采飞扬.笑个不停;
第一次走路送现任女友回家,她说我小气,怎么不打的?
第一次牵我初恋女友的手,她的手心在冒汗,呆呆的她任由我牵着(准确说应该是任由我拖着);
第一次牵我现任女友的手,她自然的把手指反扣过来,牵着我。
第一次与初恋女友谈论爱情的时候,她坚定地说她相信爱情能够天长地久。闻之我开心了一个礼拜;
第一次与现任女友谈论爱情的时候,她奚落地说相信爱情会天长地久的人是傻冒+幼稚,是不成熟的表现。闻之我郁闷了一个礼拜。
第一次与初恋女友接吻,她全身发麻。傻傻站着,发不出声音;
第一次与现任女友接吻,她把自己的舌头伸向我的口中。
第一次隔着衣服摸初恋女友的胸脯,她啊的一声大叫,跳着跺开吓的全身出汗;
第一次摸现任女友的胸脯,发现她乳头已经硬了起来。
第一次与初恋女友发生关系时,她迟迟不肯脱衣上床;
第一次与现任女友发生关系时,我们一起洗的“鸳鸯浴”。
第一次与初恋女友**时,她傻傻地躺在床上,嘴里低语着:“轻点......我怕”;
第一次与现任女友**时,她双手抱着我的背,双腿夹着我的腰,嘴里叫着:“恩......快点儿,再快点儿.....用力~~~~~!!!”。
第一次与初恋女友**完事后,她偎依在我怀里,喃喃地说:“人家现在是你的人了,你这一辈子都要对人家好哦.....”,我感动;
第一次与现任女友**完事后,她瘪着嘴抱怨:“叫你刚才用力嘛,真是没用....”,我尴尬。
第一次与初恋女友**时,我们都觉得这是心灵上的交流;
第一次与现任女友**时,我们都觉得这只是器官上的摩擦。
第一次与初恋女友**时,她出的是血;
第一次与现任女友**时,她出的是水.
...............
无语……
乱谈|杂七杂八 | 评论:0
| Trackbacks:0
| 阅读:1396