PHP,MySQL原理及应用

 

随着.COM大潮在全世界范围内的兴起,PHPMySQL作为灵活高效的网站建设工具,得到了广泛的应用。PHP+MySQL+Apache+Linux作为免费的网站技术解决方案,被大家所接受。

 

PHP是一种服务器端运行的嵌入HTML的脚本语言,它的语法以Perl为基础,融入了C语言、ASP脚本、shell脚本和JavaScript脚本的长处。

 

首先,PHP能做什么?

1,    PHP最多的应用领域、也是PHP的设计目标——动态网页编程

(优势:数据库、安全、函数适用、速度快、连接JAVACOM;劣势:没有公共进程、没有数据库统一接口、不适合大团队开发、不适合开发大型程序;)

       2,    作为和ShellPerl一样的脚本语言

              (优势:比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>

上面的例子中,将姓和名连接起来成为名字,并且显示出来。

在上面的例子中,第12910行是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”表示将$FirstNameLastName连接起来,其中用”-”分隔。“.”是连接操作符,将前后的变量或常量都转换成字符串,然后将其连接起来。本语句执行后,变量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中的字符串与Cchar *不同,它比较像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数据库有许多商业化的产品,微软、OracleSybaseInfomix等等众多的厂商都有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个字段:AutoIDNameUserIDLoginTimePassword,它们的类型分别是

       AutoID                 Int

       Name                   Varchar(20)

(Varchar是一种可变长的字符串类型,括号里面指定字符串的最大长度)

       UserID                 Varchar(16)

       LoginTime            Int

(MySQLDATETIME类型,但是用整数形可以简单的进行各种计算,也可以在PHP中方便的变成所需样式的字符串)

       Password                     Varchar(8)

(这里做例子的时候将密码明码写入数据库,实际应用中一定要将其用MD5散列后存储)

              为了检索速度快,应该对这个表的AutoIDUserID列建立索引。

              为了维护方便,应该令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程序进行例子分析,大家可以拷贝程序作为参考>