首页技术php官方中文站,python-pptx

php官方中文站,python-pptx

编程之家2026-05-211188次浏览

今天给各位分享php官方中文站的知识,其中也会对python-pptx进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

php官方中文站,python-pptx

php及数据库

PHP调用三种数据库的方法

本文比较详细的介绍PHP调用MySQL、ODBC以及ORACLE数据库。

MySQL是一个小巧灵珑的数据库服务器软件,对于中、小型应用系统是非常理想的。除了支持标准的ANSI SQL语句外,最重要的是,它还支持多种平台,而在Unix/Linux系统上,MySQL支持多线程运行方式,从而能获得相当好的性能。它和PHP、 Apache一样,是属于开放源代码软件。其官方网站是:,上面提供Windows,Linux,Unix版本的源代码的下载。

注意,MySQL访问函数都需要有相应的权限才能运行。常用的相关函数介绍如下:

(1)integer mysql_connect(主机,用户名,口令);

此函数开始一个对指定主机上的MySQL数据库的连接。若该数据库位于一个不同地端口,则在主机名后加上冒号和端口号。所有参数均为可选的,缺省情况下分别对应为本地主机、用户正在执行的脚本名和空。主机可以是IP地址或域名。

php官方中文站,python-pptx

在脚本执行结束时,连接被自动关闭,也可以用mysql_close提前关闭。

(2)boolean mysql_create_db(数据库名);

创建一个数据库。注意必须用一个带有创建数据库许可权的帐号打开连接。

(3)boolean mysql_select_db(数据库名,连接号);

选择缺省数据库。

(4)integer mysql_query(SQL语句,连接号);

php官方中文站,python-pptx

对指定数据库进行查询。如果SQL语句是select,则返回一个结果号,否则返回的值可以不理会。如果失败,返回false.。

(5)array mysql_fetch_array(结果号);

取出下一行,返回一个数组.可以用数字下标访问(第一个字段是下标 0),也可以用字符串下标访问(即使用各字段名)。如已取了最后一行,返回 false.。

(6)mysql_fetch_row(结果号);

返回一个矩阵代表结果集中一行的所有域。每次调用都会产生下一行,直到没有行剩下时返回false。每个域值都由一个从零开始的偏移量索引。这是从查询中获取结果的最快方法。

(7)integer mysql_num_rows(结果号);

返回结果集中行的数目

(8)integer mysql_num_fields(结果号);

返回结果集中域的数目。

(9)integer mysql_list_dbs();

向服务器查询数据库列表。它返回一个结果指针,该指针可用于mysql_fetch_row函数及类似函数。

(10)mysql_list_tables(数据库名);

获取一个指向指定数据库的表单列表的结果指针。该结果指针可用于任何从结果集中获取行的函数。

(11)mysql_close(连接号);

关闭对数据库的连接。连接必须是由mysql_connect打开的。该函数的使用不是严格必需的,因为在脚本结束时,所有非永久链路都会被自动关闭。

(12)mysql_pconnect(主机,用户名,口令);

与mysql_connect完全相似,但建立一个"永久连接",该连接一经建立永不关闭,即使使用mysql_close函数或程序执行完毕也不关闭.下一次试图建立永久连接时,系统如发现已存在一个永久连接,则直接返回该连接号而不重新创建。

下面是一个调用MYSQL数据库并分页显示的例子。

<?

$pagesize= 5;//每页显示5条记录

$host="localhost";

$user="user";

$password="psw";

$dbname="book";//所查询的库表名;

//连接MySQL数据库

mysql_connect("$host","$user","$password") or die("无法连接MySQL数据库服务器!");

$db= mysql_select_db("$dbname") or die("无法连接数据库!");

$sql="select count(*) as total from pagetest";//生成查询记录数的SQL语句

$rst= mysql_query($sql) or die("无法执行SQL语句:$sql!");//查询记录数

$row= mysql_fetch_array($rst) or die("没有更多的记录!");/取出一条记录

$rowcount=$row["total"];//取出记录数

mysql_free_result($rst) or die("无法释放result资源!");//释放result资源

$pagecount= bcdiv($rowcount+$pagesize-1,$pagesize,0);//算出总共有几页

if(!isset($pageno)){

$pageno= 1;//在没有设置pageno时,缺省为显示第1页

}

if($pageno<1){

$pageno= 1;//若pageno比1小,则把它设置为1

}

if($pageno>$pagecount){

$pageno=$pagecount;//若pageno比总共的页数大,则把它设置为最后一页

}

if($pageno>0){

$href= eregi_replace("%2f","/",urlencode($PHP_SELF));//把$PHP_SELF转换为可以在URL上使用的字符串,这样的话就可以处理中文目录或中文文件名

if($pageno>1){//显示上一页的裢接

echo"<a rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" href="".$href."?pageno=".($pageno-1)."">上一页</a>";

}

else{

echo"上一页";

}

for($i=1;$i<$pageno;$i++){

echo"<a rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" href="".$href."?pageno=".$i."">".$i."</a>";

}

echo$pageno."";

for($i++;$i<=$pagecount;$i++){

echo"<a rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" href="".$href."?pageno=".$i."">".$i."</a>";

}

if($pageno<$pagecount){//显示下一页的裢接

echo"<a rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" href="".$href."?pageno=".($pageno+1)."">下一页</a>";

}

else{

echo"下一页";

}

$offset=($pageno-1)*$pagesize;//算出本页第一条记录在整个表中的位置(第一条记录为0)

$sql="select* from pagetest LIMIT$offset,$pagesize";//生成查询本页数据的SQL语句

$rst= mysql_query($sql);//查询本页数据

$num_fields= mysql_num_fields($rst);//取得字段总数

$i= 0;

while($i<$num_fields){//取得所有字段的名字

$fields[$i]= mysql_field_name($rst,$i);//取得第i+1个字段的名字

$i++;

}

echo"<table border="1" cellspacing="0" cellpadding="0">";//开始输出表格

echo"<tr>";

reset($fields);

while(list(,$field_name)=each($fields)){//显示字段名称

echo"<th>$field_name</th>";

}

echo"</tr>";

while($row=mysql_fetch_array($rst)){//显示本页数据

echo"<tr>";

reset($fields);

while(list(,$field_name)=each($fields)){//显示每个字段的值

$field_value=$row[$field_name];

if($field_value==""){

echo"<td></td>";

}

else{

echo"<td>$field_value</td>";

}

}

echo"</tr>";

}

echo"</table>";//表格输出结束

mysql_free_result($rst) or die("无法释放result资源!");//释放result资源

}

else{

echo"目前该表中没有任何数据!";

}

mysql_close($server) or die("无法与服务器断开连接!");//断开连接并释放资源

?>

开放数据库连接(ODBC)已成为一种与数据库进行通信的工业标准。PHP也提供了标准的接口,使得PHP能调用Access,SQL SERVER等数据库。其相关函数是:

(1)integer odbc_connect(string dsn, string user, string password)

连接到一个ODBC数据库源名字上。

(2)integer odbc_exec(integer connection, string query)或 odbc_do(integer connection, string query)

在一个连接上执行查询。

(3)boolean odbc_fetch_row(integer result, integer row)

从一个结果集中获取一行数据。Row参数是可选的,若为空缺,则返回下一个有效行。在结果集中不再剩余行时返回false。

(4)boolean odbc_close(integer connection)

关闭一个数据库的连接。若在该连接上有打开的事务,则返回一个错误,而且连接不会被关闭。

最后,还是看个分页的例子:

<?

//设定每页显示条数

$show_num= 10;

$spages=$pages;//避免$pages后期被改变

//定义连接

$dsn="localhost";

$user="sa";

$password="";

//计算总记录数

$rs_num="select count(*) as id from bbs where zu='0' and lei='".$lei."'";

$conn_id= odbc_connect($dsn,$user,$password);

$rnum= odbc_exec($conn_id,$rs_num);

while(odbc_fetch_row($rnum)){

$total_rs= odbc_result($rnum,"id");//将总记录数放入$total_rs变量

}

//计算与页有关的条数

$nnn=$total_rs/$show_num;//计算总页数

$hnnn= intval($nnn);//将总页数取整

$cnnnn=$nnn-$hnnn;

//计算所需总页数

switch($cnnn){

case"0":

$hnnn++;

$nnn=$hnnn;//总页数

break;

default:

$nnn=$hnnn;//总页数

break;

};

if($nnn== 0)$nnn++;

//计算页面改变所需的条件

$fore=$pages;

$next=$pages;

$fore-= 1;

$next+= 1;

if($fore> 0){

echo"<a>首页</a>";

echo"<a>前页</a>";

};

if($pages<$nnn){

echo"<a>后页</a>";

echo"<a>尾页</a>";

};

echo"共".$nnn."页";

$query_string="SELECT* FROM table where condition order by you wanted order";

$cur= odbc_exec($conn_id,$query_string);

//取到循环的顶部

$cnum=($pages-1)*$show_num;//计算当前的记录游标的位置

//空循环到显示记录游标处

if($cnum!= 0){

for($i=0;$i<=$cnum;odbc_fetch_row($cur));

};

$i=1;

//显示记录

while(odbc_fetch_row($cur)){

echo;

if($i==$show_num){//在不满页数时跳出程序

break;

};

$i++;

};

//关闭连接

odbc_close($conn_id);

?>

Oracle(甲骨文)是世界上最为流行的关系数据库。它是大公司推崇的工业化的强有力的引擎。我们先看看其相关的函数:

(1)integer ora_logon(string user, string password)

开始对一个Oracle数据库服务器的连接。

(2)integer ora_open(integer connection)

打开给出的连接的游标。

(3)integer ora_do(integer connection, string query)

在给出的连接上执行查询。PHP生成一个指示器,解析查询,并执行之。

(4)integer ora_parse(integer cursor, string query)

解析一个查询并准备好执行。

(5)boolean ora_exec(integer cursor)

执行一个先前由ora_parse函数解析过的查询。

(6)boolean ora_fetch(integer cursor)

此函数会使得一个执行过的查询中的行被取到指示器中。这使得您可以调用ora_getcolumn函数。

(7)string ora_getcolumn(integer cursor, integer column)

返回当前的值。列由零开始的数字索引。

(8)boolean ora_logoff(integer connection)

断开对数据库服务器的链接。

以下是向ORACLE数据库插入数据的示例程序:

<html>

<head><title>向ORACLE数据库中插入数据</title></head>

<body>

<form action="<?echo$PHP_SELF;?>" method="post">

<table border="1" cellspacing="0" cellpadding="0">

<tr>

<th>ID</th>

<th>name</th>

<th>Description</th>

</tr>

<tr>

<td><input type="text" name="name" maxlength="50" size="10"></td>

<td><input type="text" name="email" maxlength="255" size="30"></td>

<td><input type="text" name="Description" maxlength="255" size="50"></td>

</tr>

<tr align="center">

<td colspan="3"><input type="submit" value="提交"><input type="reset" value="重写"></td>

</tr>

</table>

</form>

<?

//先设置两个环境变量ORACLE_HOME,ORACLE_SID

putenv("ORACLE_HOME=/oracle/app/oracle/product/8.0.4");

putenv("ORACLE_SID=ora8");

//设置网页显示中文

putenv("NLS_LANG=Simplified_Chinese.zhs16cgb231280");

if($connection=ora_logon("scott","tiger")){

//库表test有ID,name,Description三项

$sql='insert into test(ID,name,Description) values';

$sql.='(''.$ID.'',''.$name.'',''.$Description.'')';

if($cursor=ora_do($connect,$sql)){

print("insert finished!");

}

$query='select* from test';

if($cursor=ora_do($connect,$query)){

ora_fetch($cursor);

$content0=ora_getcolumn($cursor,0);

$content1=ora_getcolumn($cursor,1);

$content2=ora_getcolumn($cursor,2);

print("$content0");

print("$content1");

print("$content2");

ora_close($cursor);

}

ora_logoff($connection);

}

?>

</body>

</html>

通过PHP你可以轻松的连接到数据库,请求数据并将其显示在你的web站点中,甚至修改数据库中的数据。 MySQL是一种很流行的数据库,并且在互联网中有许多有关PHP与MySQL的教程。MySQL是免费的,这一点也许就吸引了不少人。由于其广泛应用,我就不想在这里赘述MySQL的使用方法了。Oracle被大量在企业应用中采用,因此我们就利用Oracle来介绍PHP与数据库的连接。我们当然不会提及Oracle数据库的设计原理,原因是这已经超出了我们的讨论范围。

PHP提供了两套函数与Oracle连接,分别是ORA_和OCI函数。其中ORA_函数略显陈旧。OCI函数更新据说更好一些。两者的使用语法几乎相差无几。如前所述,你的PHP安装选项应该可以支持两者的使用。

想获得更多有关在Microsoft Windows平台上安装支持PHP3的Apache服务器的知识以及更多有关Oracle数据库的知识,请查阅以下URL:。

4.1连接

if($conn=Ora_Logon("user@TNSNAME","password"))

{

echo"SUCCESS! Connected to database\n";

}

else

{

echo"Failed:-( Could not connect to database\n";

}

Ora_Logoff($conn);

phpinfo();

?>

以上代码使用TNSNAME(在你的tnsnames.ora文件中指明)定义的Oracle数据库名称、用户名称和密码连接数据库。在成功连接的基础上,ora_logon函数返回一个非零的连接ID并储存在变量$conn中。

4.2查询

假设与数据库已经连接就绪,下面我们就来实际的应用对数据库的查询。下面的代码演示了一个连接并查询的典型例子:

/*

*连接数据库并执行查询

*/

function printoraerr($in_cur)

{

//检查Oracle是否出错

//如果存在错误则显示

//当指针被激活时每次请求Oracle后调用该函数

if(ora_errorcode($in_cur))

echo"Oracle code-".ora_error($in_cur)."\n";

return;

}

/**主程序*/

if(!($conn=ora_logon("user@TNSNAME","password")))

{

echo"Connection to database failed\n";

exit;

}

echo"Connected as connection-$conn

\n";

echo"Opening cursor...

\n";

$cursor=ora_open($conn); printoraerr($cursor);

echo"Opened cursor-$cursor

\n";

$qry="select user,sysdate from dual";

echo"Parsing the query$qry...

\n";

ora_parse($cursor,$qry,0); printoraerr($cursor);

echo"Query parsed

\n";

echo"Executing cursor...

\n";

ora_exec($cursor); printoraerr($cursor);

echo"Executed cursor

\n";

echo"Fetching cursor...

\n";

while(ora_fetch($cursor))

{

$user=ora_getcolumn($cursor,0); printoraerr($cursor);

$sysdate=ora_getcolumn($cursor,1); printoraerr($cursor);

echo" row=$user,$sysdate

\n";

}

echo"Fetched all records

\n";

echo"Closing cursor...

\n";

ora_close($cursor);

echo"Closed cursor

\n";

echo"Logging off from oracle...

\n";

ora_logoff($conn);

echo"Logged off from oracle

\n";

?>

(译者注:以上代码段缺少注释,请读者参考PHP Manual的Oracle数据库函数部分)

4.3显示结果

以下代码演示了怎样查询数据库并将结果输出:

function printoraerr($in_cur,$conn)

{

//检查Oracle是否出错

//如果存在错误则显示

//当指针被激活时每次请求Oracle后调用该函数

// If it encountered an error, we exit immediately

if(ora_errorcode($in_cur))

{

echo"Oracle code-".ora_error($in_cur)."

n";

ora_logoff($conn);

exit;

}

return;

}

function exequery($w_qry,$conn)

{

$cursor=ora_open($conn); printoraerr($cursor,$conn);

ora_parse($cursor,$w_qry,0); printoraerr($cursor,$conn);

ora_exec($cursor); printoraerr($cursor,$conn);

$numrows=0;

$w_numcols=ora_numcols($cursor);

//显示头部

echo"

\n";

for($i=0;$i<$w_numcols;$i++)

{

$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";

echo"\t".ora_columnname($cursor,$i)."\n";

}

echo"

\n";

while(ora_fetch($cursor))

{

echo"\n";

for($i=0;$i<$w_numcols;$i++)

{

$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";

if(ora_columntype($cursor,$i)=="LONG")

echo"".

ora_getcolumn($cursor,$i)."

\n";

else

echo"".ora_getcolumn($cursor,$i)."\n";

printoraerr($cursor,$conn);

}

$numrows++;

echo"

\n";

}

if($numrows==0)

echo" Query returned no records

\n";

else

{

echo"\n";

echo" Count\n";

echo"$numrows\n";

echo"

\n";

}

echo"\n";

ora_close($cursor);

return;

}

//主程序

if(!($conn=ora_logon("user@SID","password")))

{

echo"Error: Cannot connect to database\n";

exit;

}

$qry="SELECT

deptno\"Dept\"

,empno\"Emp\"

,empnm\"Name\"

,salary\"Salary\"

FROM

employee

ORDER BY 1,2";

exequery($qry);

ora_logoff($conn);

?>

(译者注:以上代码段缺少注释,请读者参考PHP Manual的Oracle数据库函数部分)

4.4基于HTTP的Oracle登录

将以下代码加在PHP页面代码之前以确认Oracle登录。注意你必须正确设定$ SID。

if(!isset($PHP_AUTH_USER))

{

Header("WWW-authenticate: basic realm=\"$SID\"");

Header("HTTP/1.0 401 Unauthorized");

$title="Login Instructions";

echo"

You are not authorized to enter the site

\n";

exit;

}

else

{

if(!($conn=ora_logon("$PHP_AUTH_USER@$SID",$PHP_AUTH_PW)))

{

Header("WWW-authenticate: basic realm=\"$SID\"");

Header("HTTP/1.0 401 Unauthorized");

$title="Login Instructions";

echo"

You are not authorised to enter the site

\n";

exit;

}

}

?>

php开发常用框架有哪几个

php开发常用框架介绍:

(视频教程推荐:php视频教程)

一、ThinkPHP

ThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架。它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟悉J2EE的开发人员相对比较容易上手,适合php框架初学者。 ThinkPHP的宗旨是简化开发、提高效率、易于扩展,其在对数据库的支持方面已经包括MySQL、MSSQL、Sqlite、PgSQL、 Oracle,以及PDO的支持。ThinkPHP有着丰富的文档和示例,框架的兼容性较强,但是其功能有限,因此更适合用于中小项目的开发。

优点:

1.借助成熟的Java思想

2.易于上手,有丰富的中文文档;学习成本低,社区活跃度高

3.框架的兼容性较强,PHP4和PHP5完全兼容、完全支持UTF8等。

4.适合用于中小项目的开发

5.从thinkphp3.2.2引入composer包管理工具

缺点

1.对Ajax的支持不是很好;

2.目录结构混乱,相比其他框架目录结构要差一点;

3.上手容易,但是深入学习较难。

二、Yii

Yii是一个基于组件的高性能php框架,用于开发大型Web应用。Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程。从 MVC,DAO/ActiveRecord,widgets,caching,等级式RBAC,Web服务,到主题化,I18N和L10N,Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。事实上,Yii是最有效率的PHP框架之一。

优点

1.纯OOP

2.用于大规模Web应用

3.模型使用方便

4.开发速度快,运行速度也快。性能优异且功能丰富

5.使用命令行工具。

6.支持composer包管理工具

缺点:

1.对Model层的指导和考虑较少

2.文档实例较少

3.英文太多

4.要求PHP技术精通,OOP编程要熟练!

5.View并不是理想view,理想中的view可能只是html代码,不会涉及PHP代码。

三、laravel

优点

1.laravel的设计思想是很先进的,非常适合应用各种开发模式TDD, DDD和BDD

2.支持composer包管理工具

3.集合了php比较新的特性,以及各种各样的设计模式,Ioc容器,依赖注入等。

缺点

1.基于组件式的框架,所以比较臃肿

四、CodeIgniter

优点:

1.Code Igniter推崇“简单就是美”这一原则。没有花哨的设计模式、没有华丽的对象结构,一切都是那么简单。几行代码就能开始运行,再加几行代码就可以进行输出。可谓是“大道至简”的典范。

2.配置简单,全部的配置使用PHP脚本来配置,执行效率高;

3.具有基本的路由功能,能够进行一定程度的路由;

4.具有初步的Layout功能,能够制作一定程度的界面外观;

5.数据库层封装的不错,具有基本的MVC功能.

6.快速简洁,代码不多,执行性能高,

7.框架简单,容易上手,学习成本低,文档详细;

8.自带了很多简单好用的library,框架适合小型应用.

缺点:

1.本身的实现不太理想。

2.内部结构过于混乱,虽然简单易用,但缺乏扩展能力。

3.把Model层简单的理解为数据库操作.

4.框架略显简单,只能够满足小型应用,略微不太能够满足中型应用需要.

评价:

总体来说,拿CodeIgniter来完成简单快速的应用还是值得,同时能够构造一定程度的layout,便于模板的复用,数据操作层来说封装的不错,并且CodeIgniter没有使用很多太复杂的设计模式,执行性能和代码可读性上都不错。至于附加的library也还不错,简洁高效。

五、Zend Framework

优点:

1.大量应用了PHP5中面向对象的新特征:接口、异常、抽象类、SPL等等。这些东西的应用让Zend Framework具有高度的模块化和灵活性

2.严格遵循“针对接口编程”和“单一对象职责”等原则

3.官方出品,自带了非常多的library,框架本身使用了很多设计模式来编写,架构上很优雅,执行效率中等

4.MVC设计,比较简洁

5.具有路由功能,配置文件比较强大(能够处理XML和php INI)

6.能够直观的支持除数据库操作之外的Model层(比 CodeIgniter和 CakePHP强),并且能够很轻易的使用Loader功能加载其他新增加的Class

7.Cache功能很强大,从前端Cache到后端Cache都支持,后端Cache支持Memcache、APC、SQLite、文件等等方式

8.数据库操作功能很强大,支持各种驱动(适配器)

9.文档很全,在国内社区很成熟

缺点:

1.MVC功能完成比较弱,View层简单实现(跟没实现一样),无法很强大的控制前端页面.

2.没有自动化脚本,创建一个应用,包括入口文件,全部必须自己手工构建,入门成本高

3.对于简单和小型的项目来说,反而因为在框架中应用了大量面向对象设计,对开发者提出了更高的要求,间接增加了项目的开发成本

评价:

作为官方出品的框架,Zend Framework的野心是可以预见的,想把其他框架挤走,同时封装很多强大的类库,能够提供一站式的框架服务,并且他们的开发团队很强大,完全足够有能力开发很强大的产品出来,所以基本可以确定的是Zend Framework前途无量,如果花费更多的时间去完善框架。同样的,Zend Framework架构本身也是比较优雅的,说明Zend官方是有很多高手的,设计理念上比较先进,虽然有一些功能实现的不够完善,比如View层,自动化脚本等等,这些都有赖于未来的升级

六、CakePHP

优点:

1.最类似于RoR的框架,包括设计方式,数据库操作的Active Record方式

2.设计层面很优雅,没有自带多余的 library,所有的功能都是纯粹的框架,执行效率还不错

3.数据库层的 hasOne, hasMany功能很强大,对于复杂业务处理比较合适

4.路由功能,配置功能难度适中

5.自动构建脚手架(scaffold)很强大,适合中型应用

6.基本实现过了MVC每一层

7.具有自动操作命令行脚本功能

8.文档比较全,学习成本中等

缺点:

1.CakePHP非常严重的问题是把Model理解为数据库层操作,严重影响了除了数据库之外的操作能力

2.cache功能略显薄弱

3.配置功能稍嫌弱

4.不适合大型应用,只适合中型应用,小型应用来说略微的学习成本高了点.

评价:

总体来说CakePHP框架代表了PHP框架很重要的一个时代和代表,并且目前发挥着很重要的作用,不少自己写的框架都模仿了CakePHP的方式,是个里程碑式的产品;CakePHP透露着RoR的敏捷开发方式和把数据库操作认为是唯一Model的设计思想,作为开发快速应用和原型是绝好的工具;同样,用来做Web2.0网站的开发框架,也是值得选择的

七、Symfony

优点:

1.完整实现了MVC三层

2.封装了所有东西,包括$POST,$GET数据,异常处理,调试功能,数据检测

3.包含强大的缓存功能

4.自动加载Class,能够很随意的定义各种自己的class

5.强大的语言支持

6.具有很强大的view层操作,能够零碎的包含单个多个文件

7.非常强大的配置功能,使用xml配置能够控制所有框架和程序运行行为

8.包含强大的多层级项目和应用管理:Project--> Application--> Module--> Action,能够满足一个项目下多个应用的需要,并且每层可以定义自己的类库,配置文件,layout

9.非常强大的命令行操作功能,包括建立项目、建立应用、建立模块、刷新缓存等等

10.Symfony绝对是开发大型复杂项目的首选,因为使用了Symfony,将大大节约开发成本,并且多人协作的时候,不会出现问题,在Project级别定义好基础Class以后,任何模块都能够重用,大大复用代码.

缺点:

1.最大的问题也在于使用了太多风格迥异的开源项目来组合成框架

2.由于Mojavi和Propel本身都相当复杂,因此Symfony的结构非常复杂,难以理解和学习

3.缓存功能无法控制,每次开发调试总是缓存,需要执行 symfony cc,symfony rc来清除和重建缓存

4.效率不是很高,特别是解析模板和读取配置文件的过程,花费时间不少

5.学习成本很高,并且国内没有成熟的社区和中文文档

评价:

Symfony绝对是企业级的框架,唯一能够貌似能够跟Java领域哪些强悍框架抗衡的东西;强悍的东西,自然学习复杂,但是相应的对项目开发也比较有帮助,自然是推荐复杂的项目使用Symfony来处理,觉得是值得,后期的维护成本比较低,复用性很强。相应的如果使用Symfony的应该都是比较复杂的互联网项目,那么相应的就要考虑关于数据库分布的问题,那么就需要抛弃Symfony自带的数据库操作层,需要自己定义,当然了,Symfony支持随意的构造model层

总评:

以上数款框架,各有特色,而且都是开源项目,不过框架针对的项目不一样,一般来说:

1.小型项目:CodeIngiter

2.中型项目:CakePHP、Zend Framework、Laravel、Thinkphp

3.大型重量级项目:Yii、Symfony、Laravel

discuz好还是phpwind

discuz!(简称dz)和phpwind(简称pw)是国内最著名的两个PHP论坛系统,随着它们相继宣布开源以后,在各方面,不管技术上,还是功能上,还是界面上,都有了长足的发展,声威大振,远非国外那些功能简单的电子公告板系统可比了。其造成的一个副作用是大大带动了PHP在国内的普及(本人就是在寻找合适的论坛程序的时候,才开始关注PHP,进而不能自拔的)。

客观的说,目前的pw和dz各有短长,其互相之间的激烈竞争应该说提高了PHP论坛的水平,在功能上不仅赶上了以功能多和漏洞多而著称的动网论坛,而且因为它们的效率和速度远远超过动网,弄的动网市场大大萎缩,原来的一些动网论坛都纷纷转换成了dz或者pw,搞的动网都不得不开始弄PHP论坛了。

要说他们哪个更好,是比较难的事情,毕竟各有短长,俺也不敢在这里妄下结论。不过从市场份额和网上的言论来看,目前dz还是略占上风的,而且去年国内好几个知名的大论坛都转换成了dz(比如凤凰网、牧文、tompda等),而pw在大网站方面收获甚小。

但是毕竟对好多新手来说,他们都要面临一个选择论坛程序的问题,因此,dz和pw哪个更好,也就成了经常被问的问题,这种没有答案的问题,自然要被反复问起。本文试图从比较深的层次来分析两个论坛的优劣,为新手提供选择的参考。如有错谬之处,欢迎批评指正。

一、界面篇

首先,从界面上说,从整体上说,dz的界面比较美观,整体感好。

pw的界面给人一种模仿dz的感觉。同时在界面的细节上,看起来pw还是没有dz完美。

二、技术篇

从技术上说,pw和dz都使用了文件方式的数据缓存技术,通过把常用的数据表,比如论坛版面设置参数、基本参数等,生成静态缓存文件(根据条件触发更新或者手动更新),来减少数据库读取次数,提高效率,在这个方面两者非常相似。

1、模版技术

从模版技术上说,dz从2.5f版就开始采用的这种静态模版技术,从俺个人角度上说,还是非常适合论坛这种频繁更新的网站程序使用的。它通过动态生成静态模版的方式,解决了模版解析效率的问题。

同时,dz的这种模版方式,使得修改界面也比较容易,很直观。

而pw使用echo语句的这种方式(姑且称其为模版),就寒碜多了,要增加了一个if判断条件,就要折腾半天。添加了混合PHP代码的模板,在 dreamweaver中也容易被误操作删除。特别是如果修改的时候稍有不慎,很可能会使网页成了白板(没有输出),让俺每次修改pw模版无不如履薄冰,战战兢兢。。。。恐怕这也是第三方模版中,dz远远多于pw的原因吧。

不过pw目前在模版上也在改进,现在看verycms 3.0就已经开始使用真正的模版技术,不过目前用的都还比较初级。。。

2、速度问题

从模版上看,两者的效率应该是差不多的,pw的模版其实就是直接包含的混合了PHP语句的一部分PHP文件,而dz的模版平时并不需要解析,所以效率应该是差不多的,但是网上总是有人声称网站使用dz的速度比pw慢,这方面本人没有测试过,不敢妄作评论。而且网站访问速度还是要受很多因素的影响,比如:本地网速、服务器带宽、心理。。。。。客观的评价还是很难的,除非使用专业技术手段。不过从官方网站的速度来看,明显还是pw占优啊,呵呵

最近看了一下dz的CSS文件,明显是用CSS用的有点过度了,在dz中大量使用了CSS,CSS文件高达16KB左右(pw只有2KB左右),可能造成了IE渲染网页的时候,效率比较低。同时,由于dz的CSS文件过于庞大,只好采用了外置的方式(Link)。

这样如果网速很慢,网页已经或者部分下载完,而CSS文件下载没完成(网速慢的时候,常常发生这种情况),那么网页根本就不能正常显示。

在网速慢的时候,光dz的CSS文件,就要用好几秒,甚至十几秒的时间才能下载,而整个网页只能在CSS下载完成以后才能进行正确的显示,这就无怪乎在网速慢的时候,dz表现大大逊色于pw了。

相反,pw在设计CSS的时候,明显是比较简洁,这对网页的渲染肯定是比较有利。同时,pw采用了把CSS文件嵌入的方式,尽管每次访问网页都造成了几K个字节的流量,但是实际影响并不大,反而觉得网页打开速度比dz要快(这就是pw用了一个笨法子,却常常效果比dz强的典型案例)。

这方面,建议dz痛下决心简化过分臃肿的CSS文件,提高网页速度。

三、功能篇

下面俺就dz5.5和pw5.3的功能,做一个简单的,本人看来是比较深入,可能高手看来仍嫌浅显的分析,请大家指正:

1、登录方式:

pw的前台登录和后台登录采用了不同的Cookie方式,这样前后台分开的方式,个人感觉,有利于安全,也便于管理。后台帐号与前台帐号可以彻底分开。

而dz的前后台登录是用了一个帐号,尽管在进入后台的时候再次提示输入密码,不过还是不如pw方便。

比较特别的是,dz在注册的时候,要求输入提示问题(选填),而且在登录界面中,也有提示输入的界面,个人感觉,绝对的画蛇添足,无聊。如果说使用提示问题来找回密码,还是有点道理的。用提示问题的方式,让新手看了无所适从,脑袋都晕了

2、分栏显示:

pw从5.0.1开始支持左右分栏显示了,然而功能太简单,不能树状显示子板块,此功能与其说有,不如说没有,弄的有点搞笑,属于半成品(倒是也符合pw的一贯特点--喜欢推出一些不完美的东西让大家修改)。

看了dz5.5的分栏显示,做的还是比较完美的,感觉相当不错了。

3、后台管理的效率:

pw的横向操作非常不错,大大节省了管理的难度,特别是在根据用户组设置权限的时候,非常的那个方便啊,这方面dz需要改进。

dz提供了一个方案的方式来解决后台重复操作问题,应该说也有一定道理,但是用起来不太容易上手,如果是设置一个单独的项目,就比较繁琐。

4、个人空间(文集)功能:

dz5.5内置了minispace个人空间功能,可以说自从discuz合并了supsite以后,在论坛功能的外展方面,占据了很大优势,吸引了很多个人网站的注意力。

这个minispace用dz官方的话说,是这样的:

“完全利用论坛原有资源,会员不必更多付出,即可拥有个性展示页面

与 X-Space完美结合,可顺畅实现 MiniSpace与 X-Space自然过渡”

大体看了一下,发现这个minispace做的很不错,利用它,用户可以把自己的优秀帖子整理出来,形成一个文集的方式,方便别人访问。以前在别的论坛见过这个功能,觉得很不错,没想到dz把它整合进去了。这个功能已经可以满足大部分论坛的功能要求了,如果要求更高,比如希望能让用户发布b0客文章,按照官方的说法,也可以迁移到X-space中去。但更重要的是,minispace是开源的,而X-space的源代码并不开放。

说到X-space,我们觉得,pw在功能上虽然足以和dz匹敌,但是在论坛的外延上,却比dz落后了好多。X-space能实现以论坛为中心的个人空间功能,而pwblog(已经改名为Lxblog,正式版未推出,本文仅以5.1.5版本为例)却和论坛貌合神离,帖子推送功能虽然从4.3.2就有了,然而却一直不好用,4.x推送以后,图片和附件都不正常,5.1.5虽然可以推送正常了,然而在论坛中更新的帖子,在b0客中却不再出现回帖,可以说推送功能在pwblog中只是一个无用的点缀而已。

说到底,我们常常希望的只是一个论坛帖子文集功能的方式,pwblog把论坛中的内容重复推送到b0客中,既浪费空间,又没有意义,这方面dz远远胜过了 pw,值得表扬。但minispace的功能还是略显简单了些,比如没有文集帖子的分类功能、没有首页推荐帖子等等(也许论坛帖子的分类意义不大,不过有总比没有强吧?)

5、防灌水技术

pw5.3终于接受了俺提出的新手注册第N贴以前发帖使用验证码的方式,这样既不影响老用户的使用,又通过验证码方式来限制恶意灌水机器人。dz未提供此功能,但是具有可以设定第N贴以后不用自定义问答的功能(dz的验证码很烂,根本看不清,用自定义问答似乎更好一些)。

在防止自动注册方面,pw和dz都使用了自定义问答方式防止自动注册的办法,具体原理很简单,两者实现的都差不多。区别在于,dz要求设置10个以上的问题才能生效,而pw只能设置一个问题。另外,还有一个区别,就是pw可以自定义问答中内部使用的form变量名,可能在防止恶意自动注册方面,会更加有效一些。pw的自定义问题只能用于注册,而dz的可以用在注册、发帖和短消息等方面。

从目前的具体应用来看,用一个问题就基本上解决了自动注册的问题(长时间实践发现的结果),当然也不排除特大型网站,用一个问题容易被攻破的可能性,这方面dz可能就更有效一些。只是dz限制要求10个以上才能生效的做法,令人费解。

6、前台管理功能

pw具备副版主功能,不过和一般的思路不同,副版主是由版主任命的,这样恐怕会导致权限混乱问题,所以也很少有人用这个功能。

在前台的管理功能中,pw更方便一些,不仅的主题列表中能进行管理,在帖子内容页面中的管理方式比dz用下拉方式更直观一些。而且在一个主题里面删除帖子,pw比dz直观多了。

费解的是,pw5.3版本中移动帖子,都会在帖子前面加入移动提示“本帖被 xxxx从 xxxx移动到本区(xxxx年xx月xx日)”,无法消除,真是难看极了(以前版本没有这个毛病)

dz实现了“沉贴”的功能,可以把那些偶尔被人翻上来的无用垃圾贴沉下去,确实方便多了。。。。有次俺在pw中为了沉一个帖子,不得不提前了N个帖子。而且dz的版主管理功能,加亮、精华等操作都能一气呵成,比pw方便好多。

7、所见即所得编辑器

dz5.5和pw5.3开始,不约而同的把所见即所得编辑器换成了ubbcode(两个论坛名称不一样,这里用个通俗一点的名称,暂称为UBBCode)方式的编辑器,而放弃了原来的HTML可视化编辑器。

说起来,这个ubbcode可视化编辑器确实解决了以前采用代码方式,无法可视化,导致好多非IT人士发帖无法控制格式;而和动网一样使用HTML方式,又产生大量冗余代码和安全性隐患的问题。

不过造成的后果却是,在转贴的时候,以前可以直接从别人的网页上,连图片带文字一起转过来,却是非常方便,虽然有盗链之嫌。换成了这种编辑器,再也没法那么方便了,因此在换了编辑器以后,官方论坛中是怨声载道一片。。。。而且新的编辑器还有好多小BUG,更加是引起了广泛不满(另注:用了一段DZ后发现,dz 5.3的所见即所得编辑器好像存在很多问题,几乎无法用,这方面可能还不如pw的编辑器好用一些)

8、附件上传和所见即所得功能:

pw的附件还是只能提交帖子上传以后才能进行图文混排,这方面dz要好的多,可以上传前就进行混排,方便多了

dz对不参与上传的图片附件还是显示太多信息,看起来影响美观(似乎是受vbb和phpbb的影响比较大)。而pw只是显示了“图片”字样和描述信息,但是更恶心的是,却把这些图片放到正文文字上方,真是屡教不改啊

9、附件防盗链技术的分析:

dz采用了隐藏图片地址,和检测访问来源(可选)的办法来防盗链,应该说服务器负担比较大,效果还行,但不能彻底解决问题。

pw用的办法更简单,但更有效一些:就是定期或者自动修改附件目录名,应该说这是一个投资少见效快的好办法,技术上也很简单。不过最新的pw5.3版本也引入了隐藏附件地址的方式,后台也似乎无法关闭此项功能,似乎有点画蛇添足的味道了。。。。

发现dz也可以在后台手工修改附件目录,也可以起到一定效果,只是没有自动修改的功能。

10、广告功能:

dz比pw要好一些,广告功能更完善一些。比如贴内广告,在帖子下面的位置类似动网的位置,看起来更整齐一些,而pw的位置就让帖子布局显得比较凌乱,不好看。dz的贴间广告可以插入大的Google Banner广告,或者其它图片形式的广告,展示效果很好。

相比dz,pw广告的插入位置更少一些,效果也差一些。

11、头像显示:

dz不能限制上传头像的长宽尺寸,只能限制总像素数,显得不够灵活,不如pw方便。而且超出了一定尺寸的头像,被自动缩放和拉伸了,看起来很难看。而且 dz还自动给头像加了一个边框,甚是恶心。可见dz把简单的事情给弄复杂化了,其实只要和pw一样,限制其尺寸,根本不需要拉伸。

12、附件尺寸限制:

pw只能设定所有附件的尺寸,而dz可以对个别格式的附件设定上传尺寸,比较灵活一些,特别适合一些flash网站,或者技术型网站(比如上传大尺寸图纸等)。

13、词语过滤:

pw只能使用普通方式过滤,不支持大小写(很简单的事情,官方就是不办,举手之劳啊)。

而dz不仅能识别大小写,而且具有了一定的模糊识别功能,相当不错了。当然,要是能直接支持正则表达式就更爽了。

14、自定义代码功能:

pw至今不支持自定义wincode代码,比较僵化。要增加功能,就只能修改js文件,太过麻烦。。。。

dz在这方面做的比较完美,要增加或者减少代码、修改播放界面尺寸都很容易,在后台设置一下就可以了

15、回收站功能:

dz可以设定自动清理,而pw不能

16、IP来源显示功能:

dz的IP地址和来源显示类似动网,看起来不太方便,需要点击小电脑图标才行。还是pw的IP地址来源显示看起来比较舒服一些。

17、防CC攻击:

pw早在4.3.2就增加了抗CC攻击功能,而且设置起来比较简单,新手也能看懂。当初俺就是因为这个原因才用了pw。

dz5.5虽然号称带有cc攻击防护,不过看起来比较难于理解,在后台找了半天也没找到,估计新手是操作不了的。当年某著名站长论坛(用dz)可就是被CC攻击搞的长期开不了张的,看起来dz的防CC攻击功能还有待改进。

18、备份功能

pw能支持对pw程序以外的数据表进行备份,而且判断标准不是根据表前缀。可以单独备份pw表以外的数据表,对于那些建立了新表的插件,备份数据超级容易,这方面比较人性化。

dz只是根据表前缀来进行备份,比如你设置一个表,叫做cdb_test,那么它会把它认为是论坛数据表而进行备份。但是如果你设置一个表,叫做test,那就自己想办法去吧。。。。

但是dz比pw强的是,备份可以压缩,压缩后下载和转存备份文件应该会节省巨大的空间和时间,对于超大型论坛应该是非常管用的。dz备份可以指定文件名,而且备份数据用十六进制表示(安全一些,但是占用空间会大一些),估计导入和恢复的中文内码问题就不会存在了。

另外,dz还可以备份MySQL Dump备份(不推荐使用)。

19、文件和数据库校验:

dz内置了文件和数据库校验的功能,pw只是官方提供了一个文件校验工具,不过用起来有点莫明其妙,有时候提示使用的函数在php文件中根本不存在

20、主题推荐和相关贴功能:

dz通过qihoo实现了相关贴的功能,而且还可以支持主题推荐,这方面比pw强了很多。

21、模版和风格设置

phpwind可以在后台设置风格CSS文件,虽然新手不太容易上手,但确实还是比较方便的。

dz更进一步,把css的内容给解释成了表单的形式,让新手也能操作,不过带来的缺点更加大了:如果你想在CSS中增加控制(比如调整行间距等),就不知道该怎么弄了,只好去修改模版。好在dz还提供了一个附加功能:在后台可以直接修改模版,而且编辑界面中还带搜索功能,总算是亡羊补牢了

dz以较大优势在功能上超过pw,而且在dz有些胜过pw的功能上,好多都是以较大优势取胜。

四、总结

总体来说,dz在功能上,界面上,技术上,论坛功能外延上,都胜过了pw。但pw也并非一无是处,其抗CC攻击功能,简洁快速的界面,强大的管理功能,独到的防盗链技术,都很有特色。所谓仁者见仁,智者见智,选择pw还是dz,仍然是一个个性化的问题,具体取决于你对他们的某项特点是否看重。

另外,感觉dz在浏览器兼容性上有点小问题,有时候会出现提示,什么从来路不明的什么东西提交信息,检查norton internet security配置之类的烦人问题,而且dz的验证码太恶心,根本看不明白,都赶上动网的烂验证码了,基本上没法用,只好关掉算完。

需要说明的是,如果是新手,需要选择论坛,还是建议选择dz,因为功能比较多,论坛的外延开发的比较好(supsite/X-space做的很不错),用起来方便一些,而且模版修改起来比较简单,容易上手。

pw只是适合老手,和对论坛外延功能不太感兴趣的那些人使用,而且pw的模版修改起来相当困难,稍有不慎就容易出错,对新手不合适。

PW适合娱乐站,速度快,功能多,官方集成各种插件,几乎不用维护

pw现有的功能=dz+银行+多附件上传+在线会员统计+特殊用户组添加+节日送礼

个人认为phpwind比较方便些,对于那些不想花时间装插件的人来说上手更容易

好了,文章到此结束,希望可以帮助到大家。

html指令代码大全(html在线编辑器网页)源码素材网 html源码下载