1. 学习php感觉遇到瓶颈了,
原来我也是有这种感觉,其实你需要提升的地方还有很多.当前你的状态还是停留于"码工",其实我也是.
框架开发仍停留于开发模式,虽然框架开发局限了你的思维,但你仍需要了解一下.以应对快速开发所需.国内优秀的框架是thinkphp和speedphp,国外是zendFramework,YII,CI等,如果需要框架开发了,你需要进行有选择的开发.
另外,和前台交互地方需要加强,比如flash交互和ajax交互.
最主要的是,你要了解php项目的多种设计模式.有思想的项目,再小也是精美的.
你还需要了解php相关SOAP协议,比如webservice,以应对多环境语言间进行逻辑引用.
另外一个是如果你有兴趣,可以了解下用c写php扩展,不过正常情况下用处不多.
新版php有很多新特性,注意多应用一下.
2. PHP8新特性示例
命名参数 :就是具名参数,在调用函数的时候,可以指定参数名称,指定参数名称后,参数顺序可以不安装原函数参数顺序传
示例:
注解 :注解可以将类定义成一个一个低耦合,高内聚的元数据类。在使用的时候通过注解灵活引入,反射注解类实例的时候达到调用的目的。注解类只有在被实例化的时候才会调用
示例
示例:
解释 :在不确定参数类型的场景下,可以使用.
示例:
解释:和 switch case 差不多,但是严格要求 === 匹配
示例:
解释:简化了 is_null 判断
示例:
考虑到 PHP 动态语言类型的特性,现在很多情况下,联合类型都是很有用的。联合类型是两个或者多个类型的集合,表示可以使用其中任何一个类型。
请注意,联合类型中不包含 void ,因为 void 表示的含义是 “根本没有返回值”。 另外,可以使用 |null 或者现有的 ? 表示法来表示包含 nullable 的联合体 :
JIT — just in time — 编译器虽然不总是在 Web 请求的上下文中,但是有望显着地提高性能。目前还没有完成任何准确的基准测试,但是肯定会到来。
属性在其他语言中通常被称为 注解 ,提供一种在无需解析文档块的情况下将元数据添加到类中的方法。
尽管已经可以返回 self,但是 static 直到 PHP 8 才是有效地返回类型 。考虑到 PHP 具有动态类型的性质,此功能对于许多开发人员将非常有用。
有人可能将其称为必要的邪恶: mixed 类型让许多人感觉十分混乱。然而,有一个很好的论据支持去实现它:缺少类型在 PHP 中会导致很多情况:
因为上述原因,添加 mixed 类型是一件很棒的事儿。 mixed 本身代表下列类型中的任一类型:
请注意,mixed 不仅仅可以用来作为返回类型,还可以用作参数和属性类型。因为 mixed 类型已经包括了 null,因此 mixed 类型不可为空。下面的代码会触发致命错误:
已上是整理出来的新特性的变化,后续会继续整理,PHP8的发布会让PHP更上一层楼,相信PHP是世界上最好的语言!
3. PHP到底有多糟糕
php是web开发第一语言,这已经是坐稳了的事实,因为使用简单,工具完善,开发效率高等优点为它积聚了大量的粉丝,号称世界上最好的语言。 然而,就算是世界上最好的语言也有缺陷,下面我挑几个php语法层面不那么好用的特性吐槽下。
变量面前的美元($)符号
我想不明白当初php语言的设计师是怎么想的,为什么非要在变量名面前加上这个美元符号?每次我书写变量时必须要按一下shift +4键,用其它语言可以很流畅的写代码,在php中却老是被按这个shift打断整个过程,这除了能给程序员带来麻烦,我实在看不到有其它一丁点的好处。网上流传着的说法好像是因为带美元符号代码解析起来更容易, 性能更好。但是解释类型的语言又不只有php ,为什么其它语言就不用让程序员打这个讨厌的美元符号。每天看着满屏的美元符号,我口袋里的钱也没见多一分呀。
访问对象成员要使用箭头符号
明明按一下点号(.)就可以方便快捷的搞定的问题,却非要使用简单符号(->)来代替,真的是借我一百个脑袋也想不明白php设计者在设计这个特性是什么逻辑。难不成是因为php解释器最终会把php的代码转换成c代码执行,而c中访问指针的成员就是使用箭头符号的。如果是这样那显然是php的设计者们偷懒了,难到不能在转换成c执行的过程中多一步将点号转换为箭头符号的过程吗?不要告诉我又是因为性能问题而办不到,他们就不能为程序员想想?
数组即能当列表也能当字典
写一个函数,返回一个数组类型,但是在函数的外面,鬼知道这个数组是一个list还是一个map?写php代码不知道被这个特性坑过多少回,如果是别人写的函数, 又没有注释,那非得跑进函数里看个明白才知道应该这么样使用这个函数才是安全的。难到就不能把array拆成两个独立的类型分别代表list(列表)和map(字典)吗?这能为程序提供很大的便利,写的代码也更加不会出错。
匿名函数使用外部变量必须使用use关键字导入
这个特性不能说完全没有优点,对于代码的可维护性还是能起到正面的作用的,因为这么做能让我知道我在匿名函数体里面对于外部会有哪些依赖,让代码更可控。然而,这种写法真的是非常的不方便,每次写lambda时,要用到外部的变量时,都要使用use导入,把代码搞的看起来很臃肿,而且,因为其它语言没这个限制,习惯已经养成,所以每次都会忘记使用use导入,导致代码出错,增加排查问题的时间,这真的不是什么好玩的事。
用include导入文件
当把代码模块化时,然后在其它文件中使用,每次都需要使用这个include把文件导入进来,而且还要考虑路径的问题,在结构复杂的项目中,非常让人蛋疼。而像java和Python之类的语言中,代码管理机制设计的非常好,想用什么import进来就可以了,根本不用考虑路径啊,文件名大小写啊之类的问题,能大大的提升开发效率。虽然,有框架可以解决这类问题,但毕竟是外部实现,使用起来总归不是那么顺畅。这也算是php一个比较大的毛病了。
总结的这五点算是php中存在问题的典范了,希望php团队能加把劲,把这些问题在未来的版本中优化掉,让开发者写代码时有更好的体验,更高的效率,让世界上最好的语言名副其实
4. 学习php可以做什么发展方向有哪些
PHP能做什么
PHP 能做任何事,PHP 脚本主要用于以下三个领域:
1、服务端脚本。
这是 PHP 最传统,也是最主要的目标领域。开展这项工作需要具备以下三点:
A、PHP 解析器(CGI 或者服务器模块)、
B、web 服务器、
C、web 浏览器。
需要在运行web服务器时,安装并配置PHP,然后,可以用web浏览器来访问PHP程序的输出,即浏览服务端的PHP页面。
如果只是实验 PHP 编程,所有的这些都可以运行在自己家里的电脑中。
2、命令行脚本。
可以编写一段 PHP 脚本,并且不需要任何服务器或者浏览器来运行它。
通过这种方式,仅仅只需要 PHP 解析器来执行。
这种用法对于依赖cron(Unix或者linux环境)或者Task Scheler(Windows环境)的日常运行的脚本来说是理想的选择。
这些脚本也可以用来处理简单的文本。
3、编写桌面应用程序。
对于有着图形界面的桌面应用程序来说,PHP 或许不是一种最好的语言,
但是如果用户非常精通 PHP,并且希望在客户端应用程序中使用 PHP 的一些高级特性,
可以利用 PHP-GTK 来编写这些程序。用这种方法,还可以编写跨平台的应用程序。
PHP-GTK 是 PHP 的一个扩展,在通常发布的 PHP 包中并不包含它。
如果对 PHP-GTK 感兴趣,请访问其网站以获取更多信息。
PHP还可用于其他更广泛的领域:
PHP 还支持利用诸如 LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM(Windows环境)等不计其数的协议的服务。
还可以开放原始网络端口,使得任何其它的协议能够协同工作。
PHP 支持和所有 web 开发语言之间的 WDDX 复杂数据交换。
关于相互连接,PHP 已经支持了对 Java 对象的即时连接,并且可以将他们自由的用作 PHP 对象。
甚至可以用我们的 CORBA 扩展库来访问远程对象。
PHP 具有极其有效的文本处理特性,支持从 POSIX 扩展或者 Perl 正则表达式到 XML 文档解析。
为了解析和访问 XML 文档,PHP 4 支持 SAX 和 DOM 标准,也可以使用 XSLT 扩展库来转换 XML 文档。
PHP5基于强健的libxm2标准化了所有的XML扩展,并添加了SimpleXML和XMLReader支持,扩展了其在XML方面的功能。
如果将PHP用于电子商务领域,
会发现其Cybercash支付、CyberMUT、VeriSign Payflow Pro以及MCVE函数对于在线交易程序来说是非常有用的。
另外,还有很多其它有趣的扩展库。
例如 mnoGoSearch 搜索引擎函数、IRC 网关函数、多种压缩工具(gzip、bz2)、日历转换、翻译……
php+mysql相结合,可以开发大中型网站,网店等软件,flex+php+mysql相结合可以开发像开心网这样的游戏,还有phpgane(游戏),随着php版本的不断提高,php涉及领域网站,网游和管理,销售软件等开发触!
5. 小服务器选 ThinkPHP几好
小服务器选ThinkPHP5好
因为ThinkPHP5比之前的版本好用了很多,增加了很多的一些特性,它采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持一些小服务器使用,并针对API开发做了很多优化。所以小服务器选ThinkPHP5好。
6. 什么是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 Proct)
自然接合
* 在接合中加上一项接合条件,要求两档的共通栏(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
7. php是什么什么作用
PHP(HypertextPreprocessor)是一种通用开源脚本语言。PHP语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
1.PHP独特的语法混合了C、Java、Perl以及PHP自创新的语法。
2.PHP可以比CGI或者Perl更快速的执行动态网页——动态页面方面,与其他的编程语言相比,
PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成htmL标记的CGI要高许多;
PHP具有非常强大的功能,所有的CGI的功能PHP都能实现。
3.PHP支持几乎所有流行的数据库以及操作系统。
4.最重要的是PHP可以用C、C++进行程序的扩展!
PHP脚本主要用于以下三个领域:
(1)服务端脚本。这是PHP最传统,也是最主要的目标领域。开展这项工作需要具备以下三点:PHP解析器(CGI或者服务器模块)、web服务器和web浏览器。需要在运行web服务器时,安装并配置PHP,然后,可以用web浏览器来访问PHP程序的输出,即浏览服务端的PHP页面。如果只是实验PHP编程,所有的这些都可以运行在自己家里的电脑中。请查阅安装一章以获取更多信息。
(2)命令行脚本。可以编写一段PHP脚本,并且不需要任何服务器或者浏览器来运行它。通过这种方式,仅仅只需要PHP解析器来执行。这种用法对于依赖cron(Unix或者Linux环境)或者TaskScheler(Windows环境)的日常运行的脚本来说是理想的选择。这些脚本也可以用来处理简单的文本。请参阅PHP的命令行模式以获取更多信息。
编写桌面应用程序。对于有着图形界面的桌面应用程序来说,PHP或许不是一种最好的语言,但是如果用户非常精通PHP,并且希望在客户端应用程序中使用PHP的一些高级特性,可以利用PHP-GTK来编写这些程序。用这种方法,还可以编写跨平台的应用程序。PHP-GTK是PHP的一个扩展,在通常发布的PHP包中并不包含它。
(3)PHP能够用在所有的主流操作系统上,包括Linux、Unix的各种变种(包括HP-UX、Solaris和OpenBSD)、microsoftWindows、MacOSX、RISCOS等。今天,PHP已经支持了大多数的web服务器,包括Apache、(IIS)、PersonalwebServer(PWS)、Netscape以及iPlantserver、OreillyWebsiteProServer、Caudium、Xitami、OmniHTTPd等。对于大多数的服务器,PHP提供了一个模块;还有一些PHP支持CGI标准,使得PHP能够作为CGI处理器来工作。
插件丰富,网上的解决方案有很多,而且还有庞大的开源社区可以提供帮助。
跨平台性强效率高图像处理
面向对象
[在php4,php5中,面向对象方面都有了很大的改进,php完全可以用来开发大型商业程序。]
PHP性能很强.配合简单、稳定、容易部署,总的来说php能帮你低成本完成事情
1)函数命名不规范驼峰法和下滑线,传参位置不一你知道的
2)单线程;PHP本身,一直以来php就是个单进程的程序;虽然php的pthreads扩展早就有了。但是它不够稳定,运行运行着就会莫名其妙的自己挂掉;php的扩展都是C写的,这也就意味着任何一个扩展出现线程竞争资源控制问题都能让整个挂掉
3)核心异步网络不支持(当然在linux只有同步非阻塞网络模型)。却少了这个使得很难开发一个能够承受大并发的网络应用。传统的网络模型和io都阻塞的。这样基本的编程的做法就是一个进程(或者线程)响应一个用户链接请求。因此无法完成像实时网游那样需要成千上万网络连接的任务。尽管php也有Libevent、eio扩展对此算是某种程度上面的弥补,但是感觉都不是那么完善
4)只支持web开发,不方便做.exe文件,不方便做桌面应用程序.不方便做手机程序.
5)不适合做爬虫、自动运行脚本.科学运算项目,这语言基本构架就不适合,虽然有很多方法实现。
6)后期维护困难。后期提速空间局限性较大。
今朝全球5000万互联网网站中,有60%以上使用着PHP手艺;
PHP也当选是全球五大最受接待的编程说话,而且是唯一当选的剧本说话;
国际80%以上的静态网站都在使用PHP开拓,网络、网易、新浪、搜狐、阿里巴巴、腾讯、金山等,都有PHP的影子;
AlexaTOP500中国网站排名,有394家使用了PHP手艺,比例为78.8%。(火爆不?)
以下是某支流搜索引擎在某时辰收录各WEB说话页面个数的斗劲:
Php:2,150,000,000
ASPX:1,370,000,000
Java:6,710,000,00
Asp:1,140,000,000
各类类型在搜索引擎的收录景象证实:可以或许开拓网站的说话良多,能做到精晓的只需一种;在Web手艺方面,PhP利用更遍及。
2015年6月份PHP新浪科技等诸多大媒体都在转载了“互联网十大抢手人材”,PHP排名后端说话第一位。据统计,PHP人材供求比抵达1:10,php高端人材特别稀缺。
PHP、C++、java这三种说话都是相当优良的剧本说话,为什么PHP能大行其道,位居榜首呢?
从概略下去看,这是就业景象使然。越来越多的新公司或新项目使用PHP,这使得PHP相关社区越来越活跃,而这又反过来影响到良多项目或公司的挑选,构成一个良性的轮回。就我们今朝体味到的景象,PHP是国际大部门web项手段首选,而且有良多公司从其它说话(如ASP,JAVA)转到了PHP。适合的就是最好的,PHP的快速,开拓成本低,周期短,前期保护费用低,开源产物丰盛,这些都是另外两种说话没法对照的。
以上各种消息都在给我们传送一种旌旗灯号:PHP手艺今朝很给力。
薪资也是反映PHP手艺是不是给力的一个很首要的身分,PHP是不是很有前景,看中立网站职友集显现的薪资即可!
总之,在全球前一百万的网站中,大约有70%的站点使用PHP开拓,PHP的用武之地不只仅只是在网站开拓,在游戏开拓、广告系统开拓、API接口开拓、移动端后台开拓,内部OA系统开拓上都能使用PHP。所以不管是斟酌开拓周期,仍是合计开拓成本,PHP都是值得优先斟酌的。不管另外说话若何兴衰,但企业会一向需求PHP。
8. php5.6升级到php7,对应用有什么影响
这个最好是看手册,英文版的 网页是可以自动翻译的http://php.net/manual/zh/migration70.php,当然商业项目中不建议使用php7,要优先使用5.6版本,因为5.6相对7来说更稳定,等7应用较多的时候,你再使用不迟,不然容易出现兼容性等问题
9. thinkphp 3.2.3在3.2.2基础上有哪些新特性
3.2.3 主要更新
数据库驱动完全用PDO重写;
支持通用insertAll方法;
改进参数绑定机制;
主从分布式数据库连接改进;
对Mongo的支持更加完善;
模型类的诸多增强和改进;
增加聚合模型扩展;
支持复合主键;
多表操作的支持完善;
模型的CURD操作支持仅获取SQL语句而不执行;
增加using/index/fetchSql/strict/token连贯操作方法;
模型类的setInc和setDec方法支持延迟写入;
I函数增加变量修饰符和正则检测支持;
支持全局变量过滤和Action参数绑定的变量过滤;
修正可能的SQL注入漏洞;
支持全局路由定义;
增加插件控制器支持;
增加对全局和模块的模板路径的灵活设置;
日志目录分模块存放;
增加memcache Session驱动;
改进session函数的数组操作;