PHP基本语法 | ||||||||||||||||
基本的 PHP 语法 PHP 的脚本语以 <?php 语始~以 ?> 语束。可以把 您PHP 的脚本语放置在文中的任何位置。档当写您然~在支持语的服语器上~可以使用 <? 和 ?> 来语始和语束脚本语。不语~语了到最好的兼容性~我语推使用语准形式 达荐您(<?php)~而不是语形式。写<?php ?> PHP 文件通常包含 会HTML 语语~就像一 个HTML 文件~以及一些 PHP 脚本代语。在下面~我语提供了一段语语的 PHP 脚本~可以向语语器语出文本 它"Hello World",<html> <body> <?php echo "Hello World"; ?> </body> </html> PHP 中的每代语行都必语以分语束。分是一语分隔符~用于把指令集分语。个号号区来 有语通语 两PHP 来语出文本的基语指令,echo 和 print。在上面的例子中~我语使用了 echo 语句语出文来 本 "Hello World"。 PHP 中的注语 在 PHP 中~我语使用 // 来写语语语行注语~或者使用 /* 和 */ 来写语语大的注语语。<html> <body> <?php //This is a comment /* This is a comment block */ ?> </body> </html> PHP 中的语量 语量用于存语语~比如字、文本字符串或语。数数 一旦语置了某语量~我语就可以在脚本中重语地使用。个它 PHP 中的所有语量都是以 $ 符语始的。号 在 PHP 中语置语量的正方法是,确 $var_name = value; PHP 的入语者往往忘语在语量的前面的 会$ 符。如果那语做的语~语量是无效的。号将 语我语语着语建一存有字符串的语量~和一存有语的语量,个个数 <?php $txt = "Hello World!"; $number = 16; ?> PHP 是一语松散语型的语言;Loosely Typed Language,在 PHP 中~不需要在语置语量之前明语语量。声 在上面的例子中~看到了~不必向 您PHP 声数明语语量的据语型。根据语量被语置的方式~PHP 会确数自语地把语量语语语正的据语型。在强语型的语程语言中~必语在使用前明语量的语型和名。您声称 在 PHP 中~语量在使用语被自语明。会声 语量的命名语语 •语量名必语以字母或下语 划"_" 语语。 •语量名只能包含字母字字符以及下语。数划 •语量名不能包含空格。如果语量名由多语语语成~那语语语使用下语语行分隔;比如个划 $my_string,~或者以大字母语语;比如 写$myString,。PHP 中的字符串 字符串量用于包含字符串的。 在本教程中,我打算介几个在 PHP 中用于操作字符串的最常用的函数和运算符。 在建字符串之后,我就可以它行操作了。您可以直接在函数中使用字符串,或者把它存在量中。 在下面,PHP 脚本把字符串 "Hello World" 名$txt 的字符串量: <?php $txt="Hello World"; echo $txt; ?> 以上代的出: Hello World 在,我着使用不同的函数和运算符来操作我的字符串。 并运置算符;Concatenation Operator, 在 PHP 中,只有一个字符串运算符。 并置运算符 (.) 用于把两个字符串接起来。 要把两个量接在一起,使用个点运算符 (.) :<?php $txt1="Hello World"; $txt2="1234"; echo $txt1 . " " . $txt2; ?> 以上代的出: Hello World 1234 您可以看到,我在上面的例子中使用了两次并置运算符。是由于我需要插入第三个字符串。 了分隔两个量,我在$txt1 与 $txt2 之插入了一个空格。使用 strlen() 函数 strlen() 函数用于算字符串的度。 我算出字符串"Hello world!" 的度: <?php echo strlen("Hello world!");?> 以上代的出: 12 字符串的度信息常常用在循或其他函数中,因那确定字符串何束是很重要的,例如,在循中,我需要在字符串中的最后一个字符之后束循,。 使用 strpos() 函数 strpos() 函数用于在字符串内索一段字符串或一个字符。如果在字符串中找到匹配,函数会返回第一个匹配的位置。如果未找到匹配,返回 FALSE。 我一下,是不是能在字符串中找到子字符串"world": <?php echo strpos("Hello world!","world");?> 以上代的出是: 6 正如您看到的,在我的字符串中,字符串 "world" 的位置是 6。返回 6 而不是 7,是由于字符串中的首个位置的 0,而不是 1。 运运算符用于语语语行算. PHP 运算符 本部分列出了在 PHP 中使用的各语算符,运 算算符数运 运算符语明例子语果 +Additionx=24 x+2 -Subtractionx=23 5-x *Multiplicationx=420 x*5 /Division15/53 5/22.5%Modulus (division remainder)5%21 10%82 10%20++Incrementx=5x=6 x++ --Decrementx=5x=4 x-- 语语算符运 运算符语明例子 =x=yx=y +=x+=yx=x+y -=x-=yx=x-y *=x*=yx=x*y /=x/=yx=x/y .=x.=yx=x.y %=x%=yx=x%y 比语算符运 运算符语明例子 ==is equal to5==8 returns false!=is not equal5!=8 returns true>is greater than5>8 returns false<is less than5<8 returns true>=is greater than or equal to5>=8 returns false <=is less than or equal to5<=8 returns true 语语算符运 运算符语明例子 &&andx=6 y=3 (x < 10 && y > 1) returns true ||orx=6 y=3 (x==5 || y==5) returns false !notx=6 y=3 !(x==y) returns true if、elseif 以及 else 句用于行基于不同条件的不同作。 条件语句 当您写代,您常常需要不同的判断行不同的作。 您可以在代中使用条件句来完成此任。 if...else 语句 在条件成立行一代,条件不成立行另一代 elseif 语句 与 if...else 配合使用,在若干条件之一成立行一个代 If...Else 语句 如果您希望在某个条件成立行一些代,在条件不成立行另一些代, 使用if....else 句。 语法 if (condition) code to be executed if condition is true; else code to be executed if condition is false; 语例 如果当前日期是周五,下面的代将出 "Have a nice weekend!",否会出 "Have a nice day!": <html> <body> <?php $d=date("D"); if ($d=="Fri") echo "Have a nice weekend!"; else echo "Have a nice day!"; ?> </body> </html> 如果需要在条件成立或不成立行多行代,把些代行包括在花括号中: <html> <body> <?php $d=date("D"); if ($d=="Fri") { echo "Hello!<br />"; echo "Have a nice weekend!"; echo "See you on Monday!"; } ?> </body> </html> ElseIf 语句 如果希望在多个条件之一成立行代,使用 elseif 句: 语法 if (condition) code to be executed if condition is true; elseif (condition) code to be executed if condition is true; else code to be executed if condition is false; 语例 如果当前日期是周五,下面的例子会出 "Have a nice weekend!",如果是周日,出 "Have a nice Sunday!",否出 "Have a nice day!": <html> <body> <?php $d=date("D"); if ($d=="Fri") echo "Have a nice weekend!"; elseif ($d=="Sun") echo "Have a nice Sunday!"; else echo "Have a nice day!"; ?> </body> </html> Switch 语句 如果您希望有地行若干代之一,使用 Switch 句。使用 Switch 句可以避免冗的if..elseif..else 代。 语法 switch (expression) { case label1: code to be executed if expression = label1; break; case label2: code to be executed if expression = label2; break; default: code to be executed if expression is different from both label1 and label2;} 语例 工作原理: 1.表达式,通常是量,行一次算 2.把表达式的与构中 case 的行比3.如果存在匹配,行与 case 的代4.代行后,break 语句阻止代跳入下一个 case 中行 5.如果没有 case 真,使用default 句<?php switch ($x) { case 1: echo "Number 1"; break; case 2: echo "Number 2"; break; case 3: echo "Number 3"; break; default: echo "No number between 1 and 3"; } ?> </body> </html> 什语是语,数 在使用 PHP 行的程中,或早或,您会需要建多相似的量。无需很多相似的量,你可以把数据作元素存在数中。数中的元素都有自己的 ID,因此可以方便地它。 有三数型:语语语语语语 数数语语语 有数字ID 的数 语语语数 数中的 个每ID 一个 多数语语语 包含一个或多个数的数 数数语语语 数数存的 个元素都有一个数字每ID 。可以使用不同的方法来建数数: 例子 1 在个例子中,会自分配 ID :$names = array("Peter","Quagmire","Joe"); 例子 2 在个例子中,我人工分配的 ID :$names[0] = "Peter";$names[1] = "Quagmire";$names[2] = "Joe"; 可以在脚本中使用些 ID : <?php $names[0] = "Peter";$names[1] = "Quagmire";$names[2] = "Joe"; echo $names[1] . " and " . $names[2] . " are ". $names[0] . "'s neighbors"; ?> 以上代的出: Quagmire and Joe are Peter's neighbors 语语语数 数,它的个每ID 都一个。 在存有具体命名的的数据,使用数数不是最好的做法。通数,我可以把作,并向它。 例子 1 在本例中,我使用一个数把年分配不同的人:$ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34); 例子 2 本例与例子 1 相同,不展示了另一建数的方法:$ages['Peter'] = "32";$ages['Quagmire'] = "30";$ages['Joe'] = "34";可以在脚本中使用 ID : <?php $ages['Peter'] = "32";$ages['Quagmire'] = "30";$ages['Joe'] = "34";echo "Peter is " . $ages['Peter'] . " years old."; ?> 以上脚本的出: Peter is 32 years old.多语语数 在多数中,主数中的个元素也是一个数。在子数中的个元素也可以是数,以此推。每每 例子 1 在本例中,我建了一个有自分配的 ID 的多数: $families = array ( "Griffin"=>array ( "Peter", "Lois", "Megan" ), "Quagmire"=>array ( "Glenn" ), "Brown"=>array ( "Cleveland", "Loretta", "Junior" ) ); 如果出个数的,似:Array ( [Griffin] => Array ( [0] => Peter [1] => Lois [2] => Megan ) [Quagmire] => Array ( [0] => Glenn ) [Brown] => Array ( [0] => Cleveland [1] => Loretta [2] => Junior ) ) 例子 2 我着示上面的数中的一个一的:echo "Is " . $families['Griffin'][2] . " a part of the Griffin family?"; 以上代的出: Is Megan a part of the Griffin family? PHP 中的循句用于行相同的代指定的次数。循语 在您写代,您常需要相同的代运行很多次。您可以在代 中使用循句来完成个任。 在 PHP 中,我可以使用下列循句: while 只要指定的条件成立,循行代do...while 首先行一次代,然后在指定的条件成立重个循 for 循行代指定的次数 foreach 根据数中个元素来循代每 while 语句 只要指定的条件成立,while 句将重行代。语法 while (condition) code to be executed;例子 下面的例子示范了一个循,只要量 i 小于或等于 5,代就会一直循行下去。循 每循一次,量就会增 1: <html> <body> <?php $i=1; while($i<=5) { echo "The number is " . $i . "<br />"; $i++; } ?> </body> </html> do...while 语句 do...while 句会至少行一次代语语语语语语 - 然后,只要条件成立,就会重行循。 语法 do { code to be executed;} while (condition); 例子 下面的例子将 i 的行一次累加,然后,只要 i 小于 5 的条件成立,就会累 加下去: <html> <body> <?php $i=0; do { $i++; echo "The number is " . $i . "<br />"; } while ($i<5); ?> </body> </html> for 语句 如果您已确定了代的重行次数,可以使用 for 句。 语法 for (initialization; condition; increment) { code to be executed; } 注:语语for 句有三个参数。第一个参数初始化量,第二个参数保存条件,第三个参数包含行循所需的增量。如果 initialization 或 increment 参数中包括了多个 量,需要用逗号行分隔。而条件必算 true 或者 false。例子 下面的例子会把文本 "Hello World!" 示5 次: <html> <body> <?php for ($i=1; $i<=5; $i++) { echo "Hello World!<br />";} ?> </body> </html> foreach 语句 foreach 句用于循遍数。 每 行一次循,当前数元素的就会被value 量,数指会逐一地 移, - 以此推。 语法 foreach (array as value){ code to be executed; } 例子 下面的例子示范了一个循,个循可以出定数的:<html> <body> <?php $arr=array("one", "two", "three"); foreach ($arr as $value){ echo "Value: " . $value . "<br />"; } ?> </body> </html> PHP 的真正威力源自于它的函数。 在 PHP 中,提供了超 700 个内建的函数。PHP 函数 在本教程中,我将您解如何建自己的函数。如需内建函数的参考和例,我的 PHP 参考手册。语建 PHP 函数 函数是一可以在任何被需要的候行的代。语 建PHP 函数: 1.所有的函数都使用 "function()" 来始 2.命名函数 - 函数的名称提示出它的功能。函数名称以字母或下划。 3.添加 "{" - 口的花括号之后的部分是函数的代。 4.插入函数代 5.添加一个 "}" - 函数通花括号来束。例子 一个的函数,在其被用能出我的名称的:<html> <body> <?php function writeMyName() { echo "David Yang"; } writeMyName(); ?> </body> </html> 使用 PHP 函数 在,我要在PHP 脚本中使用个函数了: <html> <body> <?php function writeMyName() { echo "David Yang"; } echo "Hello world!<br />";echo "My name is "; writeMyName(); echo ".<br />That's right, ";writeMyName(); echo " is my name."; ?> </body> </html> 以上代的出: Hello world! My name is David Yang. That's right, David Yang is my name. PHP 函 数- 添加参数 我的第一个函数是一个非常的函数。它只能出一个静的字符串。通可以添加参数,我向函数添加更多的功能。参数似一个量。您可能注意到了,函数名称后面有一个括号,比如 writeMyName()。参数就是在括号中定的。 例子 1 下面的例子出不同的名字,但姓是相同的: <html> <body> <?php function writeMyName($fname) { echo $fname . " Yang.<br />"; } echo "My name is ";writeMyName("David");echo "My name is ";writeMyName("Mike");echo "My name is ";writeMyName("John");?> </body> </html> 上面的代的出: My name is David Yang.My name is Mike Yang.My name is John Yang.例子 2 下面的函数有两个参数: <html> <body> <?php function writeMyName($fname,$punctuation) { echo $fname . " Yang" . $punctuation . "<br />"; } echo "My name is ";writeMyName("David",".");echo "My name is ";writeMyName("Mike","!"); echo "My name is ";writeMyName("John","...");?> </body> </html> 上面的代的出: My name is David Yang.My name is Mike Yang!My name is John Yang...PHP 函 数- 返回语 函数也能用于返回。 例子 <html> <body> <?php function add($x,$y) { $total = $x + $y; return $total; } echo "1 + 16 = " . add(1,16); ?> </body> </html> 以上代的出: 1 + 16 = 17 PHP 的 $_GET 和 $_POST 用于索表中的,比如用入。 PHP 表语语理 表例:语语语语 <html> <body> <form action="welcome.php" method="post">Name: <input type="text" name="name" />Age: <input type="text" name="age" /><input type="submit" /> </form> </body> </html> 上面的 HTML 面例包含了两个入框和一个提交按。当用填写表并提 交按,表的数据会被送往"welcome.php" 个文件。"welcome.php" 文件似:语语语语语 <html> <body> Welcome <?php echo $_POST["name"]; ?>.<br />You are <?php echo $_POST["age"]; ?> years old.</body> </html> 上面个脚本的出本似: Welcome John. You are 28 years old. 我将在下一 章解PHP $_GET 和 $_POST。 表语语语 在任何可能的候用入行。客端的速度更快,并且可以减服器的。不,任何流量很高以至于不得不担心服器源的站点,也有必要担心站点的安全性。如果表的是数据,就非常有必要采用服器端的。在服器表的一好的方式是,把表它自己,而不是跳到 不同的面。用就可以在同一表面得到信息。用也就更容易了。$_GET 量用于收集来自method="get" 的表中的。 $_GET 语量 $_GET 量是一个数,内容是由HTTP GET 方法送的量名称和。 $_GET 量用于收集来自method="get" 的表中的。 从有GET 方法的表送的信息,任何人都是可的,会示在器的地址,,并且送的信息量也有限制,最多 100 个字符,。 例子 <form action="welcome.php" method="get"> Name: <input type="text" name="name" />Age: <input type="text" name="age" /><input type="submit" /> </form> 当用点提 交按,送的URL 会似: ;age=37 "welcome.php" 文件在可以通 $_GET 量来取表数据了,注意,表域的名称会自成 $_GET 数中的 ID ,: Welcome <?php echo $_GET["name"]; ?>.<br /> You are <?php echo $_GET["age"]; ?> years old! 语什语使用 $_GET, 注:语语在使用 $_GET 量,所有的量名和都会示在URL 中。所以在送密 或其他敏感信息,不使用个方法。不,正因量示在URL 中,因此可以在收藏中收藏面。在某些情况下,是很有用的。 注:语语HTTP GET 方法不适合大型的量 ,是不能超100 个字符的。$_REQUEST 语量 PHP 的 $_REQUEST 量包含了$_GET, $_POST 以及 $_COOKIE 的内容。 PHP 的 $_REQUEST 量可用来取得通GET 和 POST 方法送的表数据的果。 例子 Welcome <?php echo $_REQUEST["name"]; ?>.<br />You are <?php echo $_REQUEST["age"]; ?> years old!$_POST 量用于收集来自method="post" 的表中的。 $_POST 语量 $_POST 量是一个数,内容是由HTTP POST 方法送的量名称和。 $_POST 量用于收集来自method="post" 的表中的。 从有POST 方法的表送的信息,任何人都是不可的,不会示在器的地址,,并且送信息的量也没有限制。例子 <form action="welcome.php" method="post"> Enter your name: <input type="text" name="name" />Enter your age: <input type="text" name="age" /> <input type="submit" /> </form> 当用点提交按,URL 不会含有任何表数据,看上去似:;welcome.php" 文件在可以通 $_POST 量来取表数据了,注意,表 域的名称会自成$_POST 数中的 ID ,: $_POST["name"]; ?>.<br />Welcome <?php echo You are <?php echo $_POST["age"]; ?> years old!语什语使用 $_POST, •通 HTTP POST 送的量不会示在URL 中。 •量没有度限制。 不,由于量不示在 URL 中,所有无法把面加入。$_REQUEST 语量 PHP 的 $_REQUEST 量包含了$_GET, $_POST 以及 $_COOKIE 的内容。PHP 的 $_REQUEST 量可用来取得通GET 和 POST 方法送的表数据的果。例子 Welcome <?php echo $_REQUEST["name"]; ?>.<br /> You are <?php echo $_REQUEST["age"]; ?> years old! PHP 的 date() 函数用于格式化或日期。 PHP Date() 函数 PHP Date() 函数可把戳格式化可性更好的日期和。 语法 date(format,timestamp) 参数描述 format必需。定戳的格式。 timestamp可。定戳。默是当前的日期和。PHP 日期 - 什语是语语;戳Timestamp,, 戳是自1970 年 1 月 1 日,00:00:00 GMT,以来的秒数。它也被称 Unix 戳,Unix Timestamp,。 PHP 日期 - 格式化日期 date() 函数的第一个参数定了如何格式化日期/。它使用字母来表示日期和的格式。里列出了一些可用的字母: •d - 月中的天 (01-31) •m - 当前月,以数字 (01-12) •Y - 当前的年,四位数, 您可以在我的 PHP Date 参考手册中,找到格式参数中可以使用的所有字母。 可以在字母之插入其他字符,比如 "/"、"." 或者 "-",就可以增加附加格式了:<?php echo date("Y/m/d"); echo "<br />"; echo date("Y.m.d"); echo "<br />"; echo date("Y-m-d"); ?> 以上代的出似: 2006/07/11 2006.07.11 2006-07-11 PHP 日期 - 添加语语戳 date() 函数的第二个参数定了一个戳。此参数是可的。如果您没有提供戳,当前的将被使用。 在我的例子中,我将使用 mktime() 函数明天建一个戳。mktime() 函数可指定的日期返回 Unix 戳。 语法 mktime(hour,minute,second,month,day,year,is_dst)如需 得某一天的戳,我只要置mktime() 函数的 day 参数就可以了:<?php $tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y")); echo "Tomorrow is ".date("Y/m/d", $tomorrow);?> 以上代的出似: 明天是 2006/07/12 服器端引 用(SSI) 用于建可在多个面重使用的函数、眉、脚或元素。服语器端引用;Server Side Includes, 通 include() 或 require() 函数,您可以在服器 行PHP 文件之前在文件中插入一个文件的内容。除了它理的方式不同之外,两个函数在其他方面都是相同的。include() 函数会生成一个警告,但是脚本会行,,而 require() 函数会生成一个致命,fatal error,,在生后脚本会停止行,。 两个函数用于建可在多个面重使用的函数、眉、脚或元素。 会者省大量的。意味着您可以建供所有网引用的准眉或菜文件。当眉需要更新,您只更新一个包含文件就可以了,或者当您向网站添加一新面,需要修改一下菜文件,而不是更新所有网中的接,。 include() 函数 include() 函数可得指定文件中的所有文本,并把文本拷到使用 include 函数的文件中。 例子 1 假 您有一个准的眉文件,名"header.php"。如需在面中引用个眉文件,使用 include() 函数,就像: <html> <body> <?php include("header.php"); ?> <h1>Welcome to my home page</h1> <p>Some text</p> </body> </html> 例子 2 在,假我有一个在所有面上使用的准菜文件。看下面个 "menu.php": <html> <body> <a href=";>Home</a> | <a href=";>About Us</a> | <a href=";>Contact Us</a> 三个文件,"default.php"、"about.php" 以及 "contact.php" 都引用了 "menu.php" 文件。是 "default.php" 中的代: <?php include("menu.php"); ?> <h1>Welcome to my home page</h1> <p>Some text</p> </body> </html> 如果您在 器中看"default.php" 的源代,似: <html> <body> <a href="default.php">Home</a> | <a href="about.php">About Us</a> | <a href="contact.php">Contact Us</a><h1>Welcome to my home page</h1> <p>Some text</p> </body> </html> 同,当然,我也将用相同的方法理 "about.php" 和 "contact.php"。通使用引用文件,在您需要重命名接、更改接序或向站点添加另一网,只要地更 新"menu.php" 文件中的文本即可。 require() 函数 require() 函数与 include() 相同,不同的是它的理方式。 include() 函数会生成一个警告,但是脚本会行,,而 require() 函数会生成一个致命,fatal error,,在生后脚本会停止行,。 如果在您通 include() 引用文件生了,会得到似下面的消息:PHP 代:语语 <html> <body> <?php include("wrongFile.php"); echo "Hello World!"; ?> </body> </html> 语语消息: Warning: include(wrongFile.php) [function.include]: failed to open stream: No such file or directory in C:homewebsite est.php on line 5 Warning: include() [function.include]:Failed opening 'wrongFile.php' for inclusion(include_path='.;C:php5pear')in C:homewebsite est.php on line 5Hello World! 注意,echo 句依然被行了:是因警告不会中止脚本的行。 在,我使用require() 函数运行相同的例子。 PHP 代:语语 <html> <body> <?php require("wrongFile.php"); echo "Hello World!"; ?> </body> </html> 语语消息: Warning: require(wrongFile.php) [function.require]: failed to open stream: No such file or directory in C:homewebsite est.php on line 5 Fatal error: require() [function.require]:Failed opening required 'wrongFile.php'(include_path='.;C:php5pear')in C:homewebsite est.php on line 5由于在致命 生后止了脚本的行,因此echo 句不会行。正因在文件不存在或被重命名后脚本不会行,因此我推荐 使用 require() 而不是 include()。 fopen() 函数用于在 PHP 中打文件。 打语文件 fopen() 函数用于在 PHP 中打文件。 此函数的第一个参数含有要打的文件的名称,第二个参数定了使用哪模式来打文件: <html> <body> <?php $file=fopen("welcome.txt","r");?> </body> </html> 文件可能通下列模式来打: 模式描述 r只。在文件的始。 r+/写。在文件的始。 w只写。打并清空文件的内容,如果文件不存在,建新文件。w+/写。打并清空文件的内容,如果文件不存在,建新文件。a追加。打并向文件文件的末端行写操作,如果文件不存在,建新文件。a+/追加。通向文件末端写内容,来保持文件内容。x 只写。建新文件。如果文件已存在,返回FALSE。 / 写。建新文件。如果文件已存在,返回FALSE 和一个。x+ 注:如果 fopen() 无法打指定文件,返回0 (false)。例子 如果 fopen() 不能打指定的文件,下面的例子会生成一段消息: <html> <body> <?php $file=fopen("welcome.txt","r") or exit("Unable to open file!"); ?> </body> </html> 语语文件 fclose() 函数用于打的文件。 <?php $file = fopen("test.txt","r");//some code to be executedfclose($file); ?> 语语 End-of-file feof() 函数是否已达到文件的 末端(EOF)。在循遍未知度的数据,feof() 函数很有用。 注:语语在 w 、a 以及 x 模式,您无法取打的文件:if (feof($file)) echo "End of file"; 逐行语取文件 fgets() 函数用于从文件中逐行取文件。 注:语语在用函数之后,文件指会移到下一行。例子 下面的例子逐行取文件,直到文件末端止: <?php $file = fopen("welcome.txt", "r") or exit("Unable to open file!"); //Output a line of the file until the end is reached while(!feof($file)) { echo fgets($file). "<br />"; } fclose($file); ?> 逐字符语取文件 fgetc() 函数用于从文件逐字符地取文件。 注:语语在用函数之后,文件指会移到下一个字符。例子 下面的例子逐字符地取文件,直到文件末端止: <?php $file=fopen("welcome.txt","r") or exit("Unable to open file!"); while (!feof($file)) { echo fgetc($file); } fclose($file); ?> 通语 PHP~可以把文件上语到服语器。 语建一文件上语表语个 允语用语表语上语文件是非常有用的。从 语看下面语供上语文件的 个HTML 表语, <html> <body> <form action="upload_file.php" method="post" enctype="multipart/form-data"><label for="file">Filename:</label><input type="file" name="file" id="file" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html> 语留意如下有语此表语的信息, <form> 语语的 enctype 属哪性语定了在提交表语语要使用语容语型。在表语需要二语制据语~比如文件语内数内 容~语使用 "multipart/form-data"。 <input> 语语的 type="file" 属性语定了语语把语入作语文件语理。语例语~在语语器中语语语~看到语入旁语来来当会框 有一语语按语。个 注语,允语用语上语文件是一巨大的安全语语。语语语允语可信的用语语行文件上语操作。个 语建上语脚本 "upload_file.php" 文件含有供上语文件的代语, <?php if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } ?> 通语使用 PHP 的全局语 数$_FILES~可以客语语算机向语程服语器上语文件。你从 第一是表语的 个参数input name~第二下语可以是 个"name", "type", "size", "tmp_name" 或 "error"。就像语语, •$_FILES["file"]["name"] - 被上语文件的名称 •$_FILES["file"]["type"] - 被上语文件的语型 •$_FILES["file"]["size"] - 被上语文件的大小~以字语语 •$_FILES["file"]["tmp_name"] - 存语在服语器的文件的语语副本的名称 •$_FILES["file"]["error"] - 由文件上语语致的语语代语 语是一语非常语语文件上语方式。基于安全方面的考语~语语增加有语什语用语有语上语文件的限制。您当 上语限制 在语脚本中~我语增加了语文件上语的限制。用语只能上语 个.gif 或 .jpeg 文件~文件大小必语小于 20 kb,<?php if ((($_FILES["file"]["type"] == "image/gif")|| ($_FILES["file"]["type"] == "image/jpeg")|| ($_FILES["file"]["type"] == "image/pjpeg"))&& ($_FILES["file"]["size"] < 20000)) { if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } } else { echo "Invalid file"; } ?> 注语,语于 IE~语语 jpg 文件的语型必语是 pjpeg~语于 FireFox~必语是 jpeg。 保存被上语的文件 上面的例子在服语器的 PHP 语语文件语语建了一被上语文件的语语副本。个 语语语的语制文件在脚本语束语消失。要保存被上语的文件~我语需要把拷语到外的位置,个会它另 <?php if ((($_FILES["file"]["type"] == "image/gif")|| ($_FILES["file"]["type"] == "image/jpeg")|| ($_FILES["file"]["type"] == "image/pjpeg"))&& ($_FILES["file"]["size"] < 20000)) { if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; } } } else { echo "Invalid file"; } ?> 上面的脚本语语了是否已存在此文件~如果不存在~语把文件拷语到指定的文件语。注语,语例子把文件保存到了名语 个"upload" 的新文件语。 cookie 常用于用。 什语是 Cookie, cookie 常用于用。cookie 是服器留当相同的在用算每机中的小文件。 算机通器求面,它同会送cookie。通 PHP,您能建并取回 cookie 的。 如何语建 cookie, setcookie() 函数用于置 cookie。 注:语语setcookie() 函数必位于 <html> 之前。 语法 setcookie(name, value, expire, path, domain);例子 在下面的例子中,我将建名 "user" 的 cookie,把它 "Alex Porter"。我也定了此 cookie 在一小后期: <?php setcookie("user", "Alex Porter", time()+3600);?> <html> <body> </body> </html> 注:语语在 送cookie ,cookie 的会自行 URL ,在取回行自解,防止 URL ,使用setrawcookie() 取而代之,。 如何取回 Cookie 的语, PHP 的 $_COOKIE 量用于取回cookie 的。 在下面的例子中,我 取回了名"user" 的 cookie 的,并把它示在了面上:<?php // Print a cookie echo $_COOKIE["user"]; // A way to view all cookies print_r($_COOKIE); ?> 在下面的例子中,我使用 isset() 函数来确是否已置了 cookie:<html> <body> <?php if (isset($_COOKIE["user"])) echo "Welcome " . $_COOKIE["user"] . "!<br />"; else echo "Welcome guest!<br />"; ?> </body> </html> 如何语除 cookie, 当 除cookie ,您当使期日期更去的点。 除的例子: <?php // set the expiration date to one hour agosetcookie("user", "", time()-3600);?> 如果语语器不支持 cookie 语语语,怎 如果您的用程 及不支持序涉cookie 的器,您就不得不采取其他方法在用程序中从一面向另一面信息。一方式是从表数据,有表和用入的内容,稍早前我已在本教程中介了,。 下面的表在用提 交按向"welcome.php" 提交了用入:<html> <body> <form action="welcome.php" method="post">Name: <input type="text" name="name" />Age: <input type="text" name="age" /><input type="submit" /> </form> </body> </html> 取回 "welcome.php" 中的,就像: <html> <body> Welcome <?php echo $_POST["name"]; ?>.<br />You are <?php echo $_POST["age"]; ?> years old.</body> </html> PHP session 量用于存有用会的信息,或更改用会的置。Session 量保存的信息是一用的,并且可供用程序中的所有面使用。 PHP Session 语量 当您运行一个用程序,您会打它,做些更改,然后它。很像一次会。算机清楚你是。它知道你何启用程序,并在何止。但是在因特网上,存在一个:服器不知道你是以及你做什,是由于 HTTP 地址不能持状。 通在服器上存用信息以便随后使用,PHP session 解决了个,比如用名称、商品等,。不,会信息是的,在用离网站后将被除。如果您需要永久存信息,可以把数据存在数据中。 Session 的工作机制是:个者建一个 每唯一的id (UID),并基于个 UID 来存量。UID 存在 cookie 中,亦或通 URL 行。 语始 PHP Session 在您把用信息存到 PHP session 中之前,首先必启会。 注:语语session_start() 函数必位于 <html> 之前: <?php session_start(); ?> <html> <body> </body> </html> 上面的代会向服器注册用的会,以便您可以始保存用信息,同会用会分配一个 UID。 存语 Session 语量 存和 取回session 量的正确方法是使用PHP $_SESSION 量:<?php session_start(); // store session data $_SESSION['views']=1; ?> <html> <body> <?php //retrieve session data echo "Pageviews=". $_SESSION['views'];?> </body> </html> 出: Pageviews=1 在下面的例子中,我建了一个的 page-view 数器。isset() 函数是否已置 "views" 量。如果已置"views" 量,我累加数器。如果"views" 不存在,我 建"views" 量,并把它置1: <?php session_start(); if(isset($_SESSION['views'])) $_SESSION['views']=$_SESSION['views']+1; else $_SESSION['views']=1; echo "Views=". $_SESSION['views'];?> 语语 Session 如果您希望 除某些session 数据,可以使用 unset() 或 session_destroy() 函数。unset() 函数用于 放指定的session 量: <?php unset($_SESSION['views']); ?> 您也可以通 session_destroy() 函数 底session: <?php session_destroy(); ?> 注:语语session_destroy() 将重置 session,您将失去所有已存的 session 数据。PHP 允您从脚本直接送子件。 PHP mail() 函数 PHP mail() 函数用于从脚本中送子件。 语法 mail(to,subject,message,headers,parameters)参数描述 to 必需。定email 接收者。 subject 必需。定email 的主。注:参数不能包含任何新行字符。message 必需。定要送的消息。使用LF ( ) 来分隔各行。 可。定 附加的,比如From、Cc 以及Bcc。headers 当使用CRLF ( ) 分隔附加的。 parameters可。件送程序定外的参数。 注:语语PHP 需要一个已安装且正在运行的件系,以便使件函数可用。所用的程序通在 php.ini 文件中的配置置行定。在我的 PHP Mail 参考手册更多内容。PHP 语易 E-Mail 通 PHP 送子件的最的方式是送一封文本email。在下面的例子中,我首先声明量($to, $subject, $message, $from, $headers),然后我在 mail() 函数中使用些量来 送了一封e-mail: <?php $to = "someone@example.com"; $subject = "Test mail"; $message = "Hello! This is a simple email message."; $from = "someonelse@example.com";$headers = "From: $from"; mail($to,$subject,$message,$headers); echo "Mail Sent."; ?> PHP Mail Form 通 PHP,您能在自己的站点制作一个反表。下面的例子向指定的 e-mail 地址送了一条文本消息: <html> <body> <?php if (isset($_REQUEST['email'])) //if "email" is filled out, send email { //send email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail( "someone@example.com", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } else //if "email" is not filled out, display the form { echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html> 例子解:语语 1.首先,是否填写了件入框 2.如果未填写,比如在面被首次,,出 HTML 表 3.如果已填写,在表被填写后,,从表送件 4.当点提交按后,重新入面,示件送成功的消息 在上一语中的 PHP e-mail 脚本中~存在着一漏洞。个 PHP E-mail 注入 首先~语看上一语中的 PHP 代语, <html> <body> <?php if (isset($_REQUEST['email'])) //if "email" is filled out, send email { //send email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } else //if "email" is not filled out, display the form { echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html> 以上代语存在的语语是~未语授语的用语可通语语入表语在语件语部入据。插数 假如用语在表语中的语入加入语些文本~出语什语情,框内会况呢 someone@example.com%0ACc:person2@example.com%0ABcc:person3@example.com,person3@example.com, anotherperson4@example.com,person5@example.com %0ABTo:person6@example.com 与往常一语~mail() 函把上面的文本放入语件语部~那语语在语部有了语外的 数Cc:, Bcc: 以及 To: 字段。当用语点语提交按语语~语封 e-mail 会被语送到上面所有的地址, PHP 防止 E-mail 注入 防止 e-mail 注入的最好方法是语语入语行语语。 下面的代语上一语语似~不语我语已语增加了语语表语中 与email 字段的语入语语程序,<html> <body> <?php function spamcheck($field) { //filter_var() sanitizes the e-mail //address using FILTER_SANITIZE_EMAIL $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() validates the e-mail //address using FILTER_VALIDATE_EMAIL if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; } } if (isset($_REQUEST['email'])) {//if "email" is filled out, proceed //check if the email address is invalid $mailcheck = spamcheck($_REQUEST['email']); if ($mailcheck==FALSE) { echo "Invalid input"; } else {//send email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } } else {//if "email" is not filled out, display the form echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html> 在上面的代语中~我语使用了 PHP 语语器语语入语行语语,来 •FILTER_SANITIZE_EMAIL 从字符串中语除语子语件的非法字符 •FILTER_VALIDATE_EMAIL 语语语子语件地址您可以在我语的 PHP 语语器语一语中语语更多有语语语器的容。内 在 PHP 中,默的理很。一条消息会被送到器,条消息 有文件名、行号以及一条描述的消息。 PHP 语语语理 在建脚本和 web 用程序,理是一个重要的部分。如果您的代缺少,那程序看上去很不,也安全敞了大。本教程介了 PHP 中一些最重要的方法。 我将您解不同的理方法: • 的"die()" 句 •自定和触器 •告 基本的语语语理,使用 die() 函数 第一个例子展示了一个打文本文件的脚本: <?php $file=fopen("welcome.txt","r");?> 如果文件不存在,您会得似的: Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:webfolder est.php on line 2了避免用得似上面的消息,我在文件之前文件是否存在:<?php if(!file_exists("welcome.txt")) { die("File not found"); } else { $file=fopen("welcome.txt","r"); } ?> 在,假如文件不存在,您会得到似的消息: File not found 比起之前的代,上面的代更有效,是由于它采用了一个的理机制在之后止了脚本。 不,地止脚本并不是恰当的方式。我研究一下用于理 的的PHP 函数。 语建自定语语语语理器 建一个自定的理器非常。我很地建了一个用函数,可 以在 PHP 中生用函数。 函数必有能力理至少两个参数(error level 和 error message),但是可以接受最多五个参数,可的:file, line-number 以及 error context,: 语法 error_function(error_level,error_message,error_file,error_line,error_context) 参数描述 必需。用定的定告。必是一个数。error_level 参下面的表格:告。 error_message必需。用定的定消息。 error_file可。定在其中生的文件名。 error_line可。定生的行号。 error_context可。定一个数,包含了当个量以及它的。每生在用的 语语语语语告 些告是理程序旨在理的的不同的型: 语常量描述 2E_WARNING 非致命的run-time 。不停脚本行。 Run-time 通知。8E_NOTICE 脚本可能有生,但也可能在脚 本正常运行生。 256E_USER_ERROR致命的用生成的。似于程序使 用 PHP 函数trigger_error() 置的E_ERROR。512E_USER_WARNING非致命的用生成的警告。似于程序 使用PHP 函数trigger_error() 置的E_WARNING。1024E_USER_NOTICE用生成的通知。似于程序使用 PHP 函数trigger_error() 置的E_NOTICE。4096E_RECOVERABLE_ERROR 可捕的致命。似E_ERROR,但可被用 定的理程序捕。( 参set_error_handler()) 8191E_ALL所有和 警告,除E_STRICT 以外。 ,在 PHP 6.0,E_STRICT 是E_ALL 的一部分,在,我建一个理的函数: function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Ending Script"; die(); } 上面的代是一个的理函数。当它被触,它会取得和消息。然后它会出和消息,并止脚本。 在,我已建了一个理函数,我需要确定在何触函数。Set Error Handler PHP 的默理程序是内建的理程序。我打算把上面的函数改造脚本运行期的默理程序。 可以修改理程序,使其用到某些,脚本就可以不同的方 式来理不同的。不,在本例中,我打算所有来使用我的自定理程序:set_error_handler("customError");由于我希望我的自定函数来理所有,set_error_handler() 需要一个参数,可以添加第二个参数来定。 语例 通出不存在的量,来个理程序: <?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } //set error handler set_error_handler("customError");//trigger error echo($test); ?> 以上代的出似: Error: [8] Undefined variable: test触语语语 在脚本中用入数据的位置,当用的入无效触的很有用的。在 PHP 中,个任由 trigger_error() 完成。 例子 在本例中,如果 "test" 量大于"1",就会生: <?php $test=2; if ($test>1) { trigger_error("Value must be 1 or below");} ?> 以上代的出似: Notice: Value must be 1 or below in C:webfolder est.php on line 6您可以在脚本中任何位置触,通添加的第二个参数,您能定所触的。可能的型:语语语语语 •E_USER_ERROR - 致命的用 生成的run-time 。无法恢。脚本行被中断。 •E_USER_WARNING - 非致命的用 生成的run-time 警告。脚本行不被中断。 •E_USER_NOTICE - 默 。用生成的run-time 通知。脚本了可能的, 也有可能在脚本运行正常生。 例子 在本例中,如果 "test" 量大于"1", 生E_USER_WARNING 。如果生了 E_USER_WARNING,我将使用我的自定理程序并束脚本: <?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Ending Script"; die(); } //set error handler set_error_handler("customError",E_USER_WARNING);//trigger error $test=2; if ($test>1) { trigger_error("Value must be 1 or below",E_USER_WARNING); } ?> 以上代的出似: Error: [512] Value must be 1 or belowEnding Script 在,我已学了如何建自己的error,以及如何它,在我研究一下。 语语语语 默 地,根据在php.ini 中的 error_log 配置,PHP 向服器的系或文件送 。通使用error_log() 函数,您可以向指定的文件或程目的地送。通子件向您自己送消息,是一得指定的通知的好法。 通语 E-Mail 语语语语语送消息 在下面的例子中,如果特定的生,我将送有消息的子件,并束脚本:<?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Webmaster has been notified"; error_log("Error: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com"); } //set error handler set_error_handler("customError",E_USER_WARNING);//trigger error $test=2; if ($test>1) { trigger_error("Value must be 1 or below",E_USER_WARNING); } ?> 以上代的出似: Error: [512] Value must be 1 or belowWebmaster has been notified 接收自以上代的件似: Error: [512] Value must be 1 or below 个方法不适合所有的。常当通使用默的PHP 系在服器上行。异常,Exception,用于在指定的生改脚本的正常流程。 什语是常,异 PHP 5 提供了一新的面向象的理方法。 异常理用于在指定的,异常,情况生改脚本的正常流程。情况称异常。当异常被触,通常会生: •当前代状被保存 •代行被切到定的异常理器函数 •根据情况,理器也会从保存的代状重新始行代,止 脚本行,或从代中另外的位置行脚本 我将展示不同的理方法: •异常的基本使用 •建自定的异常理器 •多个异常 •重新抛出异常 •置异常理器 异常的基本使用 当异常被抛出,其后的代不会行,PHP 会找匹配的 "catch" 代。如果异常没有被捕 ,而且又没用使用set_exception_handler() 作相的理的,那将 生一个重的,致命,,并且出"Uncaught Exception" ,未捕异常,的消息。 我抛出一个异常,同不去捕它: <?php //create function with an exceptionfunction checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //trigger exception checkNum(2); ?> 上面的代会得似的一个: Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in C:webfolder est.php:6 Stack trace: #0 C:webfolder est.php(12): checkNum(28) #1 {main} thrown in C:webfolder est.php on line 6 Try, throw 和 catch 要避免上面例子出的,我需要建适当的代来理异常。 理理程序当包括: 1.Try - 使用异常的函数位于 "try" 代内。如果没有触异常,代 将照常行。但是如果异常被触,会抛出一个异常。 2.Throw - 里一个定如何触异每常。"throw" 必至少一个 "catch"3.Catch - "catch" 代会捕异常,并建一个包含异常信息的象 我触一个异常: <?php //建可抛出一个异常的函数 function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //在 "try" 代中触异常 try { checkNum(2); //If the exception is thrown, this text will not be shown echo 'If you see this, the number is 1 or below'; } //捕异常 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?> 上面代将得似一个: Message: Value must be 1 or below 例子解:语语 上面的代抛出了一个异常,并捕了它: 1. 建checkNum() 函数。它数字是否 大于1。如果是,抛出一个异常。 2.在 "try" 代中用 checkNum() 函数。 3.checkNum() 函数中的异常被抛出 4."catch" 代接收到异常,并建一个包含异常信息的象 ($e)。 5.通 从个exception 象用$e->getMessage(),出来自异常的消息不,了“ 个每遵循throw 必一个 catch”的原,可以置一个的异常理器来理漏掉的。 语建一自定语的 个Exception 语 建自定的异常理程序非常。我地建了一个的,当PHP 中 生异常,可用其函数。必是exception 的一个展。 个自定的exception 承了PHP 的 exception 的所有属性,您可向其添加自定的函数。我始建 exception : <?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } } $email = "someone@example...com"; try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?> 个新的是旧的exception 的副本,外加errorMessage() 函数。正因它是旧的副本,因此它从旧承 了属性和方法,我可以使用exception 的方法,比如 getLine() 、 getFile() 以及 getMessage()。 例子解:语语 上面的代 抛出了一个异常,并通一个自定的exception 来捕它: 1.customException() 是作旧的exception 的一个展来建的。它就 承了旧的所有属性和方法。 2. 建errorMessage() 函数。如果 e-mail 地址不合法,函数返回一条消息 3.把 $email 量置不合法的e-mail 地址字符串 4. 行"try" 代,由于 e-mail 地址不合法,因此抛出一个异常 5."catch" 代捕异常,并示消息 多常个异 可以一段脚本使用多个异常,来多情况。 可以使用多个 if..else 代,或一个 switch 代,或者嵌套多个异常。些异常能使用不同的 exception ,并返回不同的消息: <?php class customException extends Exception{ public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } } $email = "someone@example.com"; try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid throw new customException($email); } //check for "example" in mail address if(strpos($email, "example") !== FALSE) { throw new Exception("$email is an example e-mail"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?> 例子解:语语 上面的代了两条件,如何任何条件不成立,抛出一个异常: 1.customException() 是作旧的exception 的一个展来建的。它就 承了旧的所有属性和方法。 2. 建errorMessage() 函数。如果 e-mail 地址不合法,函数返回一个消息。 3. 行"try" 代,在第一个条件下,不会抛出异常。 4.由于 e-mail 含有字符串 "example",第二个条件会触异常。 5."catch" 代会捕异常,并示恰当的消息 如果没有捕 customException, 捕了base exception,在那里理异常。重新抛出常异 有,当异常被抛出,您也希望以不同于准的方式它行理。可以在一个 "catch" 代中再次抛出异常。 脚本用藏系。程序来,系也很重要,但是用它并不感趣。了用更容易使用,您可以再次抛出有用比友好的消息的异常:<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = $this->getMessage().' is not a valid E-Mail address.'; return $errorMsg; } } $email = "someone@example.com";try { try { //check for "example" in mail address if(strpos($email, "example") !== FALSE) { //throw exception if email is not valid throw new Exception($email); } } catch(Exception $e) { //re-throw exception throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?> 例子解:语语 上面的代在件地 址中是否含有字符串"example"。如果有,再次抛出异常: 1.customException() 是作旧的exception 的一个展来建的。它就 承了旧的所有属性和方法。 2. 建errorMessage() 函数。如果 e-mail 地址不合法,函数返回一个消息。 3.把 $email 量置一个有效的件地址,但含有字符串 "example"。 4."try" 代包含另一个 "try" 代,就可以再次抛出异常。 5.由于 e-mail 包含字符串 "example",因此触异常。 6."catch" 捕 到异常,并重新抛出"customException"。 7.捕 到"customException",并示一条消息。 如果在其目前的 "try" 代中 异常没有被捕,它将在更高上找catch 代。 语置语语常语理器 ;异Top Level Exception Handler, set_exception_handler() 函数可置理所有未捕异常的用定函数。 <?php function myException($exception){ echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException');throw new Exception('Uncaught Exception occurred'); ?> 以上代的出似: Exception: Uncaught Exception occurred在上面的代中,不存在 "catch" 代,而是触的异常理程序。使用此函数来捕所有未被捕的异常。 异常的语语 •需要行 异常理的代放入try 代内,以便捕潜在的异常。 •每个 try 或 throw 代必至少有一个的 catch 代。 •使用多个 catch 代可以捕不同的异常。 •可以在 try 代内的 catch 代中再次抛出,re-thrown,异常。而言之:如果抛出了异常,就必捕它。 PHP 器用于和来自非安全来源的数据,比如用的入。 什语是 PHP 语语器, PHP 器用于和来自非安全来源的数据。 和用入或自定数据是任何Web 用程序的重要成部分。 PHP 的器展的目的是使数据更松快捷。 语什语使用语语器, 几乎所有 web 用程序都依外部的入。些数据通常来自用或其他用程序,比如 web 服,。通使用器,您能确保有程序得正确的入型。您始外部数据行: 入是最重要的用程序安全之一。 什语语语语语语语是外部数据, •来自表的入数据 •Cookies •服器量 •数据果 函和语语器数 如需量,使用下面的器函数之一: •filter_var() - 通一个指定的器来一的量 •filter_var_array() - 通相同的或不同的器来多个量 •filter_input - 取一个入量,并它行 •filter_input_array - 取多个入量,并通相同的或不同的器它行在下面的例子中,我用 filter_var() 函数了一个整数:<?php $int = 123; if(!filter_var($int, FILTER_VALIDATE_INT)) { echo("Integer is not valid"); } else { echo("Integer is valid"); } ?> 上面的代使用了 "FILTER_VALIDATE_INT" 器来量。由于个整数是合 法的,因此代的出是:"Integer is valid"。 假如我使用一个非整数的量,出是:"Integer is not valid"。如需完整的函数和器列表,我的 PHP Filter 参考手册。Validating 和 Sanitizing 有两器: Validating 语语器: •用于用入 • 格的格式,比如URL 或 E-Mail , •返回若成功期的型,否返回 FALSE Sanitizing 语语器: •用于允或禁止字符串中指定的字符 •无数据格式 •始返回字符串 语语和语志 和志用于向指定的器添加外的。 不同的器有不同的和志。 在下面的例子中,我用 filter_var() 和 "min_range" 以及 "max_range" 了一个整数: <?php $var=300; $int_options = array( "options"=>array ( "min_range"=>0, "max_range"=>256 ) ); if(!filter_var($var, FILTER_VALIDATE_INT, $int_options)) { echo("Integer is not valid"); } else { echo("Integer is valid"); } ?> 就像上面的代一,必 放入一个名"options" 的相数中。如果使用 志,不需在数内。 由于整数是 "300",它不在指定的氛 内,以上代的出将是"Integer is not valid"。 如需完整的函数及 器列表,W3School 提供的 PHP Filter 参考手册。您可以看到个每 器的可用和志。 语语语入 我着来自表的入。 我需要作的第一件事情是确是否存在我正在找的入数据。然后我用 filter_input() 函数入的数据。 在下面的例子中,入量 "email" 被到 PHP 面:<?php if(!filter_has_var(INPUT_GET, "email")) { echo("Input type does not exist"); } else { if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) { echo "E-Mail is not valid"; } else { echo "E-Mail is valid"; } } ?> 例子解:语语 上面的例子有一个通 "GET" 方法 送的入量(email): 1. 是否存在"GET" 型的"email" 入量 2.如果存在入量,它是否是有效的件地址 语化语入 我着清理一下从表来的URL。 首先,我要确是否存在我正在找的入数据。 然后,我用 filter_input() 函数来化入数据。 在下面的例子中,入量 "url" 被到 PHP 面: <?php if(!filter_has_var(INPUT_POST, "url")) { echo("Input type does not exist"); } else { $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL); } ?> 例子解:语语 上面的例子有一个通 "POST" 方法 送的入量(url): 1. 是否存在"POST" 型的"url" 入量 2.如果存在此入量,其行化,除非法字符,,并将其存 在 $url 量中 假如入量似:"#$%S^%$#ool.com.cn/",化后的 $url 量 是的: 语语多语入个 表通常由多个入字段成。了避免 filter_var 或 filter_input 重用, 我可以使用 filter_var_array 或 the filter_input_array 函数。在本例中,我使用 filter_input_array() 函数来三个 GET 量。接收到的GET 量是一个 名称、一个年以及一个件地址: <?php $filters = array ( "name" => array ( "filter"=>FILTER_SANITIZE_STRING ), "age" => array ( "filter"=>FILTER_VALIDATE_INT, "options"=>array ( "min_range"=>1, "max_range"=>120 ) ), "email"=> FILTER_VALIDATE_EMAIL, ); $result = filter_input_array(INPUT_GET, $filters); if (!$result["age"]) { echo("Age must be a number between 1 and 120.<br />"); } elseif(!$result["email"]) { echo("E-Mail is not valid.<br />"); } else { echo("User input is valid"); } ?> 例子解:语语 上面的例子有三个通 "GET" 方法 送的入量(name, age and email) 1.置一个数,其中包含了入量的名称,以及用于指定的入量的器 2. 用filter_input_array 函数,参数包括 GET 入量及才置的数 3. $result 量中的"age" 和 "email" 量是否有非法的入。,如果存在非法入,,filter_input_array() 函数的第二个参数可以是数或一 器的ID。如果参数是一 器的ID,那个指定的器会入数中所有的。如果参数是一个数,那此数必遵循下面的: •必是一个数,其中包含的入量是数的,比如 "age" 入量, •此数的必是 器的ID ,或者是定了器、志以及的数使用 Filter Callback 通使用 FILTER_CALLBACK 器,可以用自定的函数,把它作一个器来使用。,我就有了数据的完全控制。 您可以建自己的自定函数,也可以使用已有的 PHP 函数。定您准用到器的函数,与定的方法相同。 在下面的例子中,我使用了一个自定的函数把所有 "_" 空格:<?php function convertSpace($string) { return str_replace("_", " ", $string);} $string = "Peter_is_a_great_guy!";echo filter_var($string, FILTER_CALLBACK,array("options"=>"convertSpace"));?> 以上代的果是的: Peter is a great guy! 例子解:语语 上面的例子把所有 "_" 成空格: 1. 建一个把"_" 替空格的函数 2. 用filter_var() 函数,它的参数是 FILTER_CALLBACK 器以及包含我的函数的数ODBC 指的是,Application Programming Interface,API,,使我有能力接到某个数据源,比如一个 MS Access 数据,。 语建 ODBC 语接 通一个 ODBC 接,您可以接到您的网中的任何算机上的任何数据,只要 ODBC 接是可用的。 是建到达MS Access 数据的 ODBC 接的方法: 1.在控制面板中打管理工具 2.双其中的数据源 (ODBC) 3.系 DSN 语语卡 4.点 系DSN “卡中的添加”按 5. Microsoft Access Driver。点完成。 6.在下一个界面,点“语语”来定位数据。 7.个数据取一个数据源名 (DSN)。 8.点确定。 注意,必在您的网站所在的算机上完成个配置。如果您的算机上正在运行 Internet 信息服器 (IIS),上面的指令会生效,但是假如您的网站位于程服器,您必有服器的物理限,或者您的主机提供商您建立 DSN。 语接到 ODBC odbc_connect() 函数用于接到 ODBC 数据源。函数有四个参数:数据源名、用名、密以及可的指型参数。 odbc_exec() 函数用于行 SQL 句。 例子 下面的例子建了到达名 northwind 的 DSN 的接, 没有用名和 密。然后建并行一条SQL 句: $conn=odbc_connect('northwind','','');$sql="SELECT * FROM customers"; $rs=odbc_exec($conn,$sql); 取回语语 odbc_fetch_row() 函数用于从果集中返回。如果能返回行,返回 true,否返回 false。 函数有两个参数:ODBC 果符和可的行号: odbc_fetch_row($rs) 从语语中取回字段 odbc_result() 函数用于从中取字段。函数有两个参数:ODBC 果符和字段号或名称。 下面的代行从中返回第一个字段的: $compname=odbc_result($rs,1); The code line below returns the value of a field called "CompanyName": $compname=odbc_result($rs,"CompanyName");语语 ODBC 语接 odbc_close()函数用于 ODBC 接。 odbc_close($conn); ODBC 语例 下面的例子展示了如何首先建一个数据接,然后是果 集,然后在HTML 表格中示数据。 <html> <body> <?php $conn=odbc_connect('northwind','','');if (!$conn) {exit("Connection Failed: " . $conn);}$sql="SELECT * FROM customers";$rs=odbc_exec($conn,$sql); if (!$rs) {exit("Error in SQL");} echo "<table><tr>"; echo "<th>Companyname</th>"; echo "<th>Contactname</th></tr>";while (odbc_fetch_row($rs)) { $compname=odbc_result($rs,"CompanyName"); $conname=odbc_result($rs,"ContactName"); echo "<tr><td>$compname</td>"; echo "<td>$conname</td></tr>"; } odbc_close($conn); echo "</table>"; ?> </body> </html>
|