+ -
当前位置:首页 → 问答吧 → 《PHP5与MySQL5 Web开发技术详解》之我见

《PHP5与MySQL5 Web开发技术详解》之我见

时间:2007-11-03

来源:互联网

与这本书的相识早在于今年的7月,当时看了作者发出来的目录,并没有多大兴趣。因为从目录的内容来看,许多部分都差不多是老调重弹。不过,现在看了这本书的一些试读章节,倒是有了不小的惊喜。这本书与市面上的书相比,有一些新鲜的内容,比如

第7章  PHP国际化与本地化(这在国内的PHP图书中几乎是未曾见过身影)
第17章  PHP数据库抽象层(作者能详细叙述几种不同的抽象层操作,这也是十分难能可贵的)
第18章  Smarty与模板技术(国内的图书,还没有哪一本有详细讲解过)
第20章  使用PHP编写Shell(这一章绝对是国内首例了)
第26章  PHP与WAP技术(这一章在国内的PHP图书中也不曾见过,近来刚好要搞点WAP的东西,作者真是帮了大忙啊)
第29章  PHP优化技巧(这一章看起来也十分诱人)

第2部分  实战PHP5,这一部分的范例看起来比较实用,而且作者说书中只是讲解与项目相关的东西,而把代码放到光盘上,这更有利于读者对整个项目的理解和把握。

最近公司又有购书计划,在看了这本书的一些样章后,我毫不犹豫地向公司主管推荐它。不过,可惜,现在书还没有到手,只能先看着样章过过瘾,顺便也发发一些感想。

从总体上来说,作者功力深厚,写这本书也很专心细致,涉及到PHP开发方方面面的问题,既有总体把握,又有实现细节,而且能在phpchina论坛热心地与大家交流,实为难得。当然,任何事情都不是十全十美,这本书同样也有一些不足的地方,就是书中一些细节的东西把握不够好,有不少的错漏。作者说“我希望看到更多的批评或建议内容,而不是溢美之辞”,那我就大胆地吹毛求疵一下。

这里先说明一点,所有的错漏均按照贴出来的样章(有些章节是在CSDN上看的,毕竟那里贴的章节比较多),由于没有拿到书,具体书中有没有这些错漏就不能保证了。另外,有些不确定是不是错漏,毕竟个人水平有限,只能先当成疑问吧



第5章 表单――处理用户输入


5.1 表单与HTML中有这么一句话:
导致一个页面在IE、Firefox、Mozila几个不同浏览器中显示得千差万别。
Mozila少了一个'l',应该是'Mozilla'


5.4表单元素,1.动态生成一组单选按钮这段代码中,生成的标签是大写的,按照xhtml规范当为小写,下面的示例也都是小写的,不明白为什么这个示例却是大写的


5.6.2  使用extract()函数
@extract(i_addslashes($_POST), EXTR_OVERWRITE);
不明白为什么冒出个不知所以的i_addslashes,如果不是自定义函数,应该写成addslashes比较理想


5.8.3避免表单重复提交
这一小节的前两个示例是用js实现的,作者最好加上一句“如果客户端禁用js,则无效”这样的话,一来可以提醒读者,二来也与下文cookie的写作风格相符(下面用cookie的方法来避免重复提交,就有提到如果客户端禁用cookie则无效)

另外,这一小节中,用session的方法来解决表单的重复提交,有一个小缺漏,按照作者给出的代码是没办法避免表单的重复提交的。
if($_POST['originator'] == $_SESSION['code']){
// 处理该表单的语句,省略
}else{
echo ‘请不要刷新本页面或重复提交表单!’;
}
在这段代码中,少了一个关键的语句,在
// 处理该表单的语句,省略
之前,要有一句:unset($_SESSION['code']);
另外,echo ‘请不要刷新本页面或重复提交表单!’;这句话用的是中文引号,这是个小bug


这一章中,有不少代码段将西文的','打成中文的','了,希望原书不是这样。

