学习PHP——3、PHP和表单

No Comments »

在 PHP 中创建和使用表单

开发人员创建 PHP 是为了开发一种 Web 编程语言。事实上,虽然可以从命令行中运行 PHP,但很少有人在 Web 应用程序领域之外使用这种语言。结果,PHP 程序员最常见的任务就是使用 Web 表单。

使用 HTML 创建 Web 表单,当用户提交表单时,浏览器向服务器发送一个信息数组

这一节将讨论数组和使用表单数据的方式,以及控制 PHP 脚本流的方法,如循环和 if-then 语句。

用 HTML 创建表单

 

首先来创建应用程序的注册页面。最终,用户将在这里输入他们的信息,而您则需要在将这些信息保存到数据库之前验证 它们或者检查它们的完整性。但现在,我们只需要创建一个基本的表单。创建一个命名为 registration.php 的新文件,在该文件中添加以下内容:

<html><head><title>Workflow System</title></head><body><h1>Register for an Account:</h1><form action="registration_action.php" method="GET">

Username: <input type="text" name="name" /><br />Email: <input type="text" name="email" /><br />Password: <input type="password" name="pword" /><br /><input type="submit" value="GO" /></form>

</body></html>

这是一个简单的表单(在 form 元素中),其中有两个文本输入字段、一个口令字段和一个提交按钮。如果将该文件保存到文档根目录(registration_action.php)中,那么输入各字段后的结果将如图 3 所示。

图 3. 帐户注册表单
大小: 76.68 K<br /> 尺寸: 500 x 282<br /> 浏览: 1 次<br /> 点击打开新窗口浏览全图

注意,口令输入框中没有显示实际输入的内容。那么单击 GO 按钮后会出现什么样的情况呢?

提交表单

 

创建表单时,创建了一个真正的 form 元素,如下所示:

<form action="registration_action.php" method="GET">

该元素有两部分信息。首先,action 告诉浏览器将信息发送到何处,在这里是发送到前面创建的 registration_action.php 页面。其次,method 告诉浏览器如何发送数据。

让我们看看这些操作是如何实现的。填充一些数据并单击 GO 按钮,结果将如图 4 所示。

图 4. 输出数据

大小: 65 K<br /> 尺寸: 500 x 247<br /> 浏览: 0 次<br /> 点击打开新窗口浏览全图

这里,您并没有提交它所说的信息,但这是因为您还没有修改并查看提交数据的页面。看看 URL 就知道了。

http://localhost/registration_action.php?name=roadnick&email=ibmquestions%40nicholaschase.com&pword=supersecretpassword

注意,每个表单元素都有一个名称,URL 中包含用地址符号(&)分隔的名值对。URL 采用这种格式是因为使用了 GET 方法。在 使用 POST 一节中,还将介绍这些内容,不过,让我们首先来看看如何从 PHP 页面中检索数据。

访问表单数据

 

现在已经提交了表单,还要将数据放到真正的响应页面 registration_action.php 中,对该文件做如下更改:

...<body>    <p>You entered:</p>

<?php     $username = $_GET['name'];    $password = $_GET['pword'];

    echo "<p>Username = " . $username . "</p>";     echo "<p>Password = " . $password . "</p>"; ?>

</body></html>

要做的就是从 $_GET 数组中取得命名的值。后面还将进一步讨论数组,目前要注意的是,刷新浏览器后,真正的应答页面将如图 5 所示。

图 5. 浏览器中的正确信息
大小: 67.31 K<br /> 尺寸: 500 x 270<br /> 浏览: 0 次<br /> 点击打开新窗口浏览全图
可以按照名称取得所有提交的信息,因为这是一个数组,所以还可通过其他的方式。

数组

PHP 允许创建数组或者值列表,从而方便地同时移动一组数据。比如,可以创建一个数组并将其值输出到页面中,如下所示:

$formnames = array("name", "email", "pword");echo "0=".$formnames[0]."<br />";echo "1=".$formnames[1]."<br />";echo "2=".$formnames[2]."<br />";

array() 函数返回一个值,这个例子中返回的值恰好是一个数组。(函数在后面讨论,现在只要知道调用函数,并为函数的返回值赋给一个变量即可。)

上述脚本的输出如下:

0=name<br />1=email<br />2=pword<br />

注意,第一个值的索引号是 0 而不是 1。 此外,通过在数组变量名后的方括号中使用索引可以指定需要的任意值。这项操作与访问表单数据的方式类似,这并不是偶然的。$_GET 变量是一种特殊类型的数组,称为关联(associative)数组,也就是说,每个值不使用数字索引,而使用 key

提交表单的时候,实际上创建了以下这样一个数组:

$_GET = array("name" => "roadnick",                           "email" => "ibmquestions@nicholaschase.com",                           "pword" => "supersecretpassword");

这就是能够提取每个值(如 $_GET["name"])的原因。不过不需要分别提取。

访问数组信息

 

在处理数据时,使用关联数组非常方便,但经常会遇到不知道数组结构是什么样的情形。比如,您可能创建了一个通用数据库例程,从查询中接受一个关联数组。

幸运的是,PHP 提供的两个函数简化了此操作:

<body>    <p>You entered:</p>

<?php     $form_names = array_keys($_GET);    $form_values = array_values($_GET);

    echo "<p>" . $form_names[0] . " = " . $form_values[0] . "</p>";     echo "<p>" . $form_names[1] . " = " . $form_values[1] . "</p>";     echo "<p>" . $form_names[2] . " = " . $form_values[2] . "</p>"; ?>

</body></html>

array_keys()array_values() 函数都返回普通的数字索引数组,因此可以使用数字索引从这两个数组中获取信息,如图 6 所示。

图 6. 使用数字索引提取数据

大小: 72.74 K<br /> 尺寸: 500 x 265<br /> 浏览: 0 次<br /> 点击打开新窗口浏览全图

还应该有更方便的办法。比方说,如果不知道有多少个值,该怎么办?PHP 提供了处理关联数组的多种方式,而使用哪一种最方便则由已经掌握的信息决定。我们来看看完成同样任务的其他方法。

使用 for-next 循环

 

PHP 中最常见的一项任务是遍历一组值。使用 for-next 可以很轻松地完成这项操作。for-next 循环按照定义遍历一组值。比如下面的循环:

for ($i = 0; $i < 10; $i++) {   echo $i . " ";}

生成的结果为:

0 1 2 3 4 5 6 7 8 9

PHP 首先把 0 赋给 $i,这是在循环一开始定义的,只要 $i 小于 10,循环就会继续下去,每执行一次循环,PHP 就会把 $i 的值加一。

也就是说,如果知道 $_GET 数组中有多少个值(可以做到),那么很容易使用下面的形式遍历其中的每个值:

<body>    <p>You entered:</p>

<?php     $form_names = array_keys($_GET);    $form_values = array_values($_GET);

    for ($i = 0; $i < sizeof($_GET); $i++) {       echo "<p>".$form_names[$i]." = " . $form_values[$i] . "</p>";     }?>

</body></html>

sizeof() 告诉您 $_GET 数组中包含多少个值。可以使用这个数据确定什么时候结束循环,如图 7 所示。

图 7. 使用 sizeof 函数结束循环
大小: 72.74 K<br /> 尺寸: 500 x 265<br /> 浏览: 0 次<br /> 点击打开新窗口浏览全图

因为 $_GET 是关联数组,实际上还有另一种选择:foreach 循环。

使用 foreach 循环

关联数组在 PHP 中很常见,该语言提供了一种很简单的方法来获得其中的数据,不需要经过提取键和值的过程。使用 foreach 循环可以直接操纵这类数组。比如下面的代码:

...<?php     foreach ($_GET as $value) {       echo "<p>" . $value . "</p>";     }?>

PHP 第一次执行该循环时,会从 $_GET 数组中取得第一个值,然后将该值赋给 $value 并输出它。然后,返回到循环的顶部,把下一个值赋给 $value,依次处理 $_GET 中的每个值(也包括名称)。最终的结果如下:

<p>roadnick</p><p>ibmquestions@nicholaschase.com</p><p>supersecretpassword</p>

更方便的是,它还能提取值键:

...<?php 

    foreach ($_GET as $key=>$value) {       echo "<p>".$key." = " . $value . "</p>";     }?<...

于是又得到了最初的结果:

图 8. 最初的结果
大小: 72.74 K<br /> 尺寸: 500 x 265<br /> 浏览: 0 次<br /> 点击打开新窗口浏览全图

多表单值

对于表单值,还需要处理偶尔出现的情况:一个名称具有多个表单值。比如,由于用户看不到输入的口令,您可能希望他们输入两次进行确认,以避免发生错误:

...Username: <input type="text" name="name" /><br />Email: <input type="text" name="email" /><br />Password: <input type="password" name="pword[]" /><br />Password (again): <input type="password" name="pword[]" /><br /><input type="submit" value="GO" />...

注意,pword字段名稍做了修改。因为将检索多个值,所以需要将 password 本身看成一个数组。也就是说,一个数组值本身也是另一个数组。提交该表单时,得到的 URL 将是:

http://localhost/registration_action.php?name=roadnick&email=ibmquestions%40nicholaschase.com&pword[]=supersecretpassword&pword[]=supersecretpassword

提交表单相当于创建下面的数组:

$passwords = array("supersecretpassword", "supersecretpassword");$_POST = array("name"=>"roadnick",                            "email"=>"ibmquestions@nicholaschase.com",                            "pword"=>$passwords);

这意味着如果查看口令值,则必须将该值作为数字数组来访问,例如:

...    foreach ($_GET as $key=>$value) {       echo "<p>".$key." = " . $value . "</p>";     }

    $passwords = $_GET["pword"];    echo "First password = ".$passwords[0];    echo "<br />";    echo "Second password = ".$passwords[1];...

提交改变单(或者刷新页面)就会看到其中的差别,如图 9 所示。

图 9. 提交表单

大小: 75.15 K<br /> 尺寸: 500 x 292<br /> 浏览: 1 次<br /> 点击打开新窗口浏览全图

注意,password 字段是作为 Array 输出的,但是您可以直接访问它的值。

 

GETPOST

大小: 85.57 K<br /> 尺寸: 500 x 319<br /> 浏览: 0 次<br /> 点击打开新窗口浏览全图

到目前为止,提交数据使用的一直是 GET 方法,这种方法将数据放在 URL 中。这样做有时候很合适,但有时候不合适。比如,可以通过这种技术使用链接来模仿表单的提交,但是如果有大量的数据,比方说数据来自 textarea(用户可以输入注释),那么这种技术就不是达到目标的最佳方法。因为,Web 服务器通常限制能够在 GET 请求中接收的字符个数。

另外,好的技术和标准需求告诉我们,永远不要使用 GET 执行有“副作用”的操作或者真正 什么事情的操作。比如说,现在我们只是查看数据,这不会带来什么副作用。但是,如果要将数据添加到数据库中,按照定义,这就是有副作用的操作。

很多 Web 程序员不知道这种特殊的限制,因此可能造成问题。使用 GET,特别是将它作为 URL 使用,可能导致系统多次执行一项操作,因为用户将其添加到了收藏夹中,或者搜索引擎正在建立该 URL 的索引, 并不知道实际上是在更新数据库或者执行其他某项操作。

因此,在这种情况下必须使用 POST

使用 POST

使用 POST 方法代替 GET 方法实际上非常简单。首先需要修改 registration.php 页面:

...<h1>Register for an Account:</h1><form action="registration_action.php" method="POST">

Username: <input type="text" name="name" /><br />...

现在,当提交该表单时,URL 会变得非常干净:

http://localhost/registration_action.php

要检索数据,需要使用 registration_action.php 中的 $_POST 数组,而不是 $_GET 数组:

...<body>    <p>You entered:</p>

<?php 

    foreach ($_POST as $key=>$value) {       echo "<p>".$key." = " . $value . "</p>";     }

    $passwords = $_POST["pword"];    echo "First password = ".$passwords[0];    echo "<br />";    echo "Second password = ".$passwords[1];?>

</body></html>

使用 $_POST 数组的方式与使用 $_GET 数组的方式相同。

错误检查:if-then 语句

 

转入下一节之前,如果无法确保两者匹配,那么要求用户两次输入口令就没有任何意义。因此需要使用 if-then 语句:

...    $passwords = $_POST["pword"];    echo "First password = ".$passwords[0];    echo "<br />";    echo "Second password = ".$passwords[1];

    if ($passwords[0] == $passwords[1]) {        echo "<p>Passwords match.  Thank you.</p>";    } else {        echo "<p>Passwords don't match.  Please try again.</p>";    }...

在 if-then 语句中,如果括号中的表达式(该例中为 $passwords[0] == $passwords[1])成立,那么 PHP 将执行第一对括号中的语句,否则不执行。这里还需要包括该语句不成立时需要执行的操作。

要注意的是,这里不是单个等号的 $passwords[0] = $passwords[1],而是双等号的 $passwords[0] == $passwords[1]。双等号是比较运算符,实际上检查两者是否相等。单等号是赋值运算符。如果使用单等号,执行该语句时,PHP 将把 $passwords[1] 的值赋给 $passwords[0],这显然违背了您的意愿。

该例中,如果口令不匹配,那么页面上会发出警告,如图 10 所示。

图 10. 口令不匹配发出的警告

还有两个方便的运算符,运算符(&&)和运算符(||)。比如,可以说:

if (($today == "Monday") && ($status == "Not a holiday")) {      echo "GO TO WORK!!!";}

在上面的例子中,只有当今天是星期一并且不是节假日时,表达式才成立。但对于运算符,只要有一个条件成立,就会返回 true。

学习PHP——2、基本PHP语法

No Comments »

基本的 PHP 页面

变量

变量是数据的占位符。变量可以赋值,这之后,只要 PHP 遇到该变量,就会使用赋给它的值代替。比如,将页面修改如下:

<html><title>Workflow Registration</title><body>    <p>You entered:</p>

<?php     $username = "tyler";    $password = "mypassword";

    echo "<p>Username = " . $username . "</p>";     echo "<p>Password = " . $password . "</p>"; ?>

</body></html>

保存该文件(必要的话可以上传)并刷新浏览器,可以看到如图 2 所示的结果。

图 2. 刷新后的浏览器
大小: 63.96 K<br /> 尺寸: 500 x 265<br /> 浏览: 1 次<br /> 点击打开新窗口浏览全图

首先要注意的是,每一行都以分号结束;其次,是用句点连接文本,或者说将其合并在一起。这样就可以将任意数量的字符串或文本块合并到一起。

关于变量,还有一点需要注意:在 PHP 中,变量名是区分大小写的,因此 $UserName 不同于 $username

采用一致的命名约定,比如决定所有变量都使用小写形式,这可以在很大程度上防止出现无法匹配错误。

继续下一步的讨论之前,首先看一类特殊的变量。

常量

变量的值可以改变任意次,但有时候可能希望不改变变量的值。这些项不称为变量,而是称为常量。比如,可能希望定义表示每页标题的常量:

<?php

   define("PAGE_TITLE", "Workflow Registration");

?>

<html><title><?php echo PAGE_TITLE ?></title><body>    <p>You entered:</p>...

(现在看起来似乎意义不大,但是后面将会看到这一定义可在多个页面中使用。)

注意,定义的是常量的名字和值。如果在定义常量之后再改变它的值,就会收到一条错误消息。

还要注意的是,在引用常量时,比如在 title 元素中,不使用美元符号,只包含常量名。常量名没有限制,但全部采用大写形式比较方便。

更简单的输出

到目前为止,我们一直使用 echo 命令输出信息,但是如果输出的数据只有一个,那么该命令可能显得比较麻烦。

所幸的是,PHP 提供了一种更简单的方法。通过使用输出运算符 <?= ?> 结构,可以指定要输出的信息:

<?php   define("PAGE_TITLE", "Workflow Registration");?><html><title><?= PAGE_TITLE ?></title><body>    <p>You entered:</p>...

注意,在使用输出运算符时,输出信息的后面没有分号。

后面还将学习其他的 PHP 基本结构,如 if-then 语句,因为创建应用程序时要用到它们。

我们来看一看用 PHP 创建页面的基础。下一节将介绍如何使用 HTML 表单向 PHP 提交信息,但首先需要了解如何完成一些基本的任务。

首先创建一个最基本的 PHP 页面:

<html><title>Workflow Registration</title><body>    <p>You entered:</p>    <p><?php echo "Some Data"; ?></p></body></html>

这仅仅一个简单的 HTML 页面,其中包含一段 PHP 代码(粗体显示)。当服务器遇到 <?php 符号时,就知道要计算后面的命令,而不是直接将其发送给浏览器。它保存当前的指令(稍后讨论),直到这一段代码结束(遇到 ?> 符号)。

这里只有一条命令 echo,它告诉服务器输出给定的文本。就是说如果保存该页面,然后从服务器上请求,浏览器将收到以下内容:

<html><title>Workflow Registration</title><body>    <p>You entered:</p>    <p>Some Data</p></body></html>

为了查看这一项操作,可以
将该文件保存为 registration_action.php,并转移到服务器的文档根目录下。对于 Apache,根目录一般是
/var/www/html;而对于 Internet Information Services,根目录是 C:\Inetpub\wwwroot。

打开浏览器,并将它指向 http://localhost/registration_action.php,可以看到类似图 1 的结果。

图 1. echo 命令的输出
大小: 42.76 K<br /> 尺寸: 500 x 226<br /> 浏览: 0 次<br /> 点击打开新窗口浏览全图

这样就完成了您的第一个 PHP 页面。

学习PHP——1、开始之前

No Comments »

关于本教程

先决条件
学习本课程,需要安装 Web 服务器、PHP 和数据库,并且可以使用它们。如果拥有主机帐户,并且在服务器上安装了 PHP V5,能够访问某个 MySQL 数据库,那么也可以使用该帐户。否则就要下载并安装以下程序包:
Web 服务器—— 无论在 Windows® 上,还是在 Linux®(就此而言也可以是 Mac OS X)平台上,都可使用 Apache Web 服务器。V1.3 或 2.0 版本均可,但本教程中的介绍以 V2.0 为主。Apache 可以从 http://www.apache.org 下载。如果使用 Windows 平台,还可以选择 Internet Information Services,它是 Windows 的一部分。
PHP—— 当然,还需要 PHP 的一个发行版本。撰写本文的时候我同时使用了 PHP V4 和 V5,但是因为 V5 中发生了一些变化,所以我们将以该版本为主。(在本教程中,版本并不很重要,但是对本系列教程的后面两部分有影响。)可以从 http://us4.php.net/downloads.php 下载 PHP。
数据库—— 这个项目的一部分涉及到将数据保存到数据库中,因此也需要一个数据库。在本教程中,以 MySQL 数据库为主,因为这是与 PHP 结合使用的最常见的数据库。可以从 http://dev.mysql.com/downloads/ 下载 MySQL。
关于作者
Tyler Anderson 于 2004 年从 Brigham Young University 获得了计算机科学学位,现在正在攻读计算机工程科学博士学位的最后一年。之前,他曾做过 DPMG.COM 的数据库程序员,目前是位于俄勒冈州比弗顿的 Stexar Corp. 的工程师。您可以通过 tyleranderson5@yahoo.com 与他联系。
Nicholas Chase 曾经参与过许多公司的网站开发,包括 Lucent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers。他曾经做过高中的物理教师、低级放射性废弃设备管理员、在线科幻杂志的编辑、多媒体工程师和 Oracle 教员,并担任过一家交互通信公司的首席技术官。他出版了多部著作,其中包括 XML Primer Plus(Sams,2002)。他很想听听读者的意见,您可以通过 ibmquestions@nicholaschase.com 与他联系。
本文转自developerWorks 中国网站

本教程将引导您使用 PHP 创建一个简单的工作流应用程序。用户可以注册帐户,上传需要批准的文件,查看和下载已经批准的文件。指派为管理员的用户可以查看和批准上传的文件,让所有用户都能使用这些文件。第 2 和第 3 部分将探讨 HTTP 口令保护和其他相关问题。
本教程的主要内容如下:
创建基本的页面
变量、循环和 if-then 语句
函数
连接到数据库
使用 include 文件
工具
谁应该阅读本教程?
如果您希望学习使用 PHP 创建基于 Web 的应用程序,那么可以从这里开始,本系列教程由三部分组成,这是第 1 部分。PHP 虽然是一种易学的脚本语言,但仍然能够用它创建功能强大的复杂应用程序。本教程将引导您使用 HTML 表单创建基本的 PHP 页面,并且还将介绍数据库访问。
本教程假设您没有使用过 PHP。实际上,阅读本教程不要求具备其他编程语言知识,尽管熟悉 HTML 的概念会很有帮助。

做起来总比想象难

No Comments »

今天晚上一直在看PHP,觉得PHP真是太神奇了,也很简单,所以就有了种冲动今天晚上要写个在线办公系统出来,因为目前正需要一个这样的系统,而在网上又没找到合适的。

这个办公系统最先开发的功能主要是处理ACCA书店的订单:淘宝上和汇款的订单都录入OA里面,发货后录入单号;淘宝上和汇款的customer都可以通过姓名、电话和淘宝订单号中的两样登陆查询自己的订单情况,同时也可以在线下单。最急迫的也就这两个功能吧,后期OA该有的功能都会增加上去。

从图书馆回来后就开始在小黑上远程控制台机配置开发环境,这倒是挺快:xampp+phpedit,该有的都有了,开始用phpedit写代码,config.php倒是写完了,但是开始建数据表的才知道这个是最麻烦的,事先都没规划。而且还要涉及以前excel里面数据转换到mysql。

转换倒是很快就找到办法了,下面是我觉得最简单也是最完美的一种方法:

一、假设你的表格有A、B、C三列数据,希望导入到你的数据库中表格table,对应的字段分别是col1、col2、col3

二、在你的表格中增加一列,利用excel的公式自动生成sql语句,具体方法如下:

1、增加一列(假设是D列);
2、在第一行的D列,就是D1中输入公式:=CONCATENATE(”insert into table (col1,col2,col3) values (’”,A1,”‘,’”,B1,”‘,’”,C1,”‘);”)
3、此时D1已经生成了如下的sql语句:insert into table (col1,col2,col3) values (’a',’11′,’33′);
4、将D1的公式复制到所有行的D列(就是用鼠标点住D1单元格的右下角一直拖拽下去啦)
5、此时D列已经生成了所有的sql语句
6、把D列复制到一个纯文本文件中,假设为sql.txt

三、把sql.txt放到数据库中运行即可,你可以用命令行导入,也可以用phpadmin运行。

呵呵,说它简单,是因为基本上可以不用任何借助任何工具(excel当然是必须得啦),比如phpmyadmin(虚拟主机可能没操作phpmyadmin的权限);说它完美,是因为这种方法你不用担心编码的问题,也就不会出现乱码了,开始用了几个转换程序,不但收费,而且还不能支持中文。

数据转换问题解决了,但是直到现在都还没开始写程序,一直在为数据字典烦恼。参考了ecshop和shopex中order相关的表结构,但是还是没全部弄好,看来得明天慢慢规划了。

F9-竟然全部都会

No Comments »

进考场之前感觉和六月份考2.3差不多,没怎么做题,就看了教材(我就喜欢看教材,有连贯性的东西才不那么枯燥)。但拿到考卷后竟然发现那些题全都会,ACCA都考了一半多的科目了,这种情况还是第一次遇到啊。今天真是一路奋笔疾书啊,但是还是没有时间观念啊,第一道题写了5PP,花了将近两道题的时间;做完第二道题发现三道题的时间都已经过去了。然后三四题挑计算部分做,第四题的hedging只列出了公式,还没计算。总的算下来,只做了三道题的量。哎,恐怕这就是不做题的通病吧,我每堂考试基本上前面一半题要用去2/3时间,但今天是缺时间最严重的,因为全部都会;而2.3貌似是我唯一一门不缺时间的,因为不会的太多了。算了,都过去了,通过应该还是没问题的,不过做题速度再一次给我上了深刻的一课啊,F7不能大意了,一定要做题。

可能是由于F9得到了太大的满足吧,也可能是由于觉得离F7还有4天,所以没紧迫感吧,今天晚上没看ACCA,而是开始学PHP了。在图书馆基本上把PHP入门内容都看了,刚才又看了几十页PHP and MySQL Web Development(Third Edition)。PHP太强大了,决定这次已经要坚持下来,不能像去年学ASP那样半途而费了。昨晚在网上搜了一下学习PHP的教材,貌似PHP and MySQL Web Development这本书还不错,本来准备买书的,但网上评价那个翻译不行,所以就打消了念头。在网上下了英文版,这本书真不错。学ACCA也都一年多了,看原版教材当然没有任何语言难关,而且英文看惯了,看着这书特亲切。但是在中国买不到这书的原版,图书馆竟然连这书的中文版都没有,今后只有打印出来看了。

说到PHP,在中国真是弱势啊。图书馆ASP的教材一大堆,在网上一查有上百种,而PHP的我就找到了几本,不过有一本还是不错的,现在记不得名字了,今后有时间到图书馆把它看完。呵呵,说到图书馆还是挺兴奋的,好像里面计算机方面的书都是为我准备的一样。主要应该是为了排场,也有开设了计算机系的原因,图书馆IT类藏书还是挺丰富的。不过谁都知道我们学校计算机系的人都是垃圾,估计他们都是一学期都不进一次图书馆,所以这些书当然只有留给我了,基本上都是全新的,加上现在图书馆环境这么好,在里面看书真是一种享受啊。今后决定把小黑搬到图书馆去开发我的xy2s.com,不过最近里面的无线信号不稳定,上网可能是问题啊,到时候看吧。

睡了,明天继续早起,F7不能大意。