针对初学PHP者的疑难问答

1,问:为什么出现“APACHE.EXE: cannot determine local host name.”?
答:

由于Windows版本的Apache默认情况下不指定ServerName,所以运行时会出错。

解决的办法是修改Apache安装目录下的conf目录下的httpd.conf:
- 搜索ServerName
- 去掉前面的#号
- 把ServerName后面的值换成你自己的设置,如localhost之类的
- 保存,重新启动Apache
2,问:PHP代码中函数前面的@是什么意思?
答: "@"的作用是忽略调用该函数时产生的错误信息。

阅读全文

PHP中Cookies指南

综述

  Cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie是由Web服务器保存在用户浏览器上的小文件,它可以包含有关用户的信息(如身份识别号码、密码、用户在Web站点购物的方式或用户访问该站点的次数)。无论何时用户链接到服务器,Web站点都可以访问Cookie信息。

  怎样设置cookies?

  在PHP中可以使用setcookie函数设置一个cookie。cookie是 HTTP标头的一部分, 因此设置cookie功能必须在任何内容送到浏览器之前。这种限制与header()函数一样。任何从客户端传来的cookie将自动地转化成一个PHP变量。PHP取得信息头并分析, 提取cookie名并变成变量。因此,假如设置cookie如setcookie("mycookie","Cookies")php将自动产生一个名为$mycookie,值为"Cookies"的变量。

  我们来看一下setcookie函数语法:


  init setcookie(string CookieName,string CookieValue,int CookieExpireTime,path,domain,int secure);

  参数说明:

  PATH:表示web服务器上的目录,默认为被调用页面所在目录

  DOMAIN:cookie可以使用的域名,默认为被调用页面的域名。这个域名必须包含两个".",所以假如你指定你的顶级域名,你必须用".mydomain.com"

  SECURE:假如设为"1",表示cookie只能被用户的浏览器认为是安全的服务器所记住.

cookies使用举例

  假设我们有这样一个需要注册的站点,它自动识别用户的身份并进行相关的操作:假如是已经注册的用户,发送给他信息;假如不是已经注册的用户,则显示一个注册页面的链接。

  按照上面的要求,我们先创建数据库用来保存注册用户的信息:名字(first name),姓(last name),Email地址(email address),计数器(visit counter)。

  先按下面步骤建表:


mysql> create database users;
    Query OK, 1 row affected (0.06 sec)
    mysql> use users;
    Database changed
    mysql> create table info (FirstName varchar(20), LastName varchar(40), email varchar(40), count varchar(3));
    Query OK, 0 rows affected (0.05 sec)
  然后建一个php页面对照数据库检查cookies。

  由于php能转换可识别的cookie为相应的变量,所以我们能检查一个名为"myCookies" 的变量:


<? if (isset($myCookies)) { // 假如Cookie已经存在
    ……
    } else { //假如Cookie不存在
    ……
    }
    ?>

  当cookie存在时,我们执行下面步骤:

  首先取得cookie值,用explode函数分析成不同的变量,增加计数器,并设一个新cookie:


$info = explode("&", $myCookies);
    ……
    $count ;
    $CookieString=$FirstName.'&'.$LastName.'&'.$email.'&'.$count;
    SetCookie ("myCookies",$CookieString, time() 3600); //设置cookie

  接着用html语句输出用户信息。

  最后,用新的计数器值更新数据库。

  假如这个cookie不存在,我们显示一个注册页(register.php)的链接。

阅读全文

实例学习PHP中的正则表达式

首先,让我们看看两个非凡的字符:’^’ 和 ‘$’ 他们是分别用来匹配字符串的开始和结束,一下分别举例说明


"^The": 匹配以 "The"开头的字符串;
"of despair$": 匹配以 "of despair" 结尾的字符串;
"^abc$": 匹配以abc开头和以abc结尾的字符串,实际上是只有abc与之匹配
"notice": 匹配包含notice的字符串


你可以看见假如你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边
这里还有几个字符 '*', ' ',和 '?', 他们用来表示一个字符可以出现的次数或者顺序. 他们分别表示:"zero or more", "one or more", and "zero or one." 这里是一些例子:


"ab*": 匹配字符串a和0个或者更多b组成的字符串("a", "ab", "abbb", etc.);
"ab ": 和上面一样,但最少有一个b ("ab", "abbb", etc.);
"ab?":匹配0个或者一个b;
"a?b $": 匹配以一个或者0个a再加上一个以上的b结尾的字符串.


你也可以在大括号里面限制字符出现的个数,比如


"ab{2}": 匹配一个a后面跟两个b(一个也不能少)("abb");
"ab{2,}": 最少更两个b("abb", "abbbb", etc.);
"ab{3,5}": 2-5个b("abbb", "abbbb", or "abbbbb").



你还要注重到你必须总是指定 (i.e, "{0,2}", not "{,2}").同样,你必须注重到, '*', ' ', 和'?' 分别和一下三个范围标注是一样的,"{0,}", "{1,}", 和 "{0,1}"。

现在把一定数量的字符放到小括号里,比如:


"a(bc)*": 匹配 a 后面跟0个或者一个"bc";
"a(bc){1,5}": 一个到5个 "bc."


还有一个字符 '│', 相当于OR 操作:


"hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;
"(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;
"(a│b)*c": 匹配含有这样 - 多个(包括0个)a或b,后面跟一个c
的字符串 的字符串;


一个点('.')可以代表所有的 单一字符:


"a.[0-9]": 一个a跟一个字符再跟一个数字的 (含有这样一个字符串的字符串将被匹配,以后省略此括号)
"^.{3}$": 以三个字符结尾 .


中括号括住的内容只匹配一个 单一的字符


"[ab]": 匹配单个的 a 或者 b ( 和 "a│b" 一样);
"[a-d]": 匹配'a' 到'd'的单个字符 (和"a│b│c│d" 还有 "[abcd]"效果一样);
"^[a-zA-Z]": 匹配以字母开头的字符串
"[0-9]%": 匹配含有 形如 x% 的字符串
",[a-zA-Z0-9]$": 匹配以逗号在加一个数字或字母结尾的字符串


你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用'^' 作为开头 (i.e., "%[^a-zA-Z]%" 匹配含有 两个百分号里面有一个非字母 的字符串).

为了能够解释,但"^.[$()│* ?{"作为有非凡意义的字符的时候,你必须在这些字符面前加'', 还有在php3中你应该避免在模式的最前面使用, 比如说,正则表达式 "($│?[0-9] " 应该这样调用 ereg("($│?[0-9] ", $str) (不知道php4是不是一样)

不要忘记在中括号里面的字符是这条规路的例外

阅读全文

PHP5.0对象模型探索之抽象方法和抽象类PHP学习网

面向对象程序通过类的分层结构构建起来,在单重继续语言如PHP中,类的继续是树状的. 一个根类有一个或更多的子类,再从每个子类继续出一个或更多下一级子类。当然,可能存在多个根类,用来实现不同的功能。在一个良好设计的体系中,每个根类都应该有一个有用的接口, 可以被应用代码所使用。假如我们的应用代码被设计成与根类一起工作,那么它也可以和任何一个从根类继续出来的子类合作。

  抽象方法是就像子类中一般的方法的占位符(占个地方但不起作用),它与一般方法不同

阅读全文

预定义变量

务器变量:$_SERVER
注: 在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_SERVER_VARS。

$_SERVER 是一个包含诸如头部(headers)、路径(paths)和脚本位置(script locations)的数组。数组的实体由 web 服务器创建。不能保证所有的服务器都能产生所有的信息;服务器可能忽略了一些信息,或者产生了一些未在下面列出的新的信息。这意味着,大量的这些变量在 CGI 1.1 specification 中说明,所以您应该仔细研究它。

这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中您不需要使用 global $_SERVER; 访问它,就如同使用 $HTTP_SERVER_VARS 一样。

$HTTP_SERVER_VARS 包含着同样的信息,但是不是一个自动全局变量。(注重: $HTTP_SERVER_VARS 和 $_SERVER 是不同的变量,PHP 处理它们的方式不同。)

假如设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_SERVER 和 $HTTP_SERVER_VARS 数组。相关信息,请参阅安全的相关章节 使用 Register Globals。这些单独的全局变量不是自动全局变量。

您或许会发现下面列出的某些 $_SERVER 元素并不可用。注重,假如以命令行方式运行 PHP,下面列出的元素几乎没有有效的(或是没有任何实际意义的)。



“PHP_SELF”
当前正在执行脚本的文件名,与 document root相关。举例来说,在URL地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。

假如 PHP 以命令行方式运行,该变量无效。

“argv”
传递给该脚本的参数。当脚本运行在命令行方式时,argv 变量传递给程序 C 语言样式的命令行参数。当调用 GET 方法时,该变量包含请求的数据。

“argc”
包含传递给程序的命令行参数的个数(假如运行在命令行模式)。

“GATEWAY_INTERFACE”
服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。

'SERVER_NAME'
当前运行脚本所在服务器主机的名称。假如该脚本运行在一个虚拟主机上,该名称是由那个虚拟主机所设置的值决定。

'SERVER_SOFTWARE'
服务器标识的字串,在响应请求时的头部中给出。

“SERVER_PROTOCOL”
请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。

“REQUEST_METHOD”
访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。

“QUERY_STRING”
查询(query)的字符串。

“DOCUMENT_ROOT”
当前运行脚本所在的文档根目录。在服务器配置文件中定义。

“HTTP_ACCEPT”
当前请求的 Accept: 头部的内容。

“HTTP_ACCEPT_CHARSET”
当前请求的 Accept-Charset: 头部的内容。例如:“iso-8859-1,*,utf-8”。

“HTTP_ACCEPT_ENCODING”
当前请求的 Accept-Encoding: 头部的内容。例如:“gzip”。

“HTTP_ACCEPT_LANGUAGE”
当前请求的 Accept-Language: 头部的内容。例如:“en”。

“HTTP_CONNECTION”
当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。

“HTTP_HOST”
当前请求的 Host: 头部的内容。

阅读全文

PHP MySQL扎实基本功

一. 10句话

1.不要依赖register_global=ON的环境,从你刚懂得配置php运行环境甚至尚不明白register_global的ON/OFF会对自己有什么影响的那天起,就应该勇敢地把它设为OFF.

阅读全文