总的来说,这一章质量还是很高的,涵盖了许多经典的表单提交与安全问题。不过,感觉有些地方不够细致,比如XSS、SQL注入攻击,这些对新手来说,没有进一步的讲解,会有点摸不着头脑。而这些对中高层次的人来说,就显得比较浅显。但话说回来,PHP相关的安全问题是很多的,足可以用整本书来讲解(国外就有专门讲解PHP安全方面的书籍),作者也只能有所取舍了。



第20章 使用PHP编写Shell


-B <begin_code>     运行PHP <begin_code> 在输入一行前
-R <code>           运行 PHP <code> 对输入的每一行
-F <file>           解析和执行 <file> 对输入的每一行
-E <end_code>       运行PHP <end_code> 在所有行输入后操作

不理想的表达方式,感觉像英文直译过来的
改成类似"在输入一行前运行PHP <begin_code>"


20.5  CLI开发


如果要在Windows系统下运行该脚本,则不需要设置文件属性,可以直接运行该脚本。
Microsoft Windows [版本 6.0.6000]
版权所有 (C) 2006 Microsoft Corporation。保留所有权利。
C:\ >myfile.php
你好 PHP CLI!
再重申一次:如果在Windows平台,CLI脚本的第一行一定要写正确php.exe所在的位置,像这样(另外,如果要在CLI脚本中加注释语句,则要把注释写在PHP标签里面,因为CLI解释只认识第一行,不在PHP标签里认为是语法错误):
#!C:\php\php.exe -q

测试时不成功,直接输入myfile.php变成用相关的编辑器打开脚本(是不是要将php文件类型与php.exe关联?)



20.5.3
<?php
    $file = file_get_contents("php://stdin", "r");
    echo $file;
?>

这段代码可以输入信息,但作者没有提及如果结束输入(回车是无法结束输入的,回车会被当成输入的一部分),对不知情的人来说,是件痛苦的事情,结束输入的方法是按Ctrl+Z

if(!defined("STDIN")) {
define("STDIN", fopen('php://stdin','r'))
}
define("STDIN", fopen('php://stdin','r'))后面应该有;



以上代码将把php://stdout作为输出通道显式打开,并且php://output通常以与php://stdout相同的方法运行。

这样说有点唐突,突然冒出个php://output来,改成类似:
也可以使用php://output来代替php://stdout,php://output通常以与php://stdout相同的方法运行。
比较好

这一章比较新颖,不过,讲的都跟linux关系比较大,如果示例也能放几个windows的,那就更好了。



第24章 XML与RSS

对XML不熟悉,下面这些有的只是个人意见,并不一定是书中的错误
这一章比较麻烦,有的示例是要求所用的PHP版本高于一定的版本才能用的。比如在24.3.4  RSS 2.0这一小节,有这样的一段代码:
<?php
$rss = new SimpleXMLElement('rss20.xml',NULL, TRUE);
foreach ($rss->channel->children() as $child){
        echo $child->getName() . "\n";
}
?>
运行时报错,说没有getName方法,后来查了一下PHP手册,这个方法只有PHP版本>= 5.1.3才能使用(我用的是5.1.2)。这些作者没有特别说明,会给人造成一定的困扰(不过,可能作者在书的最前面有说明本书代码的运行环境)。大家要试验的话,还是尽量使用高版本的好。



24.1.2  XML与HTML
在XML/XHTML中,注意要把一些字符,如&、<、>、"和'分别转换为&、@lt;、>、"和'这些HTML实体字符。


分别转换为&、@lt;、>、"和'
应改为:
分别转换为&、<、>、"和'



24.2  创建与解析XML文档

与在一个数据库中的表单与视图之前选择一样
"之前"改为"之间"



24.2.1  创建一个XML文档

$xml .= "</$xmlname >\n";
多了一个空格,应为:(不影响使用)
$xml .= "</$xmlname>\n";



24.2.2  使用SAX解析XML

echo str_repeat(' ', $level, ' '). "<<<$tag;
应改为:
echo str_repeat(' ', $level, ' '). "<<<$tag";
代码中用了中文的,号,不知道实际的书是不是这样的?
没有给出test1.xhtml的代码


/* 例出XML属性为一个字符串 */
"例出"应改为"列出"




24.2.3  DOM
1.解析HTML文档

<html xmlns="http://www.w3.org/1999/xhtml">
<html>
多了一个<html>




例24.2:XmlDomHtml.php,操作一个XHTML。

XmlDomHtml.php应该为utf-8编码,XmlDomHtml.html用ANSI编码才能成功(编码类型对记事本而言),否则会有乱码。另外,应该将XmlDomHtml.php中的
$content = htmlspecialchars(utf8_decode($element->textContent));
改为:
$content = htmlspecialchars($element->textContent);
才能防止其他乱码的出现



2.解析XML文档

用来生成test5.xml的那一段PHP代码应该用utf-8编码保存,才能得到与书上相同的输出结果
再做DOM解析test5.xml,这一段的PHP代码也应该用utf-8编码保存



24.2.4  SimpleXML

print $sxe->to_xml();
提示:Fatal error: Call to undefined method SimpleXMLElement::to_xml() in E:\APMServ5.2.0\www\htdocs\dz6newest\createXML.php on line 13

貌似没有to_xml()方法,在PHP手册上也没有查到,倒是有asXML()



24.3.2  RSS 0.9

SimpleXMLRss091.php代码中:
foreach ($rss->item as $item){
应改为:
foreach ($rss->channel->item as $item){



例24.9:simplens.php,解析RSS 1.0及命名空间

$titles = $s->xpath('//rss:item[ _

starts-with(dc:date, "2004-01-")]/rss:title');

调不通,不懂xpath,看起来有点怪怪的



我们使用SimpleXML的SimpleXMLElement可以取得指定的RSS节点,脚本如下。

cho $rss->channel->title . "\n";
其中的"cho"应为"echo"


这一章可以说是一个简介和概览,所以不够细致,对XML不了解的读者(比如我),读起来比较困难乏味。


就先写这些吧,其他的章节还没有细看,等看完了,再上来补充一下想法。

作者: kelystor   发布时间: 2007-11-03

感谢您的支持,如您所说,这六章不仅是国内的PHP书首见,对于外版的书籍也为鲜见:)
没错,与各位在路上的PHP开发者一同进步,一起提高,然后将这本书成为每位初学者以及开发者的最佳参考书,也是我的想法,而且是双赢的行为。

下面在问题标注如下:
导致一个页面在IE、Firefox、Mozila几个不同浏览器中显示得千差万别。
Mozila少了一个'l',应该是'Mozilla'
>>正确。
5.4表单元素,1.动态生成一组单选按钮这段代码中,生成的标签是大写的,按照xhtml规范当为小写,下面的示例也都是小写的,不明白为什么这个示例却是大写的
>>应为小写
5.6.2  使用extract()函数
@extract(i_addslashes($_POST), EXTR_OVERWRITE);
不明白为什么冒出个不知所以的i_addslashes,如果不是自定义函数,应该写成addslashes比较理想
>>i_addslashes()是忽略大小写的addslashes。

5.8.3避免表单重复提交
这一小节的前两个示例是用js实现的,作者最好加上一句“如果客户端禁用js,则无效”这样的话,一来可以提醒读者,二来也与下文cookie的写作风格相符(下面用cookie的方法来避免重复提交,就有提到如果客户端禁用cookie则无效)
>>同意
另外,这一小节中,用session的方法来解决表单的重复提交,有一个小缺漏,按照作者给出的代码是没办法避免表单的重复提交的。
if($_POST['originator'] == $_SESSION['code']){
// 处理该表单的语句,省略
}else{
echo ‘请不要刷新本页面或重复提交表单!’;
}
在这段代码中,少了一个关键的语句,在
// 处理该表单的语句,省略
之前,要有一句:unset($_SESSION['code']);
>>感谢您的细心
另外,echo ‘请不要刷新本页面或重复提交表单!’;这句话用的是中文引号,这是个小bug
>>有的时候word会把英文半角英文的单引号,私自给改成中文的单引号。也请各位读者注意,在光盘代码里不存在该现象。
总的来说,这一章质量还是很高的,涵盖了许多经典的表单提交与安全问题。不过,感觉有些地方不够细致,比如XSS、SQL注入攻击,这些对新手来说,没有进一步的讲解,会有点摸不着头脑。而这些对中高层次的人来说,就显得比较浅显。但话说回来,PHP相关的安全问题是很多的,足可以用整本书来讲解(国外就有专门讲解PHP安全方面的书籍),作者也只能有所取舍了。
>>说得非常中肯。

第20章 使用PHP编写Shell

-B <begin_code>     运行PHP <begin_code> 在输入一行前
-R <code>           运行 PHP <code> 对输入的每一行
-F <file>           解析和执行 <file> 对输入的每一行
-E <end_code>       运行PHP <end_code> 在所有行输入后操作
不理想的表达方式,感觉像英文直译过来的
改成类似"在输入一行前运行PHP <begin_code>"
>>应该是倒置了
20.5  CLI开发

如果要在Windows系统下运行该脚本,则不需要设置文件属性,可以直接运行该脚本。
Microsoft Windows [版本 6.0.6000]
版权所有 (C) 2006 Microsoft Corporation。保留所有权利。
C:\ >myfile.php
你好 PHP CLI!
再重申一次:如果在Windows平台,CLI脚本的第一行一定要写正确php.exe所在的位置,像这样(另外,如果要在CLI脚本中加注释语句,则要把注释写在PHP标签里面,因为CLI解释只认识第一行,不在PHP标签里认为是语法错误):
#!C:\php\php.exe -q
测试时不成功,直接输入myfile.php变成用相关的编辑器打开脚本(是不是要将php文件类型与php.exe关联?)
>>应该是关联的问题,我的本地可以输出。

20.5.3
<?php
    $file = file_get_contents("php://stdin", "r");
    echo $file;
?>
这段代码可以输入信息,但作者没有提及如果结束输入(回车是无法结束输入的,回车会被当成输入的一部分),对不知情的人来说,是件痛苦的事情,结束输入的方法是按Ctrl+Z
>>Ctrl+Z或Ctrl+C均可。
if(!defined("STDIN")) {
define("STDIN", fopen('php://stdin','r'))
}
define("STDIN", fopen('php://stdin','r'))后面应该有;
}
>>代码粘贴的原因,书上是全的。

以上代码将把php://stdout作为输出通道显式打开,并且php://output通常以与php://stdout相同的方法运行。
这样说有点唐突,突然冒出个php://output来,改成类似:
也可以使用php://output来代替php://stdout,php://output通常以与php://stdout相同的方法运行。
比较好
>>可以这么理解:)
这一章比较新颖,不过,讲的都跟linux关系比较大,如果示例也能放几个windows的,那就更好了。
>>CLI在Unix下跑在cron下可以做很多事,在Windows测试效果比较好:)

第24章 XML与RSS
对XML不熟悉,下面这些有的只是个人意见,并不一定是书中的错误
这一章比较麻烦,有的示例是要求所用的PHP版本高于一定的版本才能用的。比如在24.3.4  RSS 2.0这一小节,有这样的一段代码:
<?php
$rss = new SimpleXMLElement('rss20.xml',NULL, TRUE);
foreach ($rss->channel->children() as $child){
        echo $child->getName() . "\n";
}
?>
运行时报错,说没有getName方法,后来查了一下PHP手册,这个方法只有PHP版本>= 5.1.3才能使用(我用的是5.1.2)。这些作者没有特别说明,会给人造成一定的困扰(不过,可能作者在书的最前面有说明本书代码的运行环境)。大家要试验的话,还是尽量使用高版本的好。
>>好,声明本书的代码均是PHP5.21及以上版本上运行通过。

24.1.2  XML与HTML
在XML/XHTML中,注意要把一些字符,如&、<、>、"和'分别转换为&、@lt;、>、"和'这些HTML实体字符。

分别转换为&、@lt;、>、"和'
应改为:
分别转换为&、<、>、"和'
>>应为&、<、>、和',单引号(')无需转换,是排版的原因。

24.2  创建与解析XML文档
与在一个数据库中的表单与视图之前选择一样
"之前"改为"之间"
>>可以。

24.2.1  创建一个XML文档
$xml .= "</$xmlname >\n";
多了一个空格,应为:(不影响使用)
$xml .= "</$xmlname>\n";
>>没错。不影响代码执行。

24.2.2  使用SAX解析XML
echo str_repeat(' ', $level, ' '). "<<<$tag;
应改为:
echo str_repeat(' ', $level, ' '). "<<<$tag";
代码中用了中文的,号,不知道实际的书是不是这样的?
>>排版时的问题。也请其它朋友注意。
没有给出test1.xhtml的代码
>>光盘中应有该文件。
24.2.3  DOM
1.解析HTML文档
<html xmlns="http://www.w3.org/1999/xhtml">
<html>
多了一个<html>
>>是的。

例24.2:XmlDomHtml.php,操作一个XHTML。
XmlDomHtml.php应该为utf-8编码,XmlDomHtml.html用ANSI编码才能成功(编码类型对记事本而言),否则会有乱码。另外,应该将XmlDomHtml.php中的
$content = htmlspecialchars(utf8_decode($element->textContent));
改为:
$content = htmlspecialchars($element->textContent);
才能防止其他乱码的出现
>>XmlDomHtml.php的内码应该为utf-8编码。非常细心。

2.解析XML文档
用来生成test5.xml的那一段PHP代码应该用utf-8编码保存,才能得到与书上相同的输出结果
再做DOM解析test5.xml,这一段的PHP代码也应该用utf-8编码保存
>>脚本均为utf-8编码保存。

24.2.4  SimpleXML
print $sxe->to_xml();
提示:Fatal error: Call to undefined method SimpleXMLElement::to_xml() in E:\APMServ5.2.0\www\htdocs\dz6newest\createXML.php on line 13
貌似没有to_xml()方法,在PHP手册上也没有查到,倒是有asXML()
>>是as_xml()方法。

24.3.2  RSS 0.9
SimpleXMLRss091.php代码中:
foreach ($rss->item as $item){
应改为:
foreach ($rss->channel->item as $item){
>>没错。

例24.9:simplens.php,解析RSS 1.0及命名空间
$titles = $s->xpath('//rss:item[ _
starts-with(dc:date, "2004-01-")]/rss:title');
调不通,不懂xpath,看起来有点怪怪的
>>需要再测试。

我们使用SimpleXML的SimpleXMLElement可以取得指定的RSS节点,脚本如下。
cho $rss->channel->title . "\n";
其中的"cho"应为"echo"
>>echo $rss->channel->title . "\n";

作者: phpcast   发布时间: 2007-11-03

看来这本书真的很有吸引力啊

特别是杜老师还在论坛上面认真听取读者的讨论,难能可贵啊。

嗯,顶!

作者: hougaoping   发布时间: 2007-11-04

这本书的确不错,不过出学者应该会有很多疑问,还要边看书边看手册

ps: PHP与WAP技术  这本书应该不是第一个讲的吧

作者: jayeeliu   发布时间: 2007-11-04

作者: luzhou   发布时间: 2007-11-04

刚订了本。

作者: luzhou   发布时间: 2007-11-04

感谢作者的回复,不过,有些地方还是有点疑惑。

i_addslashes()是忽略大小写的addslashes
这个i_addslashes()应该是自定义函数(可能是在书本前面的章节定义的),我在PHP手册上没查到这个函数。而且,我不明白的是,addslashes还有分什么大小写吗?查了PHP手册上,上面是对addslashes是这样说的:
返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)
列出的那些特殊字符没有什么大小写的分别吧?


24.2.4  SimpleXML
print $sxe->to_xml();
提示:Fatal error: Call to undefined method SimpleXMLElement::to_xml() in E:\APMServ5.2.0\www\htdocs\dz6newest\createXML.php on line 13
貌似没有to_xml()方法,在PHP手册上也没有查到,倒是有asXML()
>>是as_xml()方法。
呃,这个as_xml()应该是错的。我用php5.2版本运行,也是提示找不到这个方法,PHP手册上也没有这个方法,应该是asXML()。



to jayeeliu:
PHP与WAP技术,这本书当然不是第一个讲。不过,我说的是“在国内的PHP图书中也不曾见过”,PHP与WAP技术多是在讲解WAP开发的书籍中顺带讲解,但在PHP的书中讲解WAP倒是不曾见过。

作者: kelystor   发布时间: 2007-11-05

热门下载

更多