PHP,MySQL原理及应用
随着.COM大潮在全世界范围内的兴起,PHP和MySQL作为灵活高效的网站建设工具,得到了广泛的应用。PHP+MySQL+Apache+Linux作为免费的网站技术解决方案,被大家所接受。
PHP是一种服务器端运行的嵌入HTML的脚本语言,它的语法以Perl为基础,融入了C语言、ASP脚本、shell脚本和JavaScript脚本的长处。
首先,PHP能做什么?
1, PHP最多的应用领域、也是PHP的设计目标——动态网页编程
(优势:数据库、安全、函数适用、速度快、连接JAVA、COM;劣势:没有公共进程、没有数据库统一接口、不适合大团队开发、不适合开发大型程序;)
2, 作为和Shell、Perl一样的脚本语言
(优势:比Shell功能强、比Perl简单,实用函数很多、内建数据库调用)
先看一个最简单的例子(example1.php)
1. <HTML>
2. <BODY>
3. <?php
4. $FirstName=”Yang”;
5. $LastName=”Liao”;
6. $Name
= $FirstName . “-” . $LastName;
7. echo
“NAME:”.$Name;
8. ?>
9. </BODY>
10. </HTML>
上面的例子中,将姓和名连接起来成为名字,并且显示出来。
在上面的例子中,第1、2、9、10行是HTML的标记,PHP并不对其进行处理而直接发送给用户浏览器。
程序中
第1行的<HTML>和最后一行的</HTML>两个HTML标记表示本文档是HTML文档,浏览器将按HTML语法解析本文档。虽然目前的浏览器不论文档中有否<HTML>标记都会将其按照HTML语法进行分析,但是为了遵照HTML标准,还是应该加上这两个标记。
第2行和第9行的<BODY>和</BODY>两个HTML标记表示这两个标记中间的部分是正文区。虽然没有这两个标记浏览器也可以正常显示页面,但是在<BODY>中可以嵌入JavaScript脚本,因此还是加上为好。
第3行的<?PHP表示脚本分的开始。PHP解释器一旦发现“<?”、“<?php”或 “<script language="php">”标记,就将其后的内容作为PHP脚本进行解析,直到遇到“?>”(前二者)或“</script>”(后者)结束。
第4行的“$FirstName=”Yang”;”是PHP中的复值语句。
I. “$FirstName”是变量名称,PHP的变量和Perl一样,以“$”作为开始标记,并且在使用新变量以前不用任何声明即可直接使用。
II. “=”是复值运算符,这在各种语言种基本是一样的。
III. “”Yang””是变量的内容,因为是字符串所以用引号括起来。PHP中的变量类型是隐含的,并且可以在各种类型之间灵活转换。这一点下面将重点说明。
IV. “;”是语句的分隔符号,表示前一个语句的结束;但是如果有其他明显的分隔标记,例如“?>”或者“}”就可以省略掉分号。
执行本语句后,变量$FirstName的值就是Yang ,其内部类型是字符串。
第5行的“$LastName=”Liao”;”和上一句一样,是复值语句。
第6行的“$Name = $FirstName . “-” . $LastName;”是复值语句,其中的 “$FirstName . “-” . $LastName”表示将$FirstName和LastName连接起来,其中用”-”分隔。“.”是连接操作符,将前后的变量或常量都转换成字符串,然后将其连接起来。本语句执行后,变量Name的值是”Yang-Liao”。
请注意,连接字符串不要使用“+”操作符,“+”表示数字的相加,也就是将前后的边量或常量转换成数字,然后将数量值进行相加。$FirstName+”-“+$LastName的值是0。
第7行的“echo “NAME:”.$Name;”是显示语句,将变量Name的值连接到“NAME:”
后面输出到浏览器。
因此本程序的执行结果是
NAME:Yang-Liao
作为一种HTML脚本语言,与用户的互动交流是很重要的。PHP可以很简单的接收用户发来的数据并对其进行处理。
再看一个例子(example2.php)
1. <HTML>
2. <BODY>
3. <?php
4. if($add)
5. {
6. $FirstName=”Yang”;
7. $LastName=”Liao”;
8. $Name
= $FirstName . “-” . $LastName;
9. echo
“NAME:”.$Name;
10. }
11. else
12. { ?>
13. <FORM METHOD=POST>
14. FirstName
: <INPUT TYPE=TEXT NAME=FirstName><BR>
15. LastName
: <INPUT TYPE=TEXT NAME=LastName><BR>
16. <INPUT TYPE=HIDDEN NAME=add
VALUE=1>
17. <INPUT TYPE=SUBMIT VALUE=’POST’>
18. </FORM>
19. <?}?>
20. </BODY>
这段程序和上一段相比,增加了表单部分,允许用户填写自己的姓和名,用户点击<POST>按钮提交表单后,在服务器端将用户的姓和名连接起来并且显示给用户。
和一般的CGI程序不同,本程序的表单页面和处理工作在同一程序中完成。有许多PHP程序采取这个结构,以简化页面体系,并便于错误页面的显示。(举例子)
本程序的13-18行就是提交的表单。在第一次进入页面的时候,$add变量没有复值,因此在第4行的判断语句跳过处理部分而直接进入了表单部分。在标单里面:
第13行“<FROM METHOD=POST>”标记表示表单的开始,并且说明在提交表单的时候采用POST方法。
第14行的“<INPUT TYPE=TEXT NAME=FirstName >”标记将显示一个文本框,允许用户填写任意长的文字,并将这些文字作为变量$FirstName的值发送给PHP程序。
第15行的“<INPUT TYPE=TEXT NAME=LastName >”标记和第14行的标记作用是相同的,只是这里输入的文字将作为变量$LastName的值发送给PHP程序。
第16行的“<INPUT TYPE=HIDDEN NAME=add VALUE=1>”标记是隐含变量标记(正如其名字,“TYPE=HIDDEN”表示这个变量将隐含),也就是说页面上将不会显示这个变量的文本框,用户自然也不能编辑其内容,只能按照其预设定的值(VALUE=1)将变量$add发送给PHP程序。也就是说PHP程序将接收到$add=1。这个变量的作用是表示当前不是第一次进入页面,而是数据处理过程。这个变量$add在第4行的判断语句中期作用,使得程序进入处理工作,而不是再次显示出表单。
这个程序运行的流程是这样的
特别需要注意的是,应该把PHP程序和HTML标记完全分开考虑。PHP只是产生字符流传给浏览器,它不会对HTML标记做任何的理睬。
PHP的语法
看过了2个简单的例子以后,深刻的认识一下PHP的语法吧。
1,变量类型
PHP的变量类型对外是透明的,在作不同的操作时会自动将类型转换成操作所需要的类型。PHP的基本内部类型有以下几种
1,数组
数组的概念相当于Perl中的数组和散列的概念,数组的下标既可以是整数,也可以是字符串。
例如:
$User[0] = "DBPZ";
$User[1] = "zixia";
$Points["DBPZ"] = 86;
想要知道一个数组内纪录的条数,可以用sizeof函数
$a[0]=1;
$a[1]=1;
echo sizeof($a);
显示结果:2
$b[20]=1;
$b[21]=1;
echo sizeof($b);
显示结果:2
数组也可以有多维。例如:
$matrix[2][3]=14;
$matrix[1][2]=33;
$matrixs[“M1”][1][2]=23;
$matrixs[“M1”][1][3]=33;
甚至可以直接在表单里面输入数组
<FORM>
<INPUT NAME=”M[1]” TYPE=TEXT>
<INPUT NAME=”M[2]” TYPE=TEXT>
<INPUT NAME=”N[ABC]” TYPE=TEXT>
</FORM>
2,整型
整型是各种语言中最常见的类型,PHP中的整形不能超过32Bit。(在下面的例子里面,虽然$c超过了32Bit整型,而且与整型很像,但是它的内部类型是浮点型)
$a = 12345678901234;
$b = 12345678901234;
$c = $a + $b;
echo $c;
显示 24691357802468
echo (float)$c;
显示 24691357802468,说明$c是浮点
echo (int)$c;
显示 –2147483648,说明$c不是整形
3,浮点数
PHP浮点数的取值范围和C语言的double双精浮点相同。如果浮点数不到10E16,而且没有小数部分,则显示时会按整型的样子显示出来。这时要注意,它的内部类型是浮点而不是整型。
4,对象
PHP中可以定义类,并且可以生成类的实例,但是由于PHP本身是一种脚本语言,有许多地方很不严格,不便用来描述对象、为对象建模,因此PHP不是一种好的OO语言。
尽管如此,PHP的对象还是有广泛的使用。许多从网上下载的PHP程序包就是写成类的样式。
class Student
{
var
$Point = 0;
function addPoint($p)
{
$this->Point += $p;
}
function showPoint()
{
echo "Point = ".$this->Point;
}
}
$dbpz = new Student;
$dbpz->addPoint(80);
$dbpz->addPoint(20);
$dbpz->showPoint();
显示结果 Points = 100
5,字符串
PHP中的字符串与C的char *不同,它比较像Perl的字符串。PHP的字符串是由一块内存区的首指针和内存区长度共同表示的;而不是象C语言一样只提供内存区的首指针,遇到’\0’符号就认为是字符串的结束位置。
PHP这样做的好处是:
1,不用担心Buffer Overflow问题。众所周知,用C语言编写Web程序容易造成BufferOverflow问题,许多黑客攻入服务器也是依靠的BufferOverflow漏洞。如果字符串的长度能确定,就不会出现字符串失控的情况,也就不会出现BufferOverflow漏洞。
2,可以打通字符串和内存块的界限。在PHP的字符串变量中可以有任意字符,’\0’,’\n’,’\r’等都不受限制。这样可以直接把一个文件的内容读到一个字符串中,然后对这个字符串进行裁剪、连接等操作。不用考虑文件中是否有’\0’等符号。
PHP的字符串处理函数很完善,这也很便于作为一种文件分析工具使用(举例子:Apache Log)。
10.9.62.66 - - [07/Sep/2000:02:50:58 +0800]
"GET /wutao/jsp/News_Search.jsp HTTP/1.1" 404 293
10.9.62.66 - - [07/Sep/2000:02:50:59 +0800]
"GET /wutao/jsp/News_Search.jsp HTTP/1.1" 404 293
10.9.62.66 - - [07/Sep/2000:03:04:15 +0800]
"GET /wutao/jsp/entity.jsp?ENTITYID=173615625&mod=subdetail
HTTP/1.1" 404 293
10.9.62.66 - - [07/Sep/2000:03:04:16 +0800]
"GET /wutao/jsp/entity.jsp?ENTITYID=173615625&mod=subdetail
HTTP/1.1" 404 293
10.9.62.66 - - [07/Sep/2000:03:04:16 +0800]
"GET /wutao/jsp/entity.jsp?ENTITYID=173615625&mod=subdetail
HTTP/1.1" 404 293
10.9.62.66 - - [07/Sep/2000:03:08:43 +0800]
"GET /wutao/jsp/entity.jsp?ENTITYID=173615625&mod=subdetail
HTTP/1.1" 200 7957
10.9.62.66 - - [07/Sep/2000:03:09:43 +0800]
"GET /wutao/jsp/entity.jsp?ENTITYID=173615625&mod=subdetail
HTTP/1.1" 200 8013
10.9.62.66 - - [07/Sep/2000:03:09:51 +0800]
"POST /wutao/jsp/News_Search.jsp HTTP/1.1" 200 1897
10.9.62.66 - - [07/Sep/2000:03:14:27 +0800]
"POST /wutao/jsp/News_Search.jsp HTTP/1.1" 200 5319
6,句柄
在PHP3.0.9版本以前,句柄就是整形,而在其后句柄成为了一种特殊的类型。例如MySQL的连接、Oracle连接、GD库产生的一副图片都是用句柄的方式表达的。
类型之间的转换
PHP程序可以自动将变量类型转换为运算需要的类型。
$a[0]=123;
$a[1]=234;
echo $a;
这里显示 Array
$b=”123abc”;
echo $b+1;
这里显示124
echo $b.”123”;
这里显示123abc123
也可以强行把变量转换类型
$c=123456789012345;
$d=(int)$c;
echo
$d;
这里显示-2147483648
$b=”123abc”;
echo
(int)$b;
这里显示123
注意:在接受用户表单的时候,一定要把整形进行强制转换或+=0
什么是SQL,什么是MySQL
计算机的一个重要的功能就是管理维护海量的数据,并且在其中进行查询、统计等操作。对于大多数的数据库应用,可以提取出简单的模型,以便商业数据库产品的开发。SQL语言就是针对关系型数据库模型开发的。SQL数据库有许多商业化的产品,微软、Oracle、Sybase、Infomix等等众多的厂商都有SQL数据库产品。MySQL严格的说没有完全实现的SQL第一版的要求,例如没有嵌套查询、没有视图等等概念,因此无法实现关系型数据库模型。因此准确的讲,与其说MySQL是一种SQL数据库软件,不如说它是一种借用了一部分SQL语法的数据存储器。但是由于它简单灵活、速度较快,而且完全免费,因此很适合网站数据库的简单应用。
怎样在Linux上安装MySQL
MySQL可以由rpm包直接安装,也可以下载原码自己编译。
RPM:
rpm –i MySQL-3.2x.xx-i386.rpm
rpm –i MySQL-3.2x.xx-dev-i386.rpm
rpm –i MySQL-3.2x.xx-admin-i386.rpm
rpm –i MySQL-3.2x.xx-client-i386.rpm
原码:
tar
xzfv mysql-3.2x.xx.tar.gz
cd
mysql-3.2x.xx
./configure
make
make
install
mysql_install_db
怎样启动MySQL
safe_mysqld
&
怎样关闭MySQL
mysqladmin
shutdown –uroot
怎样进入MySQL字符界面客户端
mysql
–hHOSTNAME –uUSERNAME –pPASSWORD [DBASE]
是否还有其他管理方式?
MySQL有图形客户端,也有第三方编写的PHP客户端,但是为了系统安全,建议通过SSH登上主机后在本地使用字符客户端。
MySQL数据库的数据存放的主体是表(Table)。
这就是一个表的例子:Users
AutoID |
Name |
UserID |
LoginTime |
Password |
1 |
李明 |
Lee |
970423294 |
123lee |
2 |
赵鹏 |
Zp |
970421321 |
F117 |
3 |
张军 |
Zhang |
970123121 |
781120 |
这张表中有5个字段:AutoID、Name、UserID、LoginTime、Password,它们的类型分别是
AutoID Int
Name Varchar(20)
(Varchar是一种可变长的字符串类型,括号里面指定字符串的最大长度)
UserID Varchar(16)
LoginTime Int
(MySQL有DATETIME类型,但是用整数形可以简单的进行各种计算,也可以在PHP中方便的变成所需样式的字符串)
Password Varchar(8)
(这里做例子的时候将密码明码写入数据库,实际应用中一定要将其用MD5散列后存储)
为了检索速度快,应该对这个表的AutoID和UserID列建立索引。
为了维护方便,应该令AutoID列自动增加(也就是每插入一条数据的时候,自动从表中找出AutoID最大值,将其加1后写入新行)
因此完整的建表语句是:
create
table Users
(
AutoID INT PRIMARY KEY AUTO_INCREMENT,
//PRIMARY
KEY表示主键,AUTO_INCREMENT表示本列自动增加。
Name VARCHAR(20) NOT NULL ,
//NOT NULL表示本列在插入/修改操作时不能为空。而且在MySQL中如果没有指定NOT NULL关键词则不能为此列创建索引。
UserID VARCHAR(16) NOT NULL ,
LoginTime INT ,
Password VARCHAR(8) NOT NULL ,
UNIQUE Users_UserID(UserID)
//UN IQUE表示唯一性索引,不唯一的索引可用关键字INDEX表示
)
为了方便组织数据和管理权限,MySQL规定表必须建在数据库中
创建表格的基本语法是:
CREATE TABLE tbl_name (create_definition,...) [select_statement]
创建数据库的方法是:
create
DATABASE_NAME;
指定或更换当前数据库的方法是:
use DATABASE_NAME
注意:如果进入MySQL客户端时没有指定所用数据库,则除非使用use命令指定数据库名称,否则无法创建表
查询语句 SELECT
查询是MySQL中应用最多的语句。它的作用是根据用需求,找出符合要求的数据行,并且按照需要进行排序、分组等操作,将结果传递给用户。
SELECT 语句的基本语法是
SELECT [DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO OUTFILE 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name} [ASC | DESC] ,...]
[LIMIT [offset,] rows]
DELETE语句的基本语法是
DELETE [LOW_PRIORITY] FROM tbl_name
[WHERE where_definition] [LIMIT rows]
UPDATE语句的基本语法是
UPDATE [LOW_PRIORITY] tbl_name SET col_name1=expr1,col_name2=expr2,...
[WHERE where_definition]
INSERT语句的基本语法是
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES (expression,...),(...),...
or INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
or INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name
SET
col_name=expression, col_name=expression, ...
Web数据库需要注意的几个问题
1,安全性: 绝对不要让访问者有接触SQL语句的机会
2,效率: 对查询数据一定要建索引,查询时必须从头查询才能用到索引。
除非绝对必要、而且检索对象数量较小,否则不要提供全文检索。
用top命令察看进程占用CPU情况,如果经常发现有一个或几个mysql进程总的CPU占用超过50%,就一定要优化数据库。
3,备份: 重要数据必须定期备份。如果采用mysqldump进行备份,速度可能比较慢;如果采用直接备份数据文件,则一定要先停止数据库服务然后备份文件。
PHP + MySQL
PHP中有一套调用MySQL数据库的API。
mysql_affected_rows
— Get number of affected rows in previous MySQL operation
mysql_close —
close MySQL connection
mysql_connect —
Open a connection to a MySQL Server
mysql_create_db —
Create a MySQL database
mysql_data_seek —
Move internal result pointer
mysql_db_query —
Send an MySQL query to MySQL
mysql_errno —
Returns the number of the error message from previous MySQL operation
mysql_error —
Returns the text of the error message from previous MySQL operation
mysql_fetch_array
— Fetch a result row as an associative array
mysql_fetch_field
— Get column information from a result and return as an object
mysql_fetch_lengths
— Get the length of each output in a result
mysql_fetch_object
— Fetch a result row as an object
mysql_fetch_row —
Get a result row as an enumerated array
mysql_field_name —
Get the name of the specified field in a result
mysql_field_seek —
Set result pointer to a specified field offset
mysql_field_table
— Get name of the table the specified field is in
mysql_field_type —
Get the type of the specified field in a result
mysql_field_flags
— Get the flags associated with the specified field in a result
mysql_field_len —
Returns the length of the specified field
mysql_free_result
— Free result memory
mysql_insert_id —
Get the id generated from the previous INSERT operation
mysql_num_rows —
Get number of rows in result
mysql_pconnect —
Open a persistent connection to a MySQL Server
mysql_query — Send
an SQL query to MySQL
mysql_result — Get
result data
mysql_select_db —
Select a MySQL database
比较常见的PHP+MySQL程序的基本结构是:
1. <HTML> 2. <BODY> 3. <TABLE
BORDER=1> 4. <TR><TD>编号</TD><TD>登录名</TD><TD>真实姓名</TD></TR> 5. <?php 6. include(“db.php”); 7. $mysql
= mysql_connect($DBHOST,$DBUSER,$DBPASSWD); 8. $res =
mysql_db_query(‘user’,”SELECT AUTOID,USERID,NAME FROM Users WHERE LOGINTIME
> 970000000”,$mysql); 9.
while($row =
mysql_fetch_row($res)){ 10.
echo
“<TR><TD>$row[0]</TD><TD>$row[1]</TD><TD>$row[2]</TD></TR>”; 11.
} 12. $mysql_close($mysql); 13. ?> 14. </TABLE> 15. </BODY> 16. </HTML>
(具体分析每一行的作用)
<用一些PHP程序进行例子分析,大家可以拷贝程序作为参考>