成都网站建设设计

将想法与焦点和您一起共享

php数据分析引擎,php 数据分析

PHP是什麽(我想要详细一点的答案)

PHP,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩写。PHP 是一种 HTML 内嵌式的语言,PHP与微软的ASP颇有几分相似,都是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用。PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。它可以比 CGI 或者 Perl 更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;与同样是嵌入HTML文档的脚本语言JavaScript相比,PHP在服务器端执行,充分利用了服务器的性能;PHP执行引擎还会将用户经常访问的PHP程序驻留在内存中,其他用户再一次访问这个程序时就不需要重新编译程序了,只要直接执行内存中的代码就可以了,这也是PHP高效率的体现之一。PHP具有非常强大的功能,所有的CGI或者JavaScript的功能PHP都能实现,而且支持几乎所有流行的数据库以及操作系统。

在黄骅等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、成都网站设计 网站设计制作按需定制设计,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销推广,成都外贸网站制作,黄骅网站建设费用合理。

PHP 最初是1994年Rasmus Lerdorf创建的,刚刚开始只是一个简单的用Perl语言编写的程序,用来统计他自己网站的访问者。后来又用C语言重新编写,包括可以访问数据库。在1995年以Personal Home Page Tools (PHP Tools) 开始对外发表第一个版本,Lerdorf写了一些介绍此程序的文档,并且发布了PHP1.0。在这早期的版本中,提供了访客留言本、访客计数器等简单的功能。以后越来越多的网站使用了PHP,并且强烈要且增加一些特性,比如循环语句和数组变量等等,在新的成员加入开发行列之后,在1995年中,PHP2.0发布了。第二版定名为PHP/FI(Form Interpreter)。PHP/FI加入了对mSQL的支持,从此建立了PHP在动态网页开发上的地位。到了1996年底,有15000个网站使用 PHP/FI;时间到了1997年中,使用PHP/FI的网站数字超过五万个。而在1997年中,开始了第三版的开发计划,开发小组加入了 Zeev Suraski 及 Andi Gutmans,而第三版就定名为PHP3。2000年,PHP4.0又问世了,其中增加了许多新的 性。

PHP的特性包括:

开放的源代码:所有的PHP源代码事实上都可以得到。

PHP是免费的。

基于服务器端:由于PHP是运行在服务器端的脚本,可以运行在UNIX、LINUX、WINDOWS下。

嵌入HTML:因为PHP可以嵌入HTML语言,所以学习起来并不困难。

简单的语言:PHP坚持脚本语言为主,与Java以C++不同。

效率高:PHP消耗相当少的系统资源。

图像处理:用PHP动态创建图像

PHP 3与PHP 4的比较

PHP3跟Apache服务器紧密结合的特性;加上它不断的更新及加入新的功能;而且几乎支持所有主流与非主流数据库;再以它能高速的执行效率,使得PHP在1999年中的使用站点已经超过了150000万。加上它的源代码完全公开,在 Open Source意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新的活力,使得PHP无论在UNIX、LINUX或是Windows的平台上都可以有更多新的功能。它提供丰富的函数,使得在程序设计方面有着更好的支持。

PHP4.0整个脚本程序的核心大幅更动,让程序的执行速度,满足更快的要求。在最佳化之后的效率,已较传统CGI或者ASP等程序有更好的表现。而且还有更强的新功能、更丰富的函数库。无论您接不接受,PHP 都将在 Web CGI 的领域上,掀起巅覆性的革命。对于一位专业的Web Master 而言,它将也是必修课程之一。

PHP 4.0是更有效的,更可靠的动态Web页开发工具,在大多数情况运行比 PHP 3.0要快,其脚本描述更强大并且更复杂, 最显著的特征是速率比的增加。PHP4.0这些优异的性能是PHP 脚本引擎重新设计产生的结果:引擎由 AndiGutmans 和 Zeev Suraski从底层全面重写。PHP4.0 脚本引擎 ——Zend 引擎,使用了一种更有效的编译——执行方式, 而不是PHP 3.0 采用的执行 ——当解析时模型。

PHP4在3.0版的基础上增加或增强了许多有用的特征,主要如下:

(1)别名:在PHP4中,可以利用引用为变量赋值,这给编程带来了很大的灵活性。

(2)扩充了API 模块:PHP 4.0 为扩展的 API 模块的提供了扩展PHP接口模块, 它比旧的 API 版本显著地快。 PHP 模块已有的及最常用的接口多数被转换到使用这个扩展的接口。

(3)自动资源释放:PHP4增加了引用计数功能,这种新技术的引入使PHP4具有了自动内存管理功能,减轻了开发人员的负担。

(4)布尔类型:PHP 4.0 支持布尔类型。

(5)进程生成:在 UNIX 环境下的 PHP 4.0 提供了一个很智能和通用的生成进程, 使用了一种名为基于automake/libtool的系统生成技术。

(6)COM/DCOM 支持:PHP 4.0 提供 COM/DCOM 支持 ( 仅用于Windows 环境 ) 可以无缝地存取和访问 COM 对象。

(7)与PHP 3.0 兼容性很好:PHP 4.0 是与 PHP 3.0 代码向后兼容性接近100% 。由于 PHP 4 的改进的体系结构,两者有一些细微的差别,但是大多数人将可能永远不可能遇上这种情况。

PHP介绍

(8)配置:PHP4重新设计和增强了PHP。ini文件,这使得用PHP。ini来配置PHP显得极为容易,这个文件可以在运行时被Apache(unix系统)或由Windows 注册(Windows 环境)。

(9)加密支持:PHP4实现了完整的加密, 这些加密功能是一个完整的mycrypt库,并且 PHP 4.0 支持哈希函数。Blowfish,TripleDES,MD5,并且SHA1 也是可使用的一些加密算法。

(10)类型检查:PHP 4.0 支持同一操作符用于评类型检查:===( 3 等号运算符 ), 为在两个值和其类型之间作检查。例如, 3 ===3 将视为假 ( 类型是不同的 ), 而 3 ==3 ( 相等判断 ) 将视为真。

(11)FTP 支持:PHP 4.0 支持 FTP 。通常, 你会为通过一个调制解调器连接下载一个大文件提供一个接口。然而, 如果你确实有需要,可以使用PHP 。

(12)PHP4新增函数或功能增强函数:PHP 4.0 新增了许多函数,同时也将许多现有的函数功能进行了增强,以下是一些例子。 array_count_values() eval() foreach() nclude() ob_end_clean() ob_end_flush() ob_get_contents() ob_start() strip_tags() unset()

(13)here打印:PHP 4.0 的Here打印是与Perl类似的, 尽管完全不相同。Here是打印大容量文章的一个有用的方法,例如在 HTML文件中,不会漏掉任何一个字符,例如目录标记。

(14)HTTP Session fallback 系统:为 HTTP Session管理的一个 fallback 系统在 PHP 4.0被实现 。缺省情况下,Session标识符由cookies存储。如果没有cookies支持或一项cookies任务失败,Session标识符自动被创建并在 URL 的查询字符串中被携带。

(15)ISAPI 支持:PHP 4.0 能作为一个个性化的 ISAPI 模块作为 IIS插件 。这比 PHP 3.0 更有效, 它作为一个外部的程序来运行。

(16)内存:PHP 4.0 能更有效的使用内存, 导致较少的内存占用消耗,这主要归功于引用计数技术的实现。

(17)其他类成员函数:在 PHP 4.0 你能在成员函数本身的作用域或全局范围内调用其他类的成员函数。例如,你能用一个子函数覆盖父函数,并在子函数中调用父函数。

(18)多维数组:在 PHP 4.0 ,利用GET,POST,Cookies的进行的数据传输支持多维数组。

(19)个性化的 HTTP Session支持:HTTP Session处理, 包括 fallback 系统管理,在 PHP 4.0被它的新库函数实现 。在版本 3.0 中处理Session要求使用 PHPLIB 和第三方的库函数, 它比把Session直接地由 PHP 支持慢了许多。

(20)个性化的 Java 支持:PHP 4.0 支持和java的交互。这种个性化的Java 支持为PHP 在 Java 对象上创建和使用方法提供一个简单并且有效的工具。

21)对象和数嵌套组:PHP 4.0 实现了功能更加强大的对象, 移去了 PHP 3.0存在的种种句法限制。对象能在数组以内被嵌套并且反过来也如此, 可以根据你的需要实现嵌套。

(22)面向对象的编程:PHP 4.0 为面向对象的编程和构造类及对象提供扩展的功能和新特征。PHP4实现了对象重载,引用技术等新技术。

(23)对象重载支持:对象重载语法允许第三方的基于面向对象的类库使用 PHP4 的面向对象的特征存取他们自身的功能。使用这个特征的一个 COM 模块已经被实现了。

(24)输出缓冲支持:PHP 提供了一个输出缓冲函数集合。输出缓冲支持允许你写包裹函数功能压缩缓冲区。在 PHP4 的输出缓冲支持允许 HTML 头信息存放, 无论 HTML的正文是否输出。头信息( (header(), content type, and cookies ) 不采用缓冲 。

(25)增加了PCRE 库:PHP 4.0 包括一个 Perl 兼容的正则表达式 (PCRE ) 库, 和正常regex库一起与 PHP 绑定。split 和replace PCRE 功能被支持。PCRE 和 Perl 正规表达式之间有一些细微差别。

(26)PHP.ini 文件:PHP.ini文件在 PHP4.0 被重新设计, 使用的 PHP 的配置PHP.ini是更容易并且更有效的。全部文件能被Apache 在运行时间操作 ( 在 Apache环境 下 ) 或由 Windows 注册表 ( 在 Windows 下面 ) 。被加入PHP.ini文件的配置指令自动地在所有相关的模块中被支持。

(27)引用计数:PHP 4.0 为系统中的每个数值提供了引用计数, 包括资源。一旦一个资源不再被任何变量引用,它自动地被释放以节省内存资源。利用这个特征的最明显的例子一个内置SQL查询的循环语句。在PHP 3.0中 ,每次递归另外的 SQL 结果集合重复申请内存,直到脚本执行完毕,这些结果集合占用的内存才被释放。

(28)支持引用:通过引用可以改变一个变量的值。

(29)函数的运行时绑定:PHP 4.0 的运行时间绑定功能允许你在他们被声明以前调用, 无论声明是否在代码以后或是在运行时间。

(30)类的运行时信息:PHP 4.0 支持在运行时刻存取下列类信息:一个对象的类名,一个对象的父类的类名字,以及对象函数所在的名字。

(31)服务器抽象层:为支持Web服务器提供了增强型 SAPI ( 服务器 API ) 接口,是 PHP 4。0 不可分的一部分。这个服务器抽象层,提供了通用的WEB服务器接口支持,支持多线程WEB服务器,为大多数的WEB服务器提供透明的支持, 这些服务器包括 Apache ,IIS ( ISAPI ), 以及 AOL 服务器。

(32)语法的点亮显示:PHP 4.0 语法的点亮显示允许开发者看见源代码而不是脚本, 这个功能比PHP 3。0中的更有效。它跑得更快,更执行得更好,并且产生更紧凑的HTML代码。

(33)由引用改变变量的值:PHP 4.0 由引用支持可变的赋值, “关联”的2个变量之中个的任何一个的值被改变,另外的变量的值同样被改变,这类似与C中的指针类型。

(34)在引用字符串中的变量引用:PHP 4.0 增强了在引用字符串中的变量引用。

PHP 在数据库方面的丰富支持,也是它迅速走红的原因之一,它支持下列的数据库或是数据文件:

· Adabas D

· DBA

· dBase

· dbm

· filePro

· Informix

· InterBase

· mSQL

· Microsoft SQL Server

· MySQL

· Solid

· Sybase

· ODBC

· Oracle 8

· Oracle

· PostgreSQL

而在 Internet 上它也支持了相当多的通讯协议 (protocol),包括了与电子邮件相关的 IMAP, POP3;网管系统 SNMP;网络新闻 NNTP;帐号共用 NIS;全球信息网 HTTP 及 Apache 服务器;目录协议 LDAP 以及其它网络的相关函数。

除此之外,用 PHP 写出来的 Web 后端 CGI 程序,可以很轻易的移植到不同的操作系统上。例如,先以 Linux 架的网站,在系统负荷过高时,可以快速地将整个系统移到 SUN 工作站上,不用重新编译 CGI 程序。面对快速发展的 Internet,这是长期规划的最好选择。

变数类型:

PHP有好多种变数; 主要有这些:

- 数字 (integer - 例: 32)

- 布林值 (boolean - 例: TRUE)

- 字串 (string - 例: 'a string of text')

- NULL

- 资源(resource)

- 阵列 (array - 例: arrayname[2])

语法:

语法有三种:

//comment

/* comment */

# comment

基本的 "Control Structures":

* if ... else

if (condition == true) ;

* if ... else then

if (condition == true)

else if (condition2 == true) ;

一个PHP实例:

html

head

titleFirst program/title

/head

body

?php

echo "hello world";

?

/body

/html

请看:

php对面向对象的支持

面向对象编程的概念:

不同的作者之间说法可能不一样,但是一个OOP语言必须有以下几方面:

抽象数据类型和信息封装

继承

多态

在PHP中是通过类来完成封装的:

?php

class Something {

// 在OOP类中,通常第一个字符为大写

var $x;

function setX($v) {

// 方法开始为小写单词,然后使用大写字母来分隔单词,例如getValueOfArea()

$this-x=$v;

}

function getX() {

return $this-x;

}

}

当然你可以按自己的喜好进行定义,但最好保持一种标准,这样会更有效。数据成员在类中使用"var"声明来定义,在给数据成员赋值之前,它们是没有类型的。一个数据成员可以是一个整数,一个数组,一个相关数组(associative array)或者是一个对象。方法在类中被定义成函数形式,在方法中访问类成员变量时,你应该使用$this-name,否则对一个方法来说,它只能是局部变量。

使用new操作符来创建一个对象:

$obj=new Something;

然后你可以使用成员函数通过:

$obj-setX(5);

$see=$obj-getX();

在这个例子中,setX成员函数将5赋值给对象的成员变量x(不是类的),然后getX返回它的值5。可以象:$obj-x=6那样通过类引用方式来存取数据成员,这不是一个很好的OOP习惯。我强烈建议通过方法来存取成员变量。如果你把成员变量看成是不可处理的,并且只通过对象句柄来使用方法,你将是一个好的OOP程序员。不幸的是,PHP不支持声明私有成员变量,所以不良代码在PHP中也是允许的。继承在PHP中很容易实现,只要使用extend关键字。

?php

class Another extends Something {

var $y;

function setY($v) {

$this-y=$v;

}

function getY() {

return $this-y;

}

}

"Another"类的对象现在拥有了父类(Something)的全部的数据成员及方法,而且还加上了自己的数据成员和方法。

你可以使用

$obj2=new Something;

$obj2-setX(6);

$obj2-setY(7);

PHP现在还不支持多重继承,所以你不能从两个或两个以上类派生出新的类来。你可以在派生类中重定义一个方法,如果我们在"Another"类中重定义了getX方法,我们就不能使 用"Something"中的getX方法了。如果你在派生类中声明了一个与基派同名的数据成员,那么当你处理它时, 它将“隐藏”基类的数据成员。

你可以在你的类中定义构造函数。构造函数是一个与类名同名的方法,当你创建一个类的对象时会被调用,例如:

?php

class Something {

var $x;

function Something($y) {

$this-x=$y;

}

function setX($v) {

$this-x=$v;

}

function getX() {

return $this-x;

}

}

所以你可以创建一个对象,通过:

$obj=new Something(6);

构造函数会自动地把6赋值给数据变量x。构造函数和方法都是普通的PHP函数,所以你可以使用缺省参数。

function Something($x="3",$y="5")

接着:

$obj=new Something(); // x=3 and y=5

$obj=new Something(8); // x=8 and y=5

$obj=new Something(8,9); // x=8 and y=9

缺省参数使用C++的方式,所以你不能忽略Y的值,而给X一个缺省参数,参数是从左到右赋值的,如果传入的参数少于要求的参数时,其作的将使用缺省参数。

当一个派生类的对象被创建时,只有它的构造函数被调用,父类的构造函数没被调用,如果你想调用基类的构造函数,你必须要在派生类的构造函数中显示调用。可以这样做是因为在派生类中所有父类的方法都是可用的。

?php

function Another() {

$this-y=5;

$this-Something();

//显示调用基类构造函数

}

OOP的一个很好的机制是使用抽象类。抽象类是不能实例化,只能提供给派生类一个接口。设计者通常使用抽象类来强迫程序员从基类派生,这样可以确保新的类包含一些期待的功能。在PHP中没有标准的方法,但是:如果你需要这个特性,可以通过定义基类,并在它的构造函数后加上"die" 的调用,这样就可以保证基类是不可实例化的,现在在每一个方法(接口)后面加上"die" 语句,所以,如果一个程序员在派生类中没有覆盖方法,将引发一个错误。而且因为PHP 是无类型的,你可能需要确认一个对象是来自于你的基类的派生类,那么在基类中增加一个方法来实义类的身份(返回某种标识id),并且在你接收到一个对象参数时校验这个值。当然,如果一个邪恶不好的程序员在派生类中覆盖了这个方法,这种方法就不起作用了,不过一般问题多发现在懒惰的程序员身上,而不是邪恶的程序员。

当然,能够让基类对程序员无法看到是很好的,只要将接口打印出来做他们的工作就可以了。在PHP中没有析构函数。

重载(与覆盖不同)在PHP中不支持。在OOP中,你可以重载一个方法来实现两个或重多的方法具有相同的名字,但是有不同数量或类型的参数(这要看语言)。PHP 是一种松散类型的语言,所以通过类型重载不起作用,然而通过参数的个数不同来重载也不起作用。

有时在OOP中重载构造函数非常好,这样你可以通过不同的方法创建对象(传递不同数量的参数)。在PHP中实现它的技巧是:

?php

class Myclass {

function Myclass() {

$name="Myclass".func_num_args();

$this-$name();

//注意$this-name()一般是错误的,但是在这里$name是一个将被调用方法的名字

}

function Myclass1($x) {

code;

}

function Myclass2($x,$y) {

code;

}

}

通过在类中的额外的处理,使用这个类对用户是透明的:

$obj1=new Myclass('1'); //将调用Myclass1

$obj2=new Myclass('1','2'); //将调用Myclass2

有时这个非常好用。

多态

多态是对象的一种能力,它可以在运行时刻根据传递的对象参数,决定调用哪一个对象的方法。例如,如果你有一个figure的类,它定义了一个draw的方法。并且派生了circle和rectangle 类,在派生类中你覆盖了draw方法,你可能还有一个函数,它希望使用一个参数x,并且可以调用$x-draw() 。如果你有多态性,调用哪个draw方法就依赖于你传递给这个函数的对象类型。

多态性在象PHP这样的解释语言(想象一下一个C++编译器生成这样的代码,你应该调用哪一个方法?你也不知道你拥有的对象是什么类型的,好,这不是重点)是非常容易和自然的。所以PHP当然支持多态性。

?php

function niceDrawing($x) {

//假设这是Board类的一个方法

$x-draw();

}

$obj=new Circle(3,187);

$obj2=new Rectangle(4,5);

$board-niceDrawing($obj);

//将调用Circle的draw方法

$board-niceDrawing($obj2);

//将调用Rectangle的draw方法

用PHP进行面向对象编程

一些"纯化论者(purists)"可能会说PHP不是一个真正的面向对象的语言,这是事实。PHP 是一个混合型语言,你可以使用OOP,也可以使用传统的过程化编程。然而,对于大型项目,你可能想/需要在PHP 中使用纯的OOP去声明类,而且在你的项目只用对象和类。

随着项目越来越大,使用OOP可能会有帮助,OOP代码很容易维护,容易理解和重用。这些就是软件工程的基础。在基于web的项目中应用这些概念就成为将来网站成功的关键。

PHP的高级OOP技术

在看过基本的OOP概念后,我就可以向你展示更高级的技术:

序列化(Serializing)

PHP不支持永久对象,在OOP中永久对象是可以在多个应用的引用中保持状态和功能的对象,这意味着拥有将对象保存到一个文件或数据库中的能力,而且可以在以后装入对象。这就是所谓的序列化机制。PHP 拥有序列化方法,它可以通过对象进行调用,序列化方法可以返回对象的字符串表示。然而,序列化只保存了对象的成员数据而不包话方法。

在PHP4中,如果你将对象序列化到字符串$s中,然后释放对象,接着反序列化对象到$obj,你可以继续使用对象的方法!我不建议这样去做,因为(a)文档中没有保证这种行为在以后的版本中仍然可以使用。(b) 这个可能导致一种误解,在你把一个序列化后的版本保存到磁盘并退出脚本时。当以后运行这个脚本时,你不能期待着在反序列化一个对象时,对象的方法也会在那里,因为字符串表示根本就不包括方法。

总而言之,PHP 进行序列化对于保存对象的成员变量非常有用。(你也可以将相关数组和数组序列化到一个文件中)。

例子 :

?php

$obj=new Classfoo();

$str=serialize($obj);

//保存$str到磁盘上

//几个月以后

//从磁盘中装入str

$obj2=unserialize($str)

你恢复了成员数据,但是不包括方法(根据文档所说)。这导致了只能通过类似于使用$obj2-x来存取成员变量(你没有别的方法!)的唯一办法,所以不要在家里试它。

有一些办法可以解决这个问题,我把它留着,因为对这篇简洁的文章来说,他们太不好。我会很高兴地欢迎在PHP的后续版本中有全序列化的特性。

使用类进行数据存储PHP和OOP一件非常好的事情就是,你可以很容易地定义一个类来操作某件事情,并且无论何时你想用的时候都可以调用相应的类。假设你有一个HTML表单,用户可以通过选择产品ID号来选择一个产品。在数据库中有产品的信息,你想把产品显示出来,显示它的价格等等。你拥有不同类型的产品,并且同一个动作可能对不同的产品具有不同的意思。例如,显示一个声音可能意味着播放它,但是对于其它种类的产品可能意味着显示一个存在数据库中的图片。你可以使用OOP或PHP来减少编码并提高质量:

定义一个产品的类,定义它应该有的方法(例如:显示),然后定义对每一种类型的产品的类,从产品类派后出来(SoundItem类,ViewableItem类,等等),覆盖在产品类中的方法,使它们按你的想法动作。

根据数据库中每一种产品的类型(type)字段给类命名,一个典型的产品表可能有(id, type, price, description, 等等字段)...然后在处理脚本中,你可以从数据库中取出type值,然后实例化一个名为type的对象:

?php

$obj=new $type();

$obj-action();

这是PHP的一个非常好的特性,你可以不用考虑对象的类型,调用$obj的显示方法或其它的方法。使用这个技术,你不需要修改脚本去增加一个新类型的对象,只是增加一个处理它的类。

这个功能很强大,只要定义方法,而不去考虑所有对象的类型,在不同的类中按不同的方法实现它们,然后在主脚本中对任意对象使用它们,没有if...else,也不需要两个程序员,只有高兴。

现在你同意编程是容易的,维护是便宜的,可重用是真的吗?

如果你管理一组程序员,分配工作就是很简单的了,每个人可能负责一个类型的对象和处理它的类。

可以通过这个技术实现国际化,根据用户所选的语言字段应用相应的类就可以了,等等。

拷贝和克隆

当你创建一个$obj的对象时,你可以通过$obj2=$obj来拷贝对象,新的对象是$obj的一个拷贝(不是一个引用),所以它具有$obj在当时的状态。有时候,你不想这样,你只是想生成一个象obj类一样的一个新的对象,可以通过使用new语句来调用类的构造函数。在PHP中也可以通过序列化,和一个基类来实现,但所有的其它类都要从基类派生出来。

进入危险区域

当你序列化一个对象,你会得到某种格式的字符串,如果你感兴趣,你可以调究它,其中,字符串中有类的名字(太好了!),你可以把它取出来,象:

?php

$herring=serialize($obj);

$vec=explode(':',$herring);

$nam=str_replace("\"",'',$vec[2]);

所以假设你创建了一个"Universe"的类,并且强制所有的类都必须从universe扩展,你可以在universe 中定义一个clone的方法,如下:

?php

class Universe {

function clone() {

$herring=serialize($this);

$vec=explode(':',$herring);

$nam=str_replace("\"",'',$vec[2]);

$ret=new $nam;

return $ret;

}

}

//然后

$obj=new Something();

//从Universe扩展

$other=$obj-clone();

你所得到的是一个新的Something类的对象,它同使用new方法,调用构造函数创建出的对象一样。我不知道这个对你是否有用,但是Universe类可以知道派生类的名字是一个好的经验。想象是唯一的限制。

php的最新版本是5.2.3(2007-07-01更新)

什麼是PHP? 什麼是SQL?

PHP 是一种服务器端的,嵌入HTML的脚本语言。PHP区别其他像客户端Javascript的地方是它的代码在服务器端执行.PHP能做什么?

最低水平,PHP可以做任何其他CGI程序所能做的事,例如收集表格数据,生成动态页面内容,或者收发cookies.可能最强大,最有意义的特性是PHP支持大范围的数据库.书写一个支持数据库的Web 页面是难以置信的简单.

下面是当前支持的数据库:

Adabas D InterBase Solid

dBase mSQL Sybase

Empress MySQL Velocis

FilePro Oracle Unix dbm

Informix PostgreSQL

PHP通过协议也支持与其他服务的"交谈",像IMAP, SNMP, NNTP, POP3, 甚至是 HTTP. 你也可以打开晦涩的 网络接口和其他协议交互.

PHP的简要历史

1994年秋季, Rasmus Lerdorf 开始构思 PHP. 早期的非发行版本被用在他的主页上,以追踪谁在看他的在线简历. 1995年年初第一版本出台,当时PHP只被认为是个人主页开发工具.它由一个非常单纯的只能理解很少数特殊宏的分析引擎和 一些用在主页后端通用的工具组成.如留言簿,计数器和其他一些东西.这个分析器在1995年年中被重写并被命名为 PHP/FI 第二版. FI来自 Rasmus 写的另外一个包, 用于解释 html 形式的数据.他结合了个人主页工具脚本和形式解析器,并加 上mSQL支持.这样就产生 PHP/FI 了. PHP/FI以令人惊奇的步调成长,人们开始把自己的代码贡献给它.

很难给出它的硬统计表,但可以估计在1996年末,整个世界至少有15,000个网站在用PHP/FI.到1997年年中,这个 数字已经超过50,000了. 而在此时PHP的发展也发生了变化.由Rasmus自己偏爱的和几个人开发的项目变成一个更有组织的团 体成就.Zeev Suraski和Andi Gutmans重写了解析器.这个新的解析器成为PHP版本3的基础.许多有用的代码从PHP/FI 继承到PHP3,并且很多是完全重写的.

今天(1999年年中)不管是PHP/FI或PHP3与很多商业产品捆绑在一块,例如C2级强度的Web服务器和红帽子Linux. 根据NetCraft提供的数据推断,保守估计全世界应用PHP的网站已超过150,000个.由此看来,它比在因特网上运行Netscape 的旗舰企业服务器的站点还多.

PHP 是一种用来制作动态网页的服务器端脚本语言。你通过PHP和HTML创建页面。当访问者打开网页时,服务器端便会处理 PHP 指令,然后把其处理结果送到访问者的浏览器上面,就好像 ASP 或者是 ColdFusion 一样。然而,PHP 跟 ASP 或 ColdFusion 不一样的地方在于,它是跨平台的开放源代码。PHP 可以在 Windows NT 以及很多不同的 Unix 版本中执行,它也可以被编译为一个 Apache 模块,或者是一个CGI二进制文件。当被编译为 Apache 模快时,PHP 尤其轻巧方便。它没有任何繁琐程序所产生的负担,因此可以很快的返回结果,同时也不需为了保持较小的服务器内存映象,而去调整mod_perl。

1. 引言

SQL是什麼?

* SQL (Structured Query Language)代表结构化查询语言。

* 当用户发出一项查询,便可从数据库档内获得若干资料。这项查询是根据用户所提供的条件 (condition) 所作出的一项检索。而 SQL则是一个可让用户把条件列明的查询语言。这样,用户只须列明查询的条件,而不须要实际知道有关的检索方法。

* 一般的数据库管理软件系统 (DBMS) 都包含 SQL 功能。

SQL的概念

* 通过 SQL 指令,用户先列出数据库档及查询的条件, SQL 程序便会在这数据库档内检查每笔记录是否符合这项条件,并把有关的资料显示出来。这个过程称为检索。 (见例 2)

* 用户除了直接查问各笔记录的资料外,也可查问统计数项,例如最大值、最小值、总和及平均值。

* 查询所得的结果会以表格的形式显示,用户亦可指示 SQL 程序把结果贮存成为数据库档。

在 FoxPro 如何使用 SQL

* 使用 SQL,必须先把有关数据库档开启。

* 用户可使用指令视窗 (Command Window) 直接把指令输入,亦可使用对话方块把指令输入。

* 若用户选用字符串的完全配对时,便须输入 SET ANSI ON。

2. SQL检索指令的基本结构

一般语法 SELECT, ALL / DISTINCT, *,

AS, FROM, WHERE

比较 IN, BETWEEN, LIKE "% _"

群组 GROUP BY, HAVING,

COUNT( ), SUM( ), AVG( ), MAX( ), MIN( )

显示次序 ORDER BY, ASC / DESC

逻辑运算符 AND, OR, NOT

输出 INTO TABLE / CURSOR

TO FILE [ADDITIVE], TO PRINTER, TO SCREEN

联合 UNION

简称:

expr = 表达式 expression, groupexpr = 群组表达式 group expression

col = 栏 column, comcol = 共同栏 common column

colname = 栏名 column name

nullval = 空值 null value

实例:学生个人资料

例子: 考虑以下贮存学生数据的数据库档 STUDENT. DBF:

(i) hcode 表示学生的社名(即红黄蓝绿四社)。

R = Red, Y = Yellow, B = Blue, G = Green

(ii) dcode 表示学生的居住地区码。

eg. TST = 尖沙咀(Tsim Sha Tsui), MKK = 旺角(Mong Kok)

(iii) remission 表示学生是否享有学费减免:

.T. =享有学费减免, .F. = 没有学费减免

(iv) mtest 贮存学生数学测验的分数,满分为100。

栏名 类型 栏宽 内容

id 数字 4 学生编号

name 字符 10 学生名字

dob 日期 8 出生日期

sex 字符 1 性别: M / F

class 字符 2 班别

hcode 字符 1 社名: R, Y, B, G

dcode 字符 3 地区码

remission 逻辑 1 学费减免

mtest 数字 2 数学测验分数

I 一般语法

SELECT ...... FROM ...... WHERE ......

SELECT [ALL / DISTINCT] expr1 [AS col1], expr2 [AS col2] ;

FROM tablename WHERE condition

– SQL 程序会从数据库档 tablename 选取符合条件的横列 (row) 并以表格的格式显示。

– 表达式 expr1, expr2 可以是 (1) 字段,或 (2) 以函数和字段组成的表达式。

– 而 col1, col2 是表达式 expr1, expr2 在输出结果的表格内的栏名。

– 选项 DISTINCT 会把重覆出现的横列删去(即只显示一次),而选项 ALL 则会把所有重覆的保留。

– 条件 condition 可以是 (1) 等式或不等式,或 (2) 字符串的比较,并使用逻辑运算符 AND, OR, NOT。

在使用SQL之前,开启数据库档:

USE student

例 1 求出所有学生的资料。

SELECT * FROM student

注意: 1) 这个指令并不提出任何条件,所以把 WHERE 部分省去。

2) 在 SELECT 部分中使用 * 来表示拣选来源表格的所有栏。

3) 查询所得的结果将贮存於一个暂时的表格内。

id

name dob sex class mtest hcode dcode remission

9801 Peter 06/04/86 M 1A 70 R SSP .F.

9802 Mary 01/10/86 F 1A 92 Y HHM .F.

9803 Johnny 03/16/86 M 1A 91 G SSP .T.

9804 Wendy 07/09/86 F 1B 84 B YMT .F.

9805 Tobe 10/17/86 M 1B 88 R YMT .F.

: : : : : : : : :

例 2 求出 1A 班学生的名字和社名。

SELECT name, hcode, class FROM student ;

WHERE class="1A"

注意: 这例使用条件 class="1A" 拣选 1A 班学生:SQL 程序会从来源表格中的每一横列逐一地检查是否符合这条件。然后 SQL 程序会根据 SELECT 的选项而保留这些横列内的三栏,即 name, hcode 及 class。最后程序会把所得的结果贮存於一个暂时的表格内。

name

hcode class

Peter R 1A

Mary Y 1A

Johnny G 1A

Luke G 1A

Bobby B 1A

Aaron R 1A

: : :

例 3 求出红社社员的居住地区。(hcode="R")

SELECT DISTINCT dcode FROM student ;

WHERE hcode="R"

注意: 若两个或以上的学生居住於同一地区,使用选项 DISTINCT 便可把重覆的结果省去。

dcode

HHM

KWC

MKK

SSP

TST

YMT

例 4 求出 1B 班女生的名字和年龄。(准至一位小数)

SELECT name, ROUND((DATE( )-dob)/365,1) AS age FROM student ;

WHERE class="1B" AND sex="F"

注意: 1) 「1B 班女生」的条件包括两部分:class="1B" 和 sex="F"。而这项条件必须同时符合,所以要使用逻辑运算符 AND。

2) 在这数据库档裏并没有一栏直接贮存年龄,所以我们须要使用学生的出生日期 dob 来计算。首先,DATE( )-dob 表示该生的"日岁",再除 365 就变成"年岁"。再用选项 AS age 去说明该栏的名称。

name

age

Wendy 12.1

Kitty 11.5

Janet 12.4

Sandy 12.3

Mimi 12.2

例 5 求出 1A 班没有学费减免的学生的名字和编号。

SELECT name, id, class FROM student ;

WHERE class="1A" AND NOT remission

注意: 1) 这裏包括两项条件:学生必须是 1A 班,而且没有享有学费减免。 所以在 WHERE 部分中加上运算符 AND。

2) 因 remission 是一个逻辑字段,所以可直接在逻辑表达式中使用 。在 remission 之前加上 NOT 便把意思相反。

name

id class

Peter 9801 1A

Mary 9802 1A

Luke 9810 1A

Bobby 9811 1A

Aaron 9812 1A

Ron 9813 1A

Gigi 9824 1A

: : :

II 比较

expr IN ( value1, value2, value3)

expr BETWEEN value1 AND value2

expr LIKE "%_"

– 在 WHERE 部分中,可使用以上的比较条款:

1) 若 expr 的值是相等於 value1, value2, value3 其中的一个时,条款 expr IN ( value1, value2, value3) 便会送回逻辑值 .T.。而 expr 可以是数值或字符串。

2) 若expr 是界乎於 value1 和 value2 之间,条款

expr BETWEEN value1 AND value2 便会送回逻辑值 .T.。

3) 若字符串 expr 符合 "%_" 的样式,条款 expr LIKE "%_" 便会送回逻辑值 .T.。在样式中, "%" 代表任何长度的字符串,而 "_" 则代表任何的单一字符。

例 6 求出所有出生於星期三或星期六的学生。

SELECT name, class, CDOW(dob) AS bdate FROM student ;

WHERE DOW(dob) IN (4,7)

注意: 学生若在星期三星期六出生, DOW(dob) 使会送回 数值 4 或 7,所以用 IN (4,7) 来检查。

name

class bdate

Peter 1A Wednesday

Wendy 1B Wednesday

Kevin 1C Saturday

Luke 1A Wednesday

Aaron 1A Saturday

: : :

例 7 求出所有不是在一月、三月、六月或九月出生的学生。

SELECT name, class, dob FROM student ;

WHERE MONTH(dob) NOT IN (1,3,6,9)

注意: 我们不想 MONTH(dob) = 1, 3, 6 或 9, 所以使用 NOT IN (1,3,6,9) 来检查。

name

class dob

Wendy 1B 07/09/86

Tobe 1B 10/17/86

Eric 1C 05/05/87

Patty 1C 08/13/87

Kevin 1C 11/21/87

Bobby 1A 02/16/86

Aaron 1A 08/02/86

: : :

例 8 求出1A 班的学生名字,其数学测验分数界乎於 80 至 90 分之间。

SELECT name, mtest FROM student ;

WHERE class="1A" AND mtest BETWEEN 80 AND 90

注意: 1) 这裏用了两个条件:第一个是 class="1A",第二个是测验分数界乎於 80 至 90 分之间。这两个条件必须同时成立,所以须用 AND。

2) 测验分数界乎於 80 至 90 分之间可用 mtest BETWEEN 80 AND 90 来表示。

name

mtest

Luke 86

Aaron 83

Gigi 84

例 9 求出所有学生其名字是以 "T" 为起首。

SELECT name, class FROM student ;

WHERE name LIKE "T%"

注意: 这裏所用的样式是 "T%" ,这表示第一个字符必须是 "T" 而其后可以是任何的字符串。

name

class

Tobe 1B

Teddy 1B

Tim 2A

例10 求出所有红社社员其名字的第二个字母是"a"。

SELECT name, class, hcode FROM student ;

WHERE name LIKE "_a%" AND hcode="R"

注意: 这裏所用的样式是 "_a%" ,而其中的 "_" 符号代表任何单一字符,亦即第一个字符是任意的。第二个字符则必须是 "a",而其后的 "%" 代表任何的字符串。

name

class hcode

Aaron 1A R

Janet 1B R

Paula 2A R

III 群组

SELECT ...... FROM ...... WHERE condition ;

GROUP BY groupexpr [HAVING requirement]

群组函数: COUNT( ), SUM( ), AVG( ), MAX( ), MIN( )

–GROUP BY groupexpr 列出群组组成所依照的表达式。一般都是数据库档的一栏。

– WHERE condition 列出个别横列所须符合的条件,而 HAVING requirement 则列出个别群组须符合的条件。

– 可使用以群组函数来计算统计数项:

COUNT( ): 记录出现的目数

SUM( ): 总和

AVG( ): 平均值

MAX( ): 最大值

MIN( ): 最小值

例11 求出每一班的人数。

SELECT class, COUNT(*) FROM student

GROUP BY class

注意: 1) 使用 GROUP BY class, SQL 程序便会先把表格裏的横列按照 class 排列起来。

2) 然后 SQL 程序会把相连的横列依照 class 来群组。

3) 最后使用群组函数 COUNT(*) 去算数每组的数目。

class

cnt

1A 10

1B 9

1C 9

2A 8

2B 8

2C 6

例12 求出每一班的数学测验平均分。

SELECT class, AVG(mtest) FROM student GROUP BY class

注意: SQL 程序会先依照 class 来群组,然后在每一组中计算该组的 mtest 平均值。

class

avg_mtest

1A 85.90

1B 70.33

1C 37.89

2A 89.38

2B 53.13

2C 32.67

例13 求出每一居住地区的女生数目。

SELECT dcode, COUNT(*) FROM student ;

WHERE sex="F" GROUP BY dcode

注意: 查询的条件为 sex="F"。而 SQL 程序会先把符合这条件的横列选出,然后把这些横列依照 dcode 为群组。

dcode

cnt

HHM 6

KWC 1

MKK 1

SSP 5

TST 4

YMT 8

例14 求出每一区中一学生数学测验的最高分及最低分。

SELECT MAX(mtest), MIN(mtest), dcode FROM student ;

WHERE class LIKE "1_" GROUP BY dcode

max_mtest

min_mtest dcode

92 36 HHM

91 19 MKK

91 31 SSP

92 36 TST

75 75 TSW

88 38 YMT

注意: 这例使用条件 class LIKE "1_" 来拣选每区的中一学生。

例15 列出每一班男生数学测验的平均分,但男生人数不及三人的班则不计算在内。

SELECT AVG(mtest), class FROM student ;

WHERE sex="M" GROUP BY class HAVING COUNT(*) = 3

注意: SQL 程序会先把符合个别条件 sex="M" 的横列拣选出来,然后依照 class 来群组并计算每组的 mtest 平均值。最后 SQL 程序会检查群组条件 COUNT(*) = 3。(这例中 2C 班男生人数不及三人,所以并没有在结果裏显示出来。)

avg_mtest

class

86.00 1A

77.75 1B

35.60 1C

86.50 2A

56.50 2B

IV 显示次序

SELECT ...... FROM ...... WHERE ...... GROUP BY ..... ;

ORDER BY colname ASC / DESC

– ORDER BY colname 控制结果的显示序。而 colname 代表结果表格的一栏。而ASC = 升幂, DESC = 降幂。

例16 列出 1A 班男生的名字,并按名字序显示。

SELECT name, id FROM student ;

WHERE sex="M" AND class="1A" ORDER BY name

name id name id

Peter

9801 Aaron 9812

Johnny 9803 Bobby 9811

Luke 9810 Johnny 9803

Bobby 9811 Luke 9810

Aaron 9812 Peter 9801

Ron 9813 Ron 9813

例17 列出 2A 班的学生资料,并按居住地区序显示。

SELECT name, id, class, dcode FROM student ;

WHERE class="2A" ORDER BY dcode

name id class dcode

Jimmy 9712 2A HHM

Tim 9713 2A HHM

Samual 9714 2A SHT

Rosa 9703 2A SSP

Helen 9702 2A TST

Joseph 9715 2A TSW

Paula 9701 2A YMT

Susan 9704 2A YMT

例18 求出每区居住学生的人数,并按降幂显示。

SELECT COUNT(*) AS cnt, dcode FROM student ;

GROUP BY dcode ORDER BY cnt DESC

cnt

docode

11 YMT

10 HHM

10 SSP

9 MKK

5 TST

2 TSW

1 KWC

1 MMK

1 SHT

例19 列出每社的男社员名字并按班别序显示。(即社和班的两层次序)

SELECT name, hcode, class FROM student ;

WHERE sex="M" ORDER BY hcode, class

注意: 这些横列先按 hcode 排列(即第一层排列);而相同的 hcode,再按 class 次序显示。

name hcode class

Bobby

B 1A

Teddy B 1B

Joseph B 2A

Zion B 2B

Leslie B 2C

Johnny G 1A

Luke G 1A

Kevin G 1C

George G 1C

: : :

: : :

V 输出

INTO TABLE tablename

把查询所得的结果贮存成数据库档。

INTO CURSOR temp

把查询所得的结果暂时贮存於电脑的工作记忆裏。

TO FILE filename [ADDITIVE]

把查询所得的结果贮存成文字档。(additive = 附加)

TO PRINTER 输出到列印机。

TO SCREEN 输出到萤幕。

例20 按学生名字的降幂,列出学生的所有资料,并把结果贮存成数据库档NAME.DBF。

SELECT * FROM student ;

ORDER BY name DESC INTO TABLE name.dbf

注意: 1) INTO TABLE name.dbf 要求 SQL 程序把结果贮存成档案。

2) 这指令相等於数据库指令 SORT。

3) SQL 程序会把结果贮存成一个新的数据库档 name.dbf。

id

name dob sex class mtest hcode dcode remission

9707 Zion 07/29/85 M 2B 51 B MKK .F.

9709 Yvonne 08/24/85 F 2C 10 R TST .F.

9804 Wendy 07/09/86 F 1B 84 B YMT .F.

9819 Vincent 03/15/85 M 1C 29 Y MKK .F.

9805 Tobe 10/17/86 M 1B 88 R YMT .F.

9713 Tim 06/19/85 M 2A 91 R HHM .T.

9816 Teddy 01/30/86 M 1B 64 B SSP .F.

:

: : : : : : : :

例21 按社员的班别、性别及名字的次序,把红社社员的资料列印出来。

SELECT class, name, sex FROM student ;

WHERE hcode="R" ;

ORDER BY class, sex DESC, name TO PRINTER

注意: 1) 这指令要求程序先找出绿社社员,然后把这些横列以 class, sex 和 name 的次序排列。

2) SQL 程序先把查询的结果暂时贮存於工作记忆裏,然后把这结果输出到打印机。

class

name sex

1A

Aaron M

1A

Peter M

1A Ron M

1B Tobe M

1B Janet F

1B Kitty F

1B

Mimi F

: : :

3. 数据库联合、相交及差分

考虑两个结构相同的数据库档 A 和 B。

A 和 B 的联合

(A B) union

检取属於 A 或 B 的所有横列。

A 和 B 的相交

(A B) intersection

检取 A 和 B 所共有的横列。

A 和 B 的差分

(A–B) difference 检取只属於 A 而不属於 B 的横列。(即从 A 把 B 的部分排出)

SELECT ...... FROM ...... WHERE ...... ;

UNION ;

SELECT ...... FROM ...... WHERE ......

SELECT ...... FROM table1 ;

WHERE col IN ( SELECT col FROM table2 )

SELECT ...... FROM table1 ;

WHERE col NOT IN ( SELECT col FROM table2 )

实例:桥牌会和棋艺会

考虑学校桥牌会和棋艺会的会员,他们的资料分别贮存於同一结构的数据库档 BRIDGE.DBF 和 CHESS.DBF 内:

栏名 类型 栏宽 内容

id 数字 4 学生编号

name 字符 10 学生名字

sex 字符 1 性别: M / F

class 字符 2 班别

Bridge [A] Chess [B]

id name sex class id name sex class

1 9812 Aaron M 1A 1 9802 Mary F 1A

2 9801 Peter M 1A 2 9801 Peter M 1A

3 9814 Kenny M 1B 3 9815 Eddy M 1B

4 9806 Kitty F 1B 4 9814 Kenny M 1B

5 9818 Edmond M 1C 5 9817 George M 1C

: : : : : : : :

在使用SQL之前,开启这两个数据库档:

SELECT A

USE bridge

SELECT B

USE chess

例22 本校计划举行一次 "棋桥活动",所有棋艺会和桥牌会的会员必须出席。试以班别和名字的次序,列出两会会员的名单。(即两会的联合)

SELECT * FROM bridge ;

UNION ;

SELECT * FROM chess ;

ORDER BY class, name INTO TABLE party

注意: 所要求的是两会的所有会员,这便是两会的联合。

Party

id name sex class

1 9812 Aaron M 1A

2 9802 Mary F 1A

3 9801 Peter M 1A

4 9815 Eddy M 1B

5 9814 Kenny M 1B

6 9806 Kitty F 1B

7 9818 Edmond M 1C

8 9817 George M 1C

: : : :

例23 列印两会的共同会员。(即两会的相交)

SELECT * FROM bridge ;

WHERE id IN ( SELECT id FROM chess ) ;

TO PRINTER

注意: 这例须找出两会所共通的会员。SQL 程序须检查桥牌会的每一个会员是否也属於棋艺会。若是属於的话,这人便符合这个要求了。

Common

id name sex class

1 9801 Peter M 1A

2 9814 Kenny M 1B

: : : :

例24 求出只参加了桥牌会的会员名单。(即两会之差分)

SELECT * FROM bridge ;

WHERE id NOT IN ( SELECT id FROM chess ) ;

INTO TABLE diff

注意: 1) 这例须从桥牌会中拣选那些并不属於棋艺会的人。所以 SQL 程序须使用 FROM bridge,即从逐一检查桥牌会的会员是否属於棋艺会,若不属於的话,这人便符合这个要求了。

2) "差分"不是对称的:若想找出"只参加了棋艺会的会员名单",其结果则会完全不同。

Diff

Id name sex class

1 9812 Aaron M 1A

2 9806 Kitty F 1B

3 9818 Edmond M 1C

: : : :

4. 多个数据库

当所查询的资料贮放於两个数据库档时,就须使用接合 (join)。 接合的作用是把一个数据库档内的一个横列与另一个数据库档内的横列连合起来,从而把所有不同的组合列出来。 (数学: Cartesian Product)

自然接合

* 在接合中加上一项接合条件,要求两档的共通栏(common column)的值是相同,这称为自然接合。这目的是要把这两档的相关资料连合起来,变成一个合一的大表格,再从这表格中执行查询工作。

考虑以下两个数据库档 T1 和 T2:

SELECT a.comcol, a.col1, b.col2, expr1, expr2 ;

FROM table1 a, table2 b ;

WHERE a.comcol = b.comcol

– 在自然接合中,这两个数据库档须要有一个栏是相同的,这一栏称为共通栏 。SQL 程序会先把这两档的所有组合列出,然后从中拣选共通栏的值是相同的横列。

– a 和 b 分别是 table1 和 table2的代号,用以指明各栏所属的档。

– 表达式 expr1, expr2 可以使用 table1 和 table2内的各栏。

实例:乐器班

学校规定每个学生都须要学习一件乐器。现在使用数据库档 MUSIC.DBF 贮存学生所学的乐器名称 (而学生的其他资料则贮存於 STUDENT.DBF 内)

栏名 类型 栏宽 内容

id 数字 4 学生编号

type 字符 10 乐器名称

例25 列出所有学生的名字及所学习的乐器名称。

SELECT s.class, s.name, s.id, m.type FROM student s, music m ;

WHERE s.id=m.id ORDER BY class, name

注意: 1) 这裏用了s 代表 student.dbf 而 m 代表 music.dbf。

2) 接合条件是 s.id=m.id,表示两档的横列须要依照 id 而接合。

class

name id type

1A Aaron 9812 Piano

1A Bobby 9811 Flute

1A Gigi 9824 Recorder

1A Jill 9820 Piano

1A Johnny 9803 Violin

1A Luke 9810 Piano

1A Mary 9802 Flute

: : : :

例26 求出每班学习钢琴的学生数目。

SELECT s.class, COUNT(*) FROM student s, music m ;

WHERE s.id=m.id AND m.type="Piano" ;

GROUP BY class ORDER BY class

注意: 1) 裏先首先用了接合条件 s.id=m.id 把两档自然接合起来。

2) SQL 程序然后从接合的结果(表格形式)中再拣选去符合条件 m.type="Piano" 的横列。

3) 最后 SQL 程序会依照 class 而群组,并数算每班的数目。

class cnt

1A 4

1B 2

1C 1

外接合

* 外接合是自然接合再加上没有配合的部分。

SELECT a.common, a.column1, b.column2, expr1, expr2 ;

FROM table1 a, table2 b ;

WHERE a.comcol = b.comcol ;

UNION ;

SELECT comcol, col1, nullval, nullval, nullval ;

FROM table1 ;

WHERE a.comcol NOT IN ( SELECT comcol FROM table2 )

– 外接合的指令包括两个 SELECT 部分,再以 UNION 联会起来。

– 第一部分是自然接合(即成功接合),第二部分则是没有配合(即是在第一部分不能自然接合的横列)。

– 为了使第二部分与第一部分的结构一样,第二部分中没有数值的位置须填上空值 (null value),即空字符串""、数值零、 逻辑值 .F. 或空日期 { / / } 。

例27 列出尚未选择乐器的学生名字。(即没有相配)

SELECT class, name, id FROM student ;

WHERE id NOT IN ( SELECT id FROM music ) ;

ORDER BY class, name

注意: 1) 这指令会从 student.dbf 中选出那些在另一档 music.dbf 没有配合的横列。

2) ( SELECT id FROM music) 选出那些在数据库档 music.dbf 出现的 id,所以条件 id NOT IN (...) 能检索出没有配对的横列。

class

name id

1A Mandy 9821

1B Kenny 9814

1B Tobe 9805

1C Edmond 9818

1C George 9817

: : :

例28 列出一份名单,去查核所有学生学习的乐器。名单须包括尚未参加乐器班的学生名字。(即外接合)

SELECT s.class, s.name, s.id, m.type ;

FROM stu

PHP是什么?

PhP通过协议也支持与其他服务的"交谈",像imap, snmp, nntp, pop3, 甚至是 http. 你也可以打开晦涩的 网络接口和其他协议交互.

php的简要历史

1994年秋季, rasmus lerdorf 开始构思 php. 早期的非发行版本被用在他的主页上,以追踪谁在看他的在线简历. 1995年年初第一版本出台,当时php只被认为是个人主页开发工具.它由一个非常单纯的只能理解很少数特殊宏的分析引擎和 一些用在主页后端通用的工具组成.如留言簿,计数器和其他一些东西.这个分析器在1995年年中被重写并被命名为 php/fi 第二版. fi来自 rasmus 写的另外一个包, 用于解释 html 形式的数据.他结合了个人主页工具脚本和形式解析器,并加 上msql支持.这样就产生 php/fi 了. php/fi以令人惊奇的步调成长,人们开始把自己的代码贡献给它.

很难给出它的硬统计表,但可以估计在1996年末,整个世界至少有15,000个网站在用php/fi.到1997年年中,这个 数字已经超过50,000了. 而在此时php的发展也发生了变化.由rasmus自己偏爱的和几个人开发的项目变成一个更有组织的团 体成就.ev suraski和andi gutmans重写了解析器.这个新的解析器成为php版本3的基础.许多有用的代码从php/fi 继承到php3,并且很多是完全重写的.

今天(1999年年中)不管是php/fi或php3与很多商业产品捆绑在一块,例如c2级强度的web服务器和红帽子linux. 根据netcraft提供的数据推断,保守估计全世界应用php的网站已超过150,000个.由此看来,它比在因特网上运行netscape 的旗舰企业服务器的站点还多.

1.php是网页文件.需要有支持php的web服务器,才能通过浏览器打开.如果你实在要打开,用记事本也可以打开,不过里面是些网页代码.你不一定读得懂 .

2.你所下载的只不过是一个指向(或包含)那个手机铃声的网页,你要真正得到那个铃声的地址才能下载它 .

3.应该不是php,是pdf,你把后缀改一下,php文件是网页格式,用文本编辑器打开,但是本站提供的大部分是pdf格式的,安装一个pdf阅读器就能正常打开了.

4.“把扩展名改成 html ,然后用IE打开。”

5.如果安装了dreamwaver,php文件会显示dreamwaver可以打开的样式

不过用不着

到你下载过的贴子里,看你下载的那个东西的扩展名是什么,比如word文档后面就是.doc, pdf文档后面就是.pdf, 压缩文档后面就是.rar或 .zip之类的

然后把扩展名替换.php就能开了

我以前好像遇到过这种问题,好像是用下载工具下载的时候有些不默认修改回原来的扩展名吧。

一般论坛里的东西都不是很大,直接点击保存就行了,就不会遇到这种情况了

6.记事本其实就可以了

你要用Word、Fontpage也可以~

反正都是PHP脚本语言~

7.PHP文件是动态网页文件,它的运行需要ISS服务的支持,如果你想在IE浏览器中打开的话,必须安装ISS服务,否则无法运行。

ISS服务是INTERNET信息服务,安装步骤:

(1)控制面板--添加删除程序--添加删除组件---Internet信息服务--安装。安装完成后,会在管理工具中生成Internet信息服务组件,还会在C盘生成Inetpub文件夹,里面有一个WWWROOT文件夹。

(2)将你PHP文件放到WWWROOT文件夹中,必须是这个文件夹,放在其它文件夹无效.

(3)打开IE浏览器,在地址栏中输入:/****

****是你的PHP文件名,也可以将PHP文件名改为 default.asp,这样就不用输入文件名,直接回车就行了,127.0.0.1是指本地机器。

php 是什么

php 是一种服务器端的,嵌入html的脚本语言。php区别其他像客户端java的地方是它的代码在服务器端执行.php能做什么?

最低水平,php可以做任何其他cgi程序所能做的事,例如收集表格数据,生成动态页面内容,或者收发cookies.可能最强大,最有意义的特性是php支持大范围的数据库.书写一个支持数据库的web 页面是难以置信的简单.

下面是当前支持的数据库:

adabas d interbase solid

dbase msql sybase

empress mysql velocis

filepro oracle unix dbm

informix postgresql

php通过协议也支持与其他服务的"交谈",像imap, snmp, nntp, pop3, 甚至是 http. 你也可以打开晦涩的 网络接口和其他协议交互.

php的简要历史

1994年秋季, rasmus lerdorf 开始构思 php. 早期的非发行版本被用在他的主页上,以追踪谁在看他的在线简历. 1995年年初第一版本出台,当时php只被认为是个人主页开发工具.它由一个非常单纯的只能理解很少数特殊宏的分析引擎和 一些用在主页后端通用的工具组成.如留言簿,计数器和其他一些东西.这个分析器在1995年年中被重写并被命名为 php/fi 第二版. fi来自 rasmus 写的另外一个包, 用于解释 html 形式的数据.他结合了个人主页工具脚本和形式解析器,并加 上msql支持.这样就产生 php/fi 了. php/fi以令人惊奇的步调成长,人们开始把自己的代码贡献给它.

很难给出它的硬统计表,但可以估计在1996年末,整个世界至少有15,000个网站在用php/fi.到1997年年中,这个 数字已经超过50,000了. 而在此时php的发展也发生了变化.由rasmus自己偏爱的和几个人开发的项目变成一个更有组织的团 体成就.ev suraski和andi gutmans重写了解析器.这个新的解析器成为php版本3的基础.许多有用的代码从php/fi 继承到php3,并且很多是完全重写的.

今天(1999年年中)不管是php/fi或php3与很多商业产品捆绑在一块,例如c2级强度的web服务器和红帽子linux. 根据netcraft提供的数据推断,保守估计全世界应用php的网站已超过150,000个.由此看来,它比在因特网上运行netscape 的旗舰企业服务器的站点还多.

php数据分析

这个问题其实简单,你可以在foreach外先设置一个空数组,作用是把2016-11-29作为键 出现的次数作为value存储起来, 代码

$tmpArr = array();

foreach($ips as $key = $value)

{

$tmpArr[explode('_',$key)[0]] ++;

}

foreach($tmpArr as $key = $tmp)

{

echo $key." ".$tmp."br";

}

但是具体的数据结构要根据你自己情况来定。

北大青鸟设计培训:PHP相关技能的层次?

1、PHP编程能力 由于PHP的入门较为简单,所以暂时只有熟悉和精通两个级别。

1、熟悉PHP:精通PHP语法,沈阳IT培训建议掌握常用的函数,熟悉PHP5下的OOP应用,这个是基础,也没什么好说的。

2、精通PHP:对PHP运行机制的理解;对系统资源的调用交互理解;关健性能的优化能力。

2、MySQL能力 在开发上的应用基于几个能力体现: 1、了解:知道用PHP连接数据库;懂得写一些简单的SQL;建一些简单的索引;懂得用工具简单操作一下数据库(增删改库表结构数据等等)。

2、熟悉:懂得在开发应用上设计数据库,建立一些有效的索引,用explain分析SQL性能,压力测试等等。

3、很熟悉:深入了解数据库索引、存储引擎原理以及运行机制,能有效地构建高性能可扩展的数据库结构/架构,有效地优化数据库性能配置并加以调试,分析数据库运行状态。

4、精通:简单地说具备以上所有能力的同时,有多年高负载分布式环境下的优化管理经验。

据我观察以及交往经验,70%的PHPer处在了解阶段,25%处于熟悉阶段,4%很熟悉,精通的人基本就不是phper了。

70%这个群体最容易忽视MySQL,以为MySQL只是简单的存储媒介,没有优化意识,认为加个内存、CPU就能解决问题。

典型事件:join、orderby、groupby等语句性能一塌糊涂,数据库根本没有设计(仅限于拆成一个主表,N个附表等),搞不清字段类型及作用,碰到大表的复杂查询就没辙。

20%这个群体的人只是MySQL运行机制理解不透彻,对影响MySQL性能的关健因素把握不明确,不熟练。

典型事件:熟读手册,但说不清索引原理,不知道二叉树、HASH等算法对于数据库的作用 4%的群体已经基本可以胜任DBA的职能。

3、OOP能力 1、了解:了解变量的作用域、类型,及其意义,了解继承机制等,懂得复用、封装概念。

2、熟悉:熟练应用接口、抽象等技术混合开发程序,并理解其中含义,一般研究过。

3、很熟悉:有过OOP架构设计经验,熟悉设计模式、UML,熟悉PHP对象运行机制,内容管理等。

4、精通:应该是架构师级别了,不限于PHP。

经常我们会碰到一些自称熟悉OOP却连public、private、protected、static都解释不清的人,是肯定没有经历过正规的OOP项目。

4、大型网站经验 1、了解:熟悉PHP开发下的缓存应用(memcache、APC等);接触过LVS、SQUID应用;有一定的session处理方案;熟悉负载均衡;熟悉PHP数据连接池应用;了解PHP编程性能优化。

2、熟悉:掌握分布式缓存及缓存性能优化、熟悉存储系统、文件系统、数据库,开发可扩展平台。

能结合负载均衡合理布置流量,对PHP运行性能进行监控与分析。

3、非常熟悉:具备系统分析师能力,已经超出phper环节... 4、精通:太深奥.. 5、操作系统应用能力 操作系统的熟悉与精通需要需要广泛且扎实的基础理论,而对于开发者来说,熟悉基本的命令操作,对WEB相关服务的安装、配置、优化能力需要具备。


网页名称:php数据分析引擎,php 数据分析
文章起源:http://chengdu.cdxwcx.cn/article/heojhh.html