PHP想入門? 看這個(gè)就夠了

PHP 進(jìn)階整理

本文將介紹PHP的一些較重要的內(nèi)容。
包括:
面向?qū)ο缶幊獭⒄齽t表達(dá)式、
程序錯(cuò)誤處理、XML、
AJAX、圖像處理、MySQL數(shù)據(jù)庫、
開發(fā)模式。

一、面向?qū)ο蟮腜HP編程


和其他面向?qū)ο笳Z言差不多,有區(qū)別的地方會(huì)指出,其他簡(jiǎn)要介紹一下。

注:
構(gòu)造函數(shù):function __construct();
析構(gòu)函數(shù):function __destruct();
有默認(rèn)的set和get方法
指向父類:parent::
指向子類:self::

//類
<?php
class Person
{
      private $name;
      //構(gòu)造函數(shù)
      function __construct(){
              $name = "MrLiuQ";
      }
      //析構(gòu)函數(shù)
      function __destruct(){
              echo "析構(gòu)函數(shù)被調(diào)用";
      }
      public function set_name($name){
              $this->name = $name;
      }
      public function get_name(){
              echo "My name is ".$this->name."<br/>";
      }
}

//繼承
class Worker extends Person
{
      private $salary;
      //構(gòu)造函數(shù)
      function __construct(){
              $salary = 5000;
      }
      //析構(gòu)函數(shù)
      function __destruct(){
              echo "析構(gòu)函數(shù)被調(diào)用";
      }
      public function set_salary($salary){
              $this->salary = $salary;
      }
      public function get_salary(){
              return $this->salary;
      }
}

$boy = new Person;
$boy->set_name("Harry Pottor");
$boy->get_name();

$girl = new Person;
$girl->set_name("Emma");
$girl->get_name();

$a_work = new worker;
$a_work->set_name('Paul');
$a_work->set_salary(3500);

$name = $a_work->get_name();
$salary = $a_work->get_salary();
echo $name."的月薪為".$salary;
?>

<?php
class Counter
{
      private static $count = 0;    //靜態(tài)成員變量
      
      function __construct(){    //構(gòu)造函數(shù)
            echo "計(jì)數(shù)開始";      
      }
      function __destruct(){      //析構(gòu)函數(shù)
            echo "計(jì)數(shù)結(jié)束";
      }
      
      static function get_count(){    //靜態(tài)成員函數(shù)
            return self::$count;
      }
      
      static function counts(){
            self::$count++;      //注意這里靜態(tài)成員變量的使用方法,加self::
      }
}

$c = new Counter();
$i = 0;

while($i<5){
Counter::counts();    //通過限定Count::直接調(diào)用靜態(tài)函數(shù)counts(),并沒有使用對(duì)象$c來調(diào)用。
      $i = Counter::get_count();
      echo Counter::get_count()."<br/><br/>";
}
?>

相關(guān)函數(shù):

__construct():構(gòu)造函數(shù)
__destruct():析構(gòu)函數(shù)
__get():用到不存在屬性時(shí),系統(tǒng)默認(rèn)調(diào)用
__set():當(dāng)設(shè)置不存在屬性時(shí),系統(tǒng)默認(rèn)調(diào)用
__call():訪問一個(gè)不存在的方法時(shí),默認(rèn)調(diào)用
__toString():將一個(gè)對(duì)象轉(zhuǎn)換成字符串
__clone():克隆一個(gè)對(duì)象時(shí)使用。
克隆:PHP默認(rèn)通過引用傳遞對(duì)象。使用$obj2 = $obj1兩對(duì)象是關(guān)聯(lián)的,如果不希望產(chǎn)生關(guān)聯(lián),就使用clone,克隆一個(gè)新的對(duì)象。

二、正則表達(dá)式:Regular expression


定義:是負(fù)責(zé)對(duì)字符串做解析對(duì)比,從而分析出字符串的構(gòu)成,以便進(jìn)一步對(duì)字符串做相關(guān)的處理。

注:正則表達(dá)式允許用戶通過使用某種特殊字符構(gòu)建匹配模式,然后把匹配模式與文件中的數(shù)據(jù)、程序輸入或者Web頁面的表單輸入等目標(biāo)對(duì)象進(jìn)行比較,根據(jù)這些輸入中是否包含匹配模式,來執(zhí)行相應(yīng)的程序。

1.正則表達(dá)式的語法:

元字符:
^ :匹配指定字符串開頭的字符串
$ :匹配指定字符串結(jié)尾的字符串
. :匹配除\n之外的任何單個(gè)字符,代替任何字符
[] :匹配指定范圍內(nèi)的單個(gè)字符,代替指定字符
| :在多項(xiàng)之間選擇一個(gè)進(jìn)行匹配
\ :轉(zhuǎn)義字符
() :標(biāo)記子表達(dá)式的開始和結(jié)束位置
* :匹配其左邊的子表達(dá)式0次或多次
+ :匹配其左邊的子表達(dá)式1次或多次
? :匹配其左邊的子表達(dá)式0次或1次

限定符:
{n}:表示匹配該限定符左邊字符n次
{n,}:表示匹配該限定符左邊至少n次
{n,m}:表示匹配該限定符左邊至少n次,最多m次

轉(zhuǎn)義字符:
\n :一個(gè)換行符。等價(jià)于\x0a和\cJ
\r :一個(gè)回車符。等價(jià)于\x0d和\cM
\s :任何空白字符,包括空格、制表符、換頁符等。等價(jià)于[\f\n\r\t\v]
\S :任何非空白字符。等價(jià)于[^\f\n\r\t\v]
\t :一個(gè)制表符。等價(jià)于\x09和\cI
\v :一個(gè)垂直制表符。等價(jià)于\x0b和\cK
\f :一個(gè)換頁符。等價(jià)于\x0c和\cL
\cx :由x指明的控制字符。

字符類:
[[:alpha:]] :匹配任何字母
[[:digit:]] :匹配任何數(shù)字
[[:alnum:]] :匹配任何字母和數(shù)字
[[:space:]] :匹配任何空白字符
[[:upper:]] :匹配任何大寫字母
[[:lower:]] :匹配任何小寫字母
[[:punct:]] :匹配任何標(biāo)點(diǎn)符號(hào)
[[:xdigit:]] :匹配任何16進(jìn)制數(shù)字,相當(dāng)于[0-9a-fA-F]
[[:blank:]] :匹配空格和Tab,等價(jià)于[\t]
[[:cntrl:]] :匹配所有ASCII 0到31之間的控制符
[[:graph:]] :匹配所有的可打印字符,等價(jià)于[^ \t\n\r\f\v]
[[:print:]] :匹配所有的可打印字符和空格,等價(jià)于[^\t\n\r\f\v]

反義:
\W :匹配任意不是字母,數(shù)字,下劃線或漢子的字符
\S :匹配任意不是空白符的字符
\D :匹配任意非數(shù)字的字符
\B :匹配不是單詞開頭或結(jié)束的位置

//模式:舉例

^once  //匹配給定模式開頭的字符串

PHP$   //匹配給定模式結(jié)尾的字符串 

^Python$  //精確定位:指定字符串

b.s   //這個(gè)單詞可以是bes、bis、bos....

b[eiou]s //這個(gè)單詞只匹配 bes、bis、bos、bus

b(a|e|i|o|oo)s  //這個(gè)單詞匹配bas、bes、bis、bos、boos

pe* //匹配perl、peel、pet、port...

co+  //匹配come、code、cool、co...

a{3}  //匹配aaa、cacaaad、aacoaaao...

a{3,}  //匹配aaa、aaab、caaaaa...

a{1,3}b  //匹配ab、aab、aaab...

ab*  //和ab{0,}同義,a、ab、abb...

ab+  //和ab{1,}同義,ab、abb...

ab?  //和ab{0,1}同義,a、ab

a?b+$  //匹配ab、abb...

a(bc)*  //匹配a、abc、abcbc...

[ab]  //與a|b同義,匹配a、b

[a-d]  //與a|b|c|d及[abcd]同義,匹配a、b、c、d。

^[a-zA-Z_]$  //匹配所有的只有字母和下劃線的字符串。如果不加^和$,凡是含有字母和下劃線的字符都會(huì)被匹配。

^[a-zA-Z0-9_]{1,}$  //匹配所有包含一個(gè)以上的字母、數(shù)字或下劃線的字符串。

^[0-9]{1,}$  //匹配所有正數(shù)

^\-{0,1}[0-9]{1,}$  //匹配所有的整數(shù)

^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$  //匹配所有小數(shù)

PHP有兩大類函數(shù)支持正則表達(dá)式,
一類是POSIX擴(kuò)展函數(shù)(PHP5.2之后棄用),
另一類是Perl兼容的正則表達(dá)式函數(shù)(PHP4.0后支持)。

2.POSIX擴(kuò)展正則表達(dá)式函數(shù)(PHP5后棄用):

ereg() :字符串的正則匹配函數(shù)
ereg_replace() :區(qū)分大小寫的正則表達(dá)式替換
eregi() :不區(qū)分大小寫的正則表達(dá)式匹配
eregi_replace() :不區(qū)分大小寫的正則表達(dá)式替換
split() :用正則表達(dá)式將字符串分割到數(shù)組中
spliti() :用正則表達(dá)式不區(qū)分字母大小寫將字符串分割到數(shù)組中
sql_regcase() :產(chǎn)生用于不區(qū)分大小的正則表達(dá)式

//正則表達(dá)式匹配函數(shù)
int ereg(string $pattern, string $string [, array &regs]);  //區(qū)分大小寫
int eregi(string $pattern, string $string [, array &regs]);  //不區(qū)分大小寫

<?php
$arr_date = array(
'2008-06-01',
'1997-06-25',
'1996-11-29',
'2005-0x-10',
'12-12-12',
'2012-12-25 00:10:20'
);

for ($i=0; $i<5; ++$i){
      $date = $arr_date[$i];
      if(ereg("([0-9]){4})-([0-9]{1,2})-([0-9]{1,2})", $date , $regs)){
              echo "日期字符串$date 符合'YYYY-MM-DD'格式:";
              echo "$regs[1].$regs[2].$regs[3]<br/><br/>";
      }else{
              echo "<b>日期字符串$date 不符合'YYYY-MM-DD'格式</b><br/><br/>";
      }
}
?>

//替換匹配字符串的函數(shù)
string ereg_replace(string $pattern, string $replacement, string $string);  //區(qū)分大小寫
string eregi_replace(string $pattern, string $replacement, string $string);  //不區(qū)分大小寫

<?php
$str = "You have a car , I have a Car , We have cARs!"  //源字符串
echo "<b>替換前字符串為:</b><br/>";
echo $str;
echo "<br/>";
echo "<br/>";

$pattern = "car";    //匹配字符串
$replacement = "Apple";   //替換后字符串
$str_rpc = eregi_replace($pattern,$replacement,$str);
echo "<b>替換后字符串為:</b><br/>";
echo $str_rpc;
?>

//根據(jù)正則表達(dá)式分割字符串函數(shù)
array split(string $pattern, string $string [, int $limit]);

<?php
$str = "aaa~bbb~ccc~ddd";  //定義字符串變量
echo "字符串截取前:$str";
echo "<br/>";
echo "<br/>";

$sep_arr = split("~",$str);
echo "<b>字符串截取后:</b><br/>";  //分割字符串變量$str
echo "<pre>";

print_r($str_arr);
?>

//生成正則表達(dá)式的函數(shù)
string sql_regcase(string $string);   //不區(qū)分大小正則表達(dá)式

<?php
$str = "K#V3050"
echo "<b>原字符串:</b><br/>$str";    //定義字符串變量
echo "<br/>";
echo "<br/>";

$reg_str = sql_regcase($str);
echo "<b>生成的正則表達(dá)式為:</b><br/>";  //生成正則表達(dá)式
echo $reg_str;
?>

3.PERL兼容正則表達(dá)式函數(shù)(PHP4后支持,重點(diǎn)):

PERL兼容正則表達(dá)式使用修正符,
所謂修正符,是指正則表達(dá)式最后的補(bǔ)充說明。
另外,
PERL兼容正則表達(dá)式中所有的模式前后都需要加/

修正符
i :匹配時(shí)忽略大小寫
m :除了匹配^$整個(gè)字符串開頭和結(jié)尾,還匹配其中的換行符(\n)的之后和之前
s :使原點(diǎn)字符(.)匹配任意一個(gè)字符同時(shí)也匹配換行符
x :模式中的空白字符除了被轉(zhuǎn)義的或在字符類中的以外完全被忽略
e :preg_replace()在替換字符串中對(duì)逆向引用作正常的替換,將其作為PHP代碼求值,并用其結(jié)果來替換所搜索的字符串

A :模式被強(qiáng)制為“anchored”,即強(qiáng)制僅從目標(biāo)字符串的開頭開始匹配
D :模式中的行結(jié)束($)僅匹配目標(biāo)字符串的結(jié)尾,否則包含換行符
S :為加速匹配而對(duì)其進(jìn)行分析,分析一個(gè)模式僅對(duì)沒有單一固定其實(shí)字符的nonanchored模式有用
U :使“?”的默認(rèn)匹配成為貪婪狀態(tài)
X :一個(gè)反斜線后面跟一個(gè)沒有特殊意義的字母被當(dāng)成該字母本身
u :模式字符串被當(dāng)成UTF-8

preg_grep() :返回與模式匹配的數(shù)組單元的正則表達(dá)式函數(shù)
preg_match() :進(jìn)行正則表達(dá)式匹配的函數(shù)
preg_match_all() :進(jìn)行全局正則表達(dá)式匹配的函數(shù)
preg_replace() :執(zhí)行正則表達(dá)式的搜索和替換的函數(shù)
preg_split() :用正則表達(dá)式分割字符串的函數(shù)

//返回與模式匹配的數(shù)組單元的正則表達(dá)式函數(shù)
array preg_grep(string $pattern, array $input [, int $flag]);

<?php
$test_preg = array(
"AK47",
"163.com",
"happy new year",
"EX0000",
"007 in USA",
"abc123",
"TEST-abc-315",
"123654789",
"Euapa00!"
);

echo "<b>原數(shù)組:</b>";
echo "<pre>";
print_r($test_preg);
echo "</pre>";

$preg_arr = preg_grep("/^[A-Z].*[0-9]$/",$test_preg);  //正則表達(dá)式
echo "<br>";
echo "<b>將原數(shù)組中以任意大寫字母開頭的、中間任意個(gè)字符、最后以數(shù)字結(jié)尾的字符串找出:</b>";
echo "<pre>";
print_r($preg_arr);  //輸出匹配的元素
echo "</pre>";
?>


//進(jìn)行正則表達(dá)式匹配的函數(shù)
int preg_match(string $pattern , string $subject [, arrayy $matches [, int $flag]]);

<?php
$str_arr = array(
"PHP 是優(yōu)秀的Web腳本語言",
"Perl的文本處理功能很強(qiáng)大"
);

foreach($str_arr as $str){
      //使用了修正符
      if(preg_match("/php/i",$str)){
            echo "在字符串'$str'中找到對(duì)'php'的匹配";
            echo "<br/>";
            echo "<br/>";
      }else{
             echo "在字符串'$str'中<b>未</b>找到對(duì)'php'的匹配";
            echo "<br/>";
            echo "<br/>";           
      }
}
?>


//進(jìn)行全局正則表達(dá)式匹配的函數(shù)
int preg_match_all (string $pattern, string $subject, array $matches [,int $flag]);

<?php
$html = "<b>粗體字符</b><a href=index.html>可點(diǎn)擊的連接</a>";

preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html , $matches);

for ($i=0;$i<count($matches[0]);$i++){
      echo "匹配:".$matches[0][$i]."\n";
      echo "第一部分:".$matches[1][$i]."\n";
      echo "第二部分:".$matches[2][$i]."\n";
      echo "第三部分:".$matches[3][$i]."\n\n";
}
?>

//執(zhí)行正則表達(dá)式的搜索和替換的函數(shù)
mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject [, int $limit]);

<?php
$string = "The quick brown fox jumped over the lazy dog.";  
echo "原字符串:<br/>";
echo $string;
echo "<br/><br/>";

$patterns[0] = "/quick/";
$patterns[1] = "/brown/";
$patterns[2] = "/fox/";

$replacements[2] = "bear";
$replacements[1] = "black";
$replacements[0] = "slow";

$str1 = preg_replace($patterns,$replacements,$string);  //替換字符串
echo "使用函數(shù)ksort()之前字符串替換為:<br/>";
echo $str1;
echo "<br/><br/>";

ksort($patterns);        //排序
ksort($replacements);    //排序

$str2 = preg_replace($patterns,$replacements,$string);
echo "使用函數(shù)ksort()之后字符串替換為:<br/>";
echo $str2;
echo "<br/><br/>";
?>


//用正則表達(dá)式分割字符串的函數(shù)
array preg_split(string $pattern,string $subject [,int $limit [, int $flag]]);
//參數(shù)$limit=-1,$flag參數(shù)如下:
PREG_SPLIT_NO_EMPTY:只返回非空的部分
PREG_SPLIT_DELIM_CAPTURE:界定符模式中的括號(hào)表達(dá)式會(huì)被捕捉返回
PREG_SPLIT_OFFSET_CAPTURE:對(duì)每個(gè)出現(xiàn)的匹配結(jié)果同時(shí)返回其附屬的字符串偏移量。注意,這改變了返回的數(shù)組的值,使其中的每個(gè)單元也是一個(gè)數(shù)組,其中第一項(xiàng)為匹配字符串,第二項(xiàng)為它在$subject中的偏移量

<?php
$str = 'PHP language programming in Web';  //定義字符串變量
echo "<b>原字符串:</b><br/>";
echo $str;
echo "<br/><br/>";

$chars = preg_split('/ /',$str,-1,PREG_SPLIT_OFFSET_CAPTURE);  //分割字符串
echo "<b>調(diào)用函數(shù)preg_split()后:</b>";
echo "<pre>";
print_r($chars);
?>

4.幾例常見的正則表達(dá)式分析:

  • 實(shí)例1:檢查IP地址的正則表達(dá)式:
    直接上代碼:
<?php
$arr_ip = array(  //定義了一個(gè)數(shù)組
  "192.168.1.100",
  "-12.255.0.10",
  "256.1.2.255",
  "10.9c.132.69",
  "255.255.255.255",
  "123.0.0.0.1"
);

foreach ($arr_ip as $ip ) {  //驗(yàn)證數(shù)組里的IP
  if (validateIp($ip)) {  //驗(yàn)證ip
    echo "<b>$ip 是正確的IP地址</b>";
    echo "<br/><br/>";
  }else {
    echo "$ip 不是正確的IP地址";
    echo "<br/><br/>";
  }
}

function validateIp($ip){  //驗(yàn)證ip的函數(shù)
  $iparray = explode(".",$ip);
  for ($i=0; $i < count($iparray); $i++) {
    if ($iparray[$i]>255) {
      return (0);
    }
    return preg_match("/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/",$ip);
  }
}
?>
  • 實(shí)例2:檢查中文字符的正則表達(dá)式:
    直接上代碼
<?php
$str_arr = array( //測(cè)試數(shù)組
  "I am very happy",
  "快樂編程快樂生活",
  "PHP編程",
  "1997年香港回歸",
  "英語學(xué)習(xí)ABC",
  "123456789"
);

$patt_ch = chr(0xa1)."-".chr(0xff); //匹配中文字符的ASCII范圍

foreach ($str_arr as $str){
  echo "字符串'$str'是";
  if(preg_match("/[$patt_ch]+/",$str)){  //注意在正則表達(dá)式的前后使用界定符
    echo "<b>存在中文</b>";
    echo "<br>";
    echo "<br>";
  }else {
    echo "不存在中文";
    echo "<br>";
    echo "<br>";
  }
}
?>
  • 實(shí)例3:檢查Email地址的正則表達(dá)式
<?php
$str_arr = array( //測(cè)試數(shù)組
  "mymail@somesite.com",
  "my_mail@somesite.com",
  "my-mail@somesite.com",
  "my.mail@somesite.com",
  "mymail@somesite.ccoomm",
  "mymail@site.cn",
  "mymail@@@site.com",
  "mymail@site",
  "MyMail@somesite.com",
  "My2007@somesite.com",
  "163mail_for-me777@somesite.com",
  "510137672@qq.com"
);

$patt_email = "/^[_a-zA-Z0-9-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4}$/"; //驗(yàn)證郵箱

foreach ($str_arr as $str){
  echo "字符串'$str'是";
  if(preg_match($patt_email,$str)){  //注意在正則表達(dá)式的前后使用界定符
    echo "<b>合法的Email格式</b>";
    echo "<br>";
    echo "<br>";
  }else {
    echo "不合法的Email格式";
    echo "<br>";
    echo "<br>";
  }
}
?>
  • 實(shí)例4:檢查URL地址的正則表達(dá)式
    直接上代碼:
<?php
$str_arr = array( //測(cè)試數(shù)組
  "http://www.liubaiqi.cn",
  "www.liubaiqi.cn",
  "http://www.liubaiqi.cn/login.html",
  "http://liubaiqi.com",
  ":www.liubaiqi.cn"
);

$patt_url = "/^(http:\/\/)?[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*.+$/"; //驗(yàn)證URL的正則表達(dá)式

foreach ($str_arr as $str){ //遍歷數(shù)組
  echo "字符串'$str'是";
  if(preg_match($patt_url,$str)){  //匹配URL
    echo "<b>合法的URL格式</b>";
    echo "<br>";
    echo "<br>";
  }else {
    echo "不合法的URL格式";
    echo "<br>";
    echo "<br>";
  }
}
?>

三、PHP程序中的錯(cuò)誤處理


PHP程序異常通常有3種情況:
1.語法錯(cuò)誤:代碼書寫、語法錯(cuò)誤

2.運(yùn)行時(shí)錯(cuò)誤:代碼本身沒有錯(cuò),在運(yùn)行時(shí)操作時(shí)出錯(cuò)
3.邏輯錯(cuò)誤:最難改,程序能正常運(yùn)行,但最終結(jié)果不是所期望的值

1.內(nèi)置異常處理類——Exception

PHP5增加了內(nèi)置的異常處理類——Exception,內(nèi)置函數(shù)
getMessage():返回對(duì)錯(cuò)誤的描述信息
getCode():返回錯(cuò)誤代碼,以數(shù)字形式出現(xiàn)
getFile():返回發(fā)送錯(cuò)誤的文件名
getLine():返回發(fā)送錯(cuò)誤的代碼行號(hào)
getTrace():返回backtrace()錯(cuò)誤
getTraceAsString():返回已格式化成字符串的、由函數(shù)getTrace()所產(chǎn)生的信息
__toString():產(chǎn)生異常的字符串信息,可以重載

現(xiàn)在讓我們來看一下PHP中內(nèi)置異常處理類的完整代碼:

<?php
class Exception{
  protected $message = 'Unknown exception'; //異常信息
  protected $code = 0;  //用戶自定義異常代碼
  protected $file;  //發(fā)生異常的文件名
  protected $line;  //發(fā)生異常的代碼行號(hào)

  function __construct($message = null,$code = 0);

  final function getMessage();  //返回異常信息
  final function getCode(); //返回異常代碼
  final function getFile(); //返回發(fā)生異常的文件名
  final function getLine(); //返回發(fā)送異常的代碼行號(hào)
  final function getTrace(); //backtrace()數(shù)組
  final function getTraceAsString(); //已格式化成字符串的getTrace()信息

  function __toString();; //可輸出的字符串,可重載
}
?>

2.捕獲異常的方法:

和JAVA很像,
try...catch...:異常處理的格式
throw:拋出異常

例如:

<?php
try{
  $error = '拋出異常信息,并且跳出try塊<br/>';
  if (is_dir('./test')) {
    echo '監(jiān)測(cè)到../ch16是一個(gè)目錄';
    echo '<br/>';
    echo '可能繼續(xù)做其他一些操作';
    echo '<br/>';
    echo '....';
    echo '<br/>';
  }else {
    throw new Exception($error, 12345);  //拋出異常
  }
  echo '上面throw異常的話,這行代碼不會(huì)執(zhí)行,轉(zhuǎn)而執(zhí)行catch塊<br/>';
}catch(exception $e){  //獲取異常
  echo '捕獲異常:'.$e->getMessage()."<br/>錯(cuò)誤代碼:".$e->getCode().'<br/>';
  echo '<br/>';
}
echo '繼續(xù)執(zhí)行';
?>

3.獲取異常信息的函數(shù)使用:

直接上代碼例子

<?php
$file = './var/www/html//index.html';  //指定文件地址

try{
  if (is_dir($file)) {  //判斷是否是目錄
    echo '檢測(cè)到目錄';
  }else {
    //創(chuàng)建異常對(duì)象,錯(cuò)誤信息將由Exception類的成員函數(shù)getMessage()返回
    throw new Exception('未找到該目錄或文件');
  }
}catch(Exception $e){
  echo '捕獲異常:'.$e->getMessage();
  echo '<br/><br/>';
  echo '錯(cuò)誤所在文件:'.$e->getFile();
  echo '<br/><br/>';
  echo '錯(cuò)誤所在行號(hào):'.$e->getLine();
  echo '<br/>=================================<br/>';
}

echo '程序執(zhí)行完畢';
?>

4.自定義的錯(cuò)誤處理:myHandler()

PHP中默認(rèn)錯(cuò)誤處理器被自定義的錯(cuò)誤處理函數(shù)myHandler()替代

<?php
set_error_handler('myHander');  //自定義錯(cuò)誤處理函數(shù)

function myHander($code,$msg,$file,$line){
  echo "<br/>";
  echo "程序<b>$file</b>執(zhí)行過程中,在第<b>$line</b>行,產(chǎn)生一個(gè)錯(cuò)誤。";
  echo "<br/>";
  echo "錯(cuò)誤代碼為:<b>$code</b>,錯(cuò)誤的原因是:<b>$msg</b>";
}

echo $uvar; //輸出未定義變量,錯(cuò)誤處理
?>

四、PHP 與 XML


XML:擴(kuò)展標(biāo)記語言(eXtensible Markup Language),由W3C制定
它不僅僅是一種標(biāo)記語言,還是一種存儲(chǔ)數(shù)據(jù)的格式。
用XML可以描述標(biāo)記建立數(shù)據(jù),
現(xiàn)在由于JSON的優(yōu)越性(解析完能轉(zhuǎn)換成非常好的數(shù)據(jù)結(jié)構(gòu),使用起來會(huì)很方便),數(shù)據(jù)解析上更多的使用JSON,
但作為初學(xué)者,還是要學(xué)習(xí)一下XML的內(nèi)容。
這里參考一篇技術(shù)博客,這里關(guān)于XML和JSON解析講解的很好。

1.XML與HTML的不同:

注意:XML和HTML有些不同,
XML用來描述數(shù)據(jù),并關(guān)注數(shù)據(jù)是什么;
而HTML用來顯示數(shù)據(jù),它關(guān)注的是如何使數(shù)據(jù)顯示出來。
XML并不是作為HTML的替代品而出現(xiàn),它們有各自的領(lǐng)域和價(jià)值。

2.XML實(shí)例:

下面描述一個(gè)圖書館信息的XML文檔

<?xml version="1.0" encoding="UTF-8"?>
<books>
  <book>
    <title>Learning PHP7</title>
    <author>David</author>
    <publisher>White Water Press</publisher>
    <price>29.90</price>
  </book>
  <book>
    <title>Learning XML</title>
    <author>MrLiu</author>
    <publisher>White Water Press</publisher>
    <price>58.90</price>
  </book>
  <book>
    <title>Using PERL</title>
    <author>Lucy</author>
    <publisher>White Water Press</publisher>
    <price>17.90</price>
  </book>
  <book>
    <title>Windous Networks</title>
    <author>Paul</author>
    <publisher>White Water Press</publisher>
    <price>32.99</price>
  </book>
  <book>
    <title>Fly Leaf</title>
    <author>Jenny</author>
    <publisher>White Water Press</publisher>
    <price>19.50</price>
  </book>
</books>
  • 1.XML聲明:

version屬性:描述XML的版本號(hào)
standalone屬性:描述該XML文件是否和一個(gè)獨(dú)立的聲明文件(DTD)配套使用,YES表示沒有DTD,NO表示有DTD配套
encoding屬性:XML分析器支持的編碼標(biāo)準(zhǔn),常用的是UTF-8和GB2312(簡(jiǎn)體中文碼)

  • 2.XML元素:<標(biāo)記>數(shù)據(jù)內(nèi)容</標(biāo)記>
<國籍>中國</國籍>
<title>Learning XML</title>
  • 3.標(biāo)記和屬性:<標(biāo)記名 屬性名="屬性取值">
<person sex="female">
  • 4.處理指令:<?處理指示名 處理指示信息?>
<?cocoon-process type="sql"?>

cocoon是來自Apache軟件基金會(huì)的XML處理框架,該實(shí)例告訴cocoon,XML文檔包含一個(gè)SQL語句。

  • 5.實(shí)體:

實(shí)體是文檔用來替換一些特殊標(biāo)記符號(hào)的字符串。
XML和HTML中常見的實(shí)體如下:
&lt:代表小于符號(hào)<,less than
&gt:代表大于符號(hào)>,greater than
&quot:代表一個(gè)雙引號(hào)
&apos:代表一個(gè)單引號(hào),或撇號(hào)
&amp:代表一個(gè)“與”符號(hào)&
注:實(shí)體以“&”開頭,以英文“;”結(jié)束。

  • 6.文件類型定義(DTD):

一個(gè)完全意義上的XML文件不僅應(yīng)該是形式良好的,而且還該使用自定義標(biāo)記的XML文件。定義來表示數(shù)據(jù)的標(biāo)記,最常用的方法是實(shí)用文檔定義類型(Document Type Definition)DTD。
簡(jiǎn)而言之,DTD規(guī)定了一個(gè)語法分析器為了解釋一個(gè)“有效的”XML文件所需要知道的所有規(guī)則和細(xì)節(jié)。

實(shí)例:DTD用來指定XML文檔的基本結(jié)構(gòu),在XML文件的序言部分加入一個(gè)DTD描述,加入位置在XML處理指示之后

<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE 根元素名[
           元素描述
]>
文件體

DTD中使用元素類型聲明(Element Type Definition,ETD)來聲明所有有效的文件元素。ETD結(jié)構(gòu)如下:
<!ELEMENT 元素名 元素內(nèi)容描述>
所以剛才的圖書館實(shí)例可以修改為:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 這些是圖書館中圖書的有關(guān)信息-->
<!DOCTYPE books[
<!ELEMENT books (book)*>
<!ELEMENT book (title,author,publisher,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<books>
  <book>
    <title>Learning PHP7</title>
    <author>David</author>
    <publisher>White Water Press</publisher>
    <price>29.90</price>
  </book>
  <book>
    <title>Learning XML</title>
    <author>MrLiu</author>
    <publisher>White Water Press</publisher>
    <price>58.90</price>
  </book>
  <book>
    <title>Using PERL</title>
    <author>Lucy</author>
    <publisher>White Water Press</publisher>
    <price>17.90</price>
  </book>
  <book>
    <title>Windous Networks</title>
    <author>Paul</author>
    <publisher>White Water Press</publisher>
    <price>32.99</price>
  </book>
  <book>
    <title>Fly Leaf</title>
    <author>Jenny</author>
    <publisher>White Water Press</publisher>
    <price>19.50</price>
  </book>
</books>

使用DTD中也可以定義屬性,格式如下:
<!ATTLIST 元素名 (屬性名 屬性類型 默認(rèn)值) *>
實(shí)例:

<!ELEMENT city (#PCDATA)>
<!ATTLIST city province CDATA #REQUIRED>

這段示例XML定義了<city>元素,同時(shí)使用關(guān)鍵字ATTLIST聲明元素的屬性。屬性列表中的名稱city告訴解析器這些屬性是為元素<city>定義的。名稱province是屬性的名稱,關(guān)鍵字CDATA和#REQUIRED告訴XML解析器province屬性包含文本并且是必須的。如果是可選的,使用CDATA #IMPLIED。

3.PHP對(duì)XML的支持:

PHP5后支持符合W3C標(biāo)準(zhǔn)的DOM和SimpleXML擴(kuò)展,默認(rèn)情況下同時(shí)支持SAX(原生支持)、DOM、SimpleXML。

XML解析器分為兩種類型:
一種是基于樹型的解析器:將XML文檔轉(zhuǎn)換成樹型結(jié)構(gòu)。提供一個(gè)API來訪問所產(chǎn)生數(shù)的每個(gè)元素,其通用的標(biāo)準(zhǔn)為DOM,即文檔對(duì)象模式。重點(diǎn)在結(jié)構(gòu),樹型結(jié)構(gòu)。
二種是基于事件的解析器:將XML文檔視為一系列的事件。當(dāng)一個(gè)而特殊事件發(fā)生時(shí),默認(rèn)調(diào)用開發(fā)者提供的函數(shù)處理。重點(diǎn)在數(shù)據(jù),從頭到尾。

  • PHP函數(shù)處理XML文檔:
//XML解析器的建立
resource xml_parser_create([string $encoding]);
//XML解析器的釋放
bool xml_parser_free(resource $parser);

//處理XML元素的函數(shù)
bool xml_set_element_handler(resource $parser,callback $start_elem_handler,callback $end_elem_handler);

//處理XML字符數(shù)據(jù)的函數(shù)
bool xml_set_character_data_handler(resource $parser,callback $handler);

//解析一個(gè)XML文檔
int xml_parse (resource $parser,string $data [, bool $is_final]);

Expat函數(shù)XML文檔實(shí)例:

//ExpatXML.php
<?php
$parser = xml_parser_create();    //初始化XML分析器

function start($parser , $elem_name,$elem_attrs){  //在一個(gè)元素開始時(shí)調(diào)用的函數(shù)
  switch ($elem_name) {
    case "BOOKS":
      echo "<b>-- 圖書信息 --</b><br/><br/>";
      break;
    case "TITLE":
      echo "<b>書名:</b>";
      break;
    case "AUTHOR":
      echo "<b>作者:</b>";
      break;
    case "PUBLISHER":
      echo "<b>出版社:</b>";
      break;
    case "PRICE":
      echo "<b>價(jià)格:</b>";
      break;
  }
}

function stop($parser,$elem_name){  //在一個(gè)元素結(jié)束時(shí)調(diào)用的函數(shù)
  echo "<br/>";
}

function char($parser,$data){ //當(dāng)找到一個(gè)字符數(shù)據(jù)時(shí)調(diào)用該函數(shù)
  echo $data;
}

xml_set_element_handler($parser,"start","stop");  //指定元素處理器
xml_set_character_data_handler($parser,"char");   //指定字符數(shù)據(jù)處理器

$fp=fopen("XMLTest.xml","r");   //打開XML文件
while($data=fread($fp,1024)){   //循環(huán)讀入XML文件中的內(nèi)容
  xml_parse($parser,$data,feof($fp)) or
  die(sprintf("XML錯(cuò)誤:%s at line %d",
  xml_error_string(xml_get_error_code($parser)),
  xml_get_current_line_number($parser)));
}

xml_parser_free($parser); //釋放XML分析器資源
?>
  • 使用SimpleXML處理XML

SimpleXML,名副其實(shí),使用起來十分簡(jiǎn)單,最適合簡(jiǎn)單的、類似記錄的數(shù)據(jù)。
SimpleXML函數(shù):

//載入XML文件的函數(shù)
object simplexml_load_file(string $filename [, string $class_name [,int $options]]);

<?php
if(file_exists('XMLTest.xml')){   //判斷文件是否存在
  $xml = simplexml_load_file('XMLTest.xml');  //加載文件
  var_dump($xml);
}else{
  exit('載入文件test.xml失敗');
}
?>

//載入XML字符串的函數(shù)
object simplexml_load_strig(string $data [, string $class_name[, int $options]]);

<?php
$xml_str = "<?xml version='1.0' encoding='UTF-8'?>";
$xml_str .= "<EMAILDOCUMENT>";
$xml_str .= "<TITLE>最近在學(xué)什么</TITLE>";
$xml_str .= "<FROM>小強(qiáng)</FROM>";
$xml_str .= "<TO>大強(qiáng)</TO>";
$xml_str .= "<BODY>";
$xml_str .= "我最近在學(xué)PHP,你呢?";
$xml_str .= "</BODY>";
$xml_str .= "</EMAILDOCUMENT>";

$xml = simplexml_load_string($xml_str); //加載XML字符串
var_dump($xml);
?>

SimpleXML實(shí)例:

<?php
$xml = simplexml_load_file("XMLTest.xml");  //載入指定的XML文檔

echo "==== " . $xml->getName() . "====<br/>"; //獲取當(dāng)前元素的名稱

foreach ($xml->children() as $child) {
  echo "--- ".$child->getName()."---<br/>";
  foreach ($child->children() as $ch) {
    echo $ch->getName().":".$ch."<br/>";
  }
  echo "<br/>";
}
?>
  • 使用PHP的DOM庫處理XML文檔

DOM是Document Object Model的縮寫。它是在瀏覽器中使用的、用JavaScript操作的W3C DOM規(guī)范。分析成DOM的樹型結(jié)構(gòu)。

下面介紹如何通過DOM在PHP中處理XML文檔:
步驟如下:
1> 首先需要?jiǎng)?chuàng)建一個(gè)DOM的實(shí)例,即DOMDocument

$dom = new DOMDocument;

2>載入XML到該實(shí)例中,有兩種方法:一是從一個(gè)字符串載入,使用函數(shù)loadXML(),二是從文件載入,使用load()。

//使用字符串載入
$dom->loadXML('<string>books</string>');

//從文件載入
$dom->load('XMLTest.xml');

3>使用DOM對(duì)象的documentElement屬性可以訪問XML文檔的根元素

<?php
$dom = new DOMDocument;  //1.創(chuàng)建DOM實(shí)例

$dom->load('XMLTest.xml');  //2.載入XML到該實(shí)例中
$root = $dom->DOMDocumentElement;   //3.獲取XML文檔的根元素
?>

4>使用DOM對(duì)象的saveXML輸出XML字符串,而使用方法save()可以將XML保存為一個(gè)XML文件

<?php
$xml_str = "<?xml version='1.0'?>";   //開始下定義XML字符串
$xml_str .="<books>";
$xml_str .="<book>";
$xml_str .="<title>Harry Potter</title>";
$xml_str .="<author>J.K.Rowling</author>";
$xml_str .="<publisher>Warner Bros.</publisher>";
$xml_str .="<price>39.0</price>";
$xml_str .="</book>";
$xml_str .="</books>";

$dom = new DOMDocument;
$dom->LoadXML($xml_str);  //載入定義的XML字符串

echo $dom->saveXML();     //將XML輸出到一個(gè)字符串
$dom->save("test.xml");
?>

5>使用DOM的getElementsByTagName()方法可以返回一個(gè)元素的字符數(shù)據(jù),該函數(shù)接受一個(gè)元素名稱作為參數(shù)。

<?php
$doc = new DOMDocument();
$doc->load('XMLTest.xml');    //載入指定的XML文檔

$books = $doc->getElementsByTagName("book");    //返回book元素的數(shù)據(jù)
foreach($books as $book){                       //遍歷book元素
  $authors = $book->getElementsByTagName("author");
  $author = $authors->item(0)->nodeValue;

  $publishers = $book->getElementsByTagName("publisher");
  $publisher = $publishers->item(0)->nodeValue;

  $titles = $book->getElementsByTagName("title");
  $title = $titles->item(0)->nodeValue;

  $prices = $book->getElementsByTagName("price");
  $price = $prices->item(0)->nodeValue;

  echo "$title - $author - $publisher - $price";
  echo "<br/>";
  echo "<br/>";
}
?>

五、PHP 與 AJAX


AJAX是當(dāng)今Web應(yīng)用中的一種相當(dāng)流行的技術(shù),
它最大的優(yōu)點(diǎn)是給用戶最佳的瀏覽體驗(yàn)。
無論是使用Java、ruby還是PHP,都可以實(shí)現(xiàn)AJAX應(yīng)用

注:AJAX并不完全依賴于某種服務(wù)器腳本程序,它是在瀏覽器端實(shí)現(xiàn)的技術(shù)

1.什么是AJAX?

AJAX,全稱:“Asynchronous JavaScript and XML”
翻譯一下,是異步JavaScript和XML
是一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。
其中包括:使用XHTML和CSS標(biāo)準(zhǔn)實(shí)現(xiàn)Web頁面,使用DOM實(shí)現(xiàn)動(dòng)態(tài)顯示和交互,使用XML進(jìn)行數(shù)據(jù)交換與處理,最后使用JavaScript綁定和處理所有數(shù)據(jù)。

AJAX將一些服務(wù)器負(fù)擔(dān)的工作下放至客戶端,利用客戶端的某些能力來處理數(shù)據(jù),從而減輕了服務(wù)器和帶寬的負(fù)擔(dān)。

AJAX最大的優(yōu)點(diǎn)是頁面無序刷新就可以更新頁面內(nèi)容和數(shù)據(jù),減少用戶實(shí)際等待的時(shí)間,給了用戶最佳的體驗(yàn)效果。

2.AJAX的工作原理:

在AJAX之前,Web站點(diǎn)強(qiáng)制用戶進(jìn)入提交、等待、頁面刷新顯示數(shù)據(jù)的流程。其中有大量的網(wǎng)絡(luò)請(qǐng)求,服務(wù)器和網(wǎng)絡(luò)帶寬有很大的負(fù)擔(dān)。

然而,AJAX可以在用戶單擊按鈕時(shí),使用JavaScript和DHTML立即更新Web頁面,并向服務(wù)器發(fā)出異步請(qǐng)求,以執(zhí)行更新或查詢數(shù)據(jù)庫。當(dāng)請(qǐng)求返回時(shí),就可以使用JavaScript和CSS響應(yīng)更新Web頁面,而不是刷新整個(gè)頁面。最重要的時(shí),這種速度非常快,Web站點(diǎn)看起來是即使響應(yīng)的。

原理:關(guān)于AJAX工作原理,可以用一句話概括:通過XMLHttpRequest對(duì)象來向服務(wù)器發(fā)一部請(qǐng)求,從服務(wù)器獲得數(shù)據(jù),然后用JavaScript來操作DOM從而完成頁面更新。

AJAX工作原理

缺陷:然而AJAX并不是完美的,它也有缺陷。AJAX破壞了瀏覽器的“后退”機(jī)制。即后退無法返回原先的頁面,這是一個(gè)相當(dāng)大的缺陷,雖然后來有使用一個(gè)隱藏的IFRAME來重現(xiàn)頁面上的變更,但是成本是非常大的。

3.PHP與AJAX:

  • 創(chuàng)建XMLHttpRequest對(duì)象(JavaScript對(duì)象):
<script language="javascript">
    var xmlHttp = new XMLHttpRequest();
</script>

不同的瀏覽器使用不同的方法創(chuàng)建XMLHttpRequest對(duì)象,
例如,IE使用ActiveXObject,所以最好使用如下代碼,改進(jìn)版:

var xmlHttp = null;
if(window.xmlHttpRequest){
        xmlHttp=new xmlHttpRequest();
}else if(window.ActiveXObject){
        xmlHttp=new ActiveXObject("Microsoft.xmlHTTP");
}

完整的XMLHttpRequest對(duì)象的JavaScript程序:

//AJAXTest.js
function GetXmlHttpRequest(){
  var xmlHttp=null;
  try{
    xmlHttp = new XMLHttpRequest();   //對(duì)于Firefox等瀏覽器
  }
  catch(e){
    try{
      xmlHttp = new ActiveXObject("Msxm12.XMLHTTP");  //對(duì)于IE瀏覽器
    }
    catch(e)
    {
      try{
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(e){
        xmlHttp =false;
      }
    }
  }
  return xmlHttp;
}
  • 發(fā)送異步請(qǐng)求:
    先了解一下XMLHttpRequest對(duì)象的一些方法:

open(method,url[ ,async]):使用method參數(shù)所指定的方式(POST或GET)打開一個(gè)url指定的鏈接。async為true表示異步,false為同步。
setRequestHeader(label,value):在請(qǐng)求報(bào)頭增加一個(gè)鍵值對(duì)
send(content):JavaScript將請(qǐng)求和數(shù)據(jù)向服務(wù)器發(fā)送出去
getAllResponseHeaders():獲取服務(wù)器所有的HTTP響應(yīng)報(bào)頭,并作為一個(gè)字符串返回
getResponseHeader(label):獲取一個(gè)有參數(shù)label指定的HTTP響應(yīng)報(bào)頭
abort():用來終止當(dāng)前的請(qǐng)求
再了解一下XMLHttpRequest對(duì)象的屬性和含義:
onreadystatechange:每次請(qǐng)求狀態(tài)發(fā)生改變時(shí),會(huì)調(diào)動(dòng)由該屬性保存的事件處理時(shí)間
readyState:對(duì)象狀態(tài)值,有5種選擇:0表示為初始化,1表示正在加載(loading),2表示加載完畢(loaded),3表示正在接受響應(yīng),4表示響應(yīng)接受完畢(complete)
responseTest:從服務(wù)器返回的數(shù)據(jù),以字符串形式給出
responseXML:從服務(wù)器返回DOM兼容的文檔數(shù)據(jù)對(duì)象,即XML數(shù)據(jù)對(duì)象
status:從服務(wù)器返回?cái)?shù)字代碼,比如404(未找到)或200(一切正常)
statusText:與狀態(tài)相關(guān)的文本信息
發(fā)送異步請(qǐng)求的JavaScript程序:

function sendRequest(){
  //獲取頁面表單的文本框name的值
  var user_name = document.getElementById("name").value;

  if ((user_name == null)||(user_name == "")) {
    return;
  }

  xmlHttp = GetXmlHttpRequest();
  if(xmlHttp == null){
    alert("瀏覽器不支持XmlHttpRequest!");
    return;
  }

  var url = "getUserName.php";  //構(gòu)建請(qǐng)求的URL地址
  url = url + "?name=" + user_name;

  xmlHttp.open("GET",url,true); //使用GET方法打開一個(gè)到url的連接,為發(fā)出請(qǐng)求做準(zhǔn)備
  //設(shè)置一個(gè)回調(diào)函數(shù),當(dāng)服務(wù)器完成請(qǐng)求后調(diào)用
  xmlHttp.onreadystatechange = updatePage;
  xmlHttp.send(null);   //發(fā)送請(qǐng)求
}

回調(diào)函數(shù):

function updatePage(){
  if (xmlHttp.readyState == 4) {
    var response = xmlHttp.responseText;
    document.getElementById("userInfo").value = response
  }
}

完整實(shí)例:

//AJAXTest.html
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>ajax應(yīng)用實(shí)例</title>
<script language="javascript">
var xmlHttp = null;

function GetXmlHttpRequest(){
  var xmlHttp = null;
  try{      //創(chuàng)建XMLHttpRequest對(duì)象
    xmlHttp = new XMLHttpRequest();
  }
  catch(e){
    try {
      xmlHttp = new ActiveXObject("Msxm12.XMLHTTP");
    }
    catch (e) {
      try{
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (e) {
        xmlHttp = false;
      }
    }
  }
  return xmlHttp;         //返回XMLHttpRequest對(duì)象
}

function sendRequest(){       //發(fā)送異步請(qǐng)求
  var prov_name = document.getElementById("province").value;

  if ((prov_name == null)||(prov_name == "")) {
    return;
  }

  xmlHttp = GetXmlHttpRequest();
  if (xmlHttp == null) {
    alert("瀏覽器不支持XMLHttpRequest!");
    return;
  }

  var url = "AJAXTest.php";
  url = url + "?prov=" + prov_name;

  xmlHttp.open("GET",url,true);
  xmlHttp.onreadystatachange = updatePage;
  xmlHttp.send(null);
}

function updatePage(){  //處理服務(wù)器響應(yīng)
  if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
    var response = xmlHttp.responseText;
    document.getElementById("city").innerHTML = response;
  }
}

</script>
</head>

<body>
  <h3>請(qǐng)選擇一個(gè)省(自治區(qū)):</h3>

  <form action="AJAXTest.php">
    <div>
      <select id="province" onchange="sendRequest()">
        <option value="">請(qǐng)選擇一個(gè)省(自治區(qū))</option>
        <option value="ah">安徽</option>
        <option value="fj">福建</option>
        <option value="gd">廣東</option>
        <option value="js">江蘇</option>
        <option value="sh">上海</option>
        <option value="ln">遼寧</option>
        <option value="bj">北京</option>
        <option value="hb">河北</option>
        <option value="hn">河南</option>
        <option value="hlj">黑龍江</option>
        <option value="xj">新疆</option>
        <option value="xz">西藏</option>
        <option value="nmg">內(nèi)蒙古</option>
      </select>
    </div>
  </form>

  <div id="city">
  </div>

</body>
</html>

//AJAXTest.php
<?php
$city_arr = array(
  "ah"=>"合肥",
  "fj"=>"福州",
  "gd"=>"廣州",
  "js"=>"南京",
  "sh"=>"上海",
  "ln"=>"沈陽",
  "bj"=>"北京",
  "hb"=>"石家莊",
  "hn"=>"鄭州",
  "hlj"=>"哈爾濱",
  "xj"=>"烏魯木齊",
  "xz"=>"拉薩",
  "nmg"=>"呼和浩特"
);

if (empty($_GET['prov'])) {
  echo '<font color="red">您沒有選擇省(自治區(qū))</font>';
}else{
  $prov = $_GET['prov'];
  $city = $city_arr[$prov];
  echo '所選省(自治區(qū))省會(huì)(首府)為:'.$city;
}
?>

注意:在這個(gè)實(shí)例中,我遇到一些問題,用ajax始終無法響應(yīng),我猜測(cè)可能是html和php文件關(guān)聯(lián)上有問題,存在bug,我沒調(diào)出來。回過頭我再調(diào)。

  • 一個(gè)已經(jīng)實(shí)現(xiàn)AJAX的PHP類——xajax

xajax是一個(gè)開源的PHP類庫,它能綜合HTML、CSS、JavaScript、PHP,輕而易舉就開發(fā)出強(qiáng)大的、基于AJAX的Web應(yīng)用。

下載xajax:官網(wǎng):http://www.xajaxproject.org/

如何在PHP程序中使用xajax:
1>包含xajax庫:require_once("xajax.inc.php");
2>創(chuàng)建xajax對(duì)象:$xajax = new xajax();
3>注冊(cè)需要通過xajax調(diào)用的名稱:$xajax->registerFunction("myFunction");注冊(cè)函數(shù)名為:myFunction
4>編寫注冊(cè)的PHP函數(shù),并且在函數(shù)中使用xajaxResponse對(duì)象創(chuàng)建向?yàn)g覽器端返回的XML指令
5>在PHP程序輸出任何信息之前,調(diào)用xajax用于接管請(qǐng)求:$xajax->processRequests();
6>在頁面的<head></head>標(biāo)簽之間,使用xajax生成實(shí)現(xiàn)AJAX應(yīng)用所必須的JavaScript代碼:$xajax->printJavascript();
7>在程序中,從Javascript時(shí)間或者函數(shù)調(diào)用前面注冊(cè)的函數(shù),例如:<button onclick="xajax_myFunction(SomeArgument);">

實(shí)例:

<?php
require_once("xajax/xajax.inc.php");

$xajax = new xajax();     //實(shí)例化xajax對(duì)象

//$xajax->debugOn();      //打開ajax調(diào)試功能

//注冊(cè)一個(gè)xajax調(diào)用的php函數(shù)名(與JavaScript中的函數(shù)名xajax_showOutput相對(duì)應(yīng))
$xajax->registerFunction("showOutput");

//編寫上面已經(jīng)注冊(cè)的php函數(shù),在此函數(shù)中用xajaxResponse對(duì)象來返回XML指令集
function showOutput(){
  $testResponse = new xajaxResponse();
  $testResponse->addAlert("Hello");

  $testResponse2 = new xajaxResponse();
  $testResponse2->loadXML($testResponse->getXML());
  $testResponse2->addReplace("this","is","a","replacement");
  $testResponseOutput = htmlspecialchars($testResponse2->getXML());

  $objResponse = new xajaxResponse();

  //使用xajaxResponse對(duì)象的addAssign方法添加XML指令
  //該指令將id為submittedDiv的元素的innerHTML屬性更新為$testResponseOutput
  $objResponse->addAssign("submittedDiv","innerHTML",$testResponseOutput);
  return $objResponse;
}

$xajax->processRequest();   //在腳本傳送出任何東西前,xajax都要處理所有請(qǐng)求
?>

<html>
<head>
  <meta http-equiv="content-type" content="text/html";charset="utf-8" />
  <title>xajaxTest</title>
  <?php
  //這代碼使xajax對(duì)象可以生產(chǎn)所必須的JavaScript
  $xajax->printJavascript("xajax/");
  ?>
</head>

<body>
  <!--在這里調(diào)用 -->
  <p><div onclick="xajax_showOutput();">單擊這里顯示響應(yīng)XML</div></p>
  <div id="submittedDiv">這里將被響應(yīng)的XML指令所替換</div>
</body>
</html>

六、PHP 圖像處理


PHP除了開發(fā)Web應(yīng)用,還可以生成圖片或?qū)D片進(jìn)行加工處理
目前主流圖片處理庫:Grafika
GitHub地址:https://github.com/kosinix/grafika/
是基于Imagick和GD,可以用于改變圖片大小,剪裁,比較,添加水印等等功能。還有感知哈希,高級(jí)圖像過濾,繪制貝塞爾曲線等功能,非常強(qiáng)大。
關(guān)于Grafika:可以參考這篇博客,寫的非常完整詳細(xì)。

本章主要講述較底層的GD擴(kuò)展庫的方法和使用:

  • GD擴(kuò)展庫主要函數(shù):

imagecreatefromgif():用來從指定的GIF文件取出圖像
imagegif():創(chuàng)建一個(gè)GIF圖像
imagecreatefrompng():從指定PNG文件取出圖像
imagepng():創(chuàng)建一個(gè)PNG圖像
imagecreate():新建一個(gè)基于調(diào)色板的圖像
imagecreateturecolor():返回一個(gè)黑色圖像的標(biāo)識(shí)符
imagecolorallocate():創(chuàng)建一個(gè)由RGB顏色指定的圖像
imagefill():用指定的顏色填充圖像
imageline():用指定顏色畫出一條線段
imagestring():在圖像上顯示一個(gè)字符串
imagettftext():用TrueType字體向圖像寫入文本
imageSX/imageSY():分別用來去的圖像寬度和高度
imagettfbbox():用來去的使用TrueType字體的文本范圍
imagealphablending():用來設(shè)定圖像的混色模式
imagecopyresized():用來復(fù)制部分圖像并調(diào)整大小
imagecopyresampled():重采賦值部分圖像并調(diào)整大小
getimagesize():獲取圖像屬性

  • 步驟:

1>建立畫布
2>在畫布上繪制形狀或書寫文本
3>輸出最終的圖片
4>清空繪圖資源

  • 圖像的建立:
//1.生成圖像:
<?php
$width = 200;   //寬度
$height = 200;  //高度

$img = imagecreatetruecolor($width,$height)or die("不支持GD圖像處理"); //創(chuàng)建圖像  
imagepng($img);
imagedestory($img);
?>


//2.設(shè)定圖像顏色:
<?php
$width = 200;   //寬度
$height = 200;  //高度

$img = imagecreatetruecolor($width,$height)or die("不支持GD圖像處理"); //創(chuàng)建圖像

$bg_color = imagecolorallocate($img,255,0,0); //設(shè)置圖像標(biāo)識(shí)符所描述圖像的顏色
imagefill($img,0,0,$bg_color);        //改變圖像的顏色

imagepng($img);
imagedestory($img);
?>


//3.在圖像上繪制直線:
<?php
$width = 200;   //寬度
$height = 200;  //高度

$img = imagecreatetruecolor($width,$height)or die("不支持GD圖像處理"); //創(chuàng)建圖像

$line_color = imagecolorallocate($img,255,255,255); //設(shè)置圖像標(biāo)識(shí)符所描述圖像的顏色
imageline($img,0,40,200,40,$line_color);            //繪制直線
imageline($img,0,260,200,260,$line_color);          //繪制直線

imagepng($img);
imagedestory($img);
?>


//4.在圖像上輸出文字:
<?php
$width = 200;   //寬度
$height = 200;  //高度

$img = imagecreatetruecolor($width,$height) or die("不支持GD圖像處理"); //創(chuàng)建圖像

$line_color = imagecolorallocate($img,255,255,255); //設(shè)置圖像標(biāo)識(shí)符所描述圖像的顏色
imageline($img,0,40,200,40,$line_color);            //繪制直線
imageline($img,0,260,200,260,$line_color);          //繪制直線
imagestring($img,5,0,60,"It's time to learn PHP!",$line_color); //顯示文字

imagepng($img);
imagedestory($img);
?>


//5.在圖像中顯示中文字符:
<?php
$width = 200;   //寬度
$height = 300;  //高度

$img = imagecreatetruecolor($width,$height) or die("不支持GD圖像處理"); //創(chuàng)建圖像
$line_color = imagecolorallocate($img,255,255,255);
$font_type = "C://WINDOUS//Fonts//SIMLI.TFF"; //獲取TrueType字體,采用隸書字體

//"西游記"3個(gè)字的16進(jìn)制字符
$cn_char1 = chr(0xE8).chr(0xA5).chr(0xBF);
$cn_char2 = chr(0xE6).chr(0xB8).chr(0xB8);
$cn_char3 = chr(0xE8).chr(0xAE).chr(0xB0);

//"吳承恩著"4個(gè)字的16進(jìn)制字符
$cn_str = chr(0xE5).chr(0x90).chr(0xB4).chr(0xE6).chr(0x89).chr(0xBF).chr(0xE6).chr(0XE6).chr(0X81).chr(0XA9);
$cn_str .=" ".chr(0xE8).chr(0x91).chr(0x97);

imageline($img,0,40,200,40,$line_color);    //繪制直線
imageline($img,0,260,200,260,$line_color);    //繪制直線

//豎排顯示"西游記"3字
imagettftext($img,30,0,10,80,$line_color,$font_type,$cn_char1);
imagettftext($img,30,0,10,120,$line_color,$font_type,$cn_char2);
imagettftext($img,30,0,10,160,$line_color,$font_type,$cn_char3);

//橫排顯示“吳承恩著”4字
imagettftext($img,15,0,90,254,$line_color,$font_type,$cn_str);

imagepng($img);
imagedestroy($img);
?>
  • 圖片的處理:
//1.打開已存在的圖片:
<?php
$img = imagecreatefromjpeg("tower.jpg");  //打開指定的圖片文件

Imagejpeg($img);
Imagedestroy($img);
?>


//2.獲取圖片的相關(guān)屬性:
<?php
$img = imagecreatefromjpeg("tower.jpg");  //打開指定的圖片文件

$x = imageSX($img);
$y = imageSY($img);
echo "圖片tower.jpg的寬為:<b>$x</b> pixels";
echo "<br/>";
echo "<br/>";
echo "圖片tower.jpg的高為:<b>$y</b> pixels";
Imagejpeg($img);
Imagedestroy($img);
?>


//3.對(duì)圖片加水印效果:
<?php
function makeImageWaterMark($image,$pos,$water_text,$font_size,$color){
  $font_type = "C://WINDOWS//Fonts//cour.ttf";

  if (!empty($image) && file_exists($image)) {
    $img_info = getimagesize($image);
    $g_w = $img_info[0];    //取得背景圖片的寬
    $g_h = $img_info[1];    //取得背景圖片的高

    switch($img_info[2]){   //取得背景圖片的格式
        case 1:
            $img = imagecreatefromgif($image);
            break;
        case 2:
            $img = imagecreatefromjpeg($image);
            break;
        case 3:
            $img = imagecreatefrompng($image);
            break;
        default:
            die("圖片格式錯(cuò)誤");
    }
  }
  else{
    die("需要加水印的圖片片不存在!");
  }

  //取得使用 TrueType字體的文本范圍
  $temp = imagettfbbox(ceil($font_size*2.5),0,$font_type,$water_text);
  $w = $temp[2] - $temp[6];
  $h = $temp[3] - $temp[7];
  if (($g_w<$w)||($g_h<$h)) {
    echo "需要加水印的圖片的大小比水印文字區(qū)域小,無法生成水印";
    return;
  }

  //設(shè)置4種水印效果位置:0和默認(rèn)是隨機(jī)位置,1為頂端居左,2為中部居中,3為底端居右
  switch($pos){
    case 0:
        $pos_x = rand(0,($g_w - $w));
        $pos_y = rand(0,($g_h - $h));
        break;
    case 1:
        $pos_x = 0;
        $pos_y = 0;
        break;
    case 2:
        $pos_x = ($g_w - $w)/2;
        $pos_y = ($g_h - $h)/2;
        break;
    case 3:
        $pos_x = $g_w - $w;
        $pos_y = $g_h - $h;
        break;
    default:
        $pos_x = rand(0,($g_w - $w));
        $pos_y = rand(0,($g_h - $h));
        break;
  }

  imagealphablending($img,true);  //設(shè)置圖像混色模式

  if(!empty($color)&&(strlen($color)==7)){
    $R = hexdec(substr($color,1,2));
    $G = hexdec(substr($color,3,2));
    $B = hexdec(substr($color,5));
  }
  else{
    die("水印文字顏色格式不正確!");
  }
  $text_color = imagecolorallocate($img,$R,$G,$B);

  imagettftext($img,$font_size,0,$pox_x,$pos_y,$text_color,$font_type,$water_text);
  switch($img_info[2]){
    case 1:
        imagegif($img,$image);
        break;
    case 2:
        imagejpeg($img,$image);
        break;
    case 3:
        imagepng($img,$image);
        break;
    default:
        die("不被支持格式的圖片!");
  }

  Imagedestroy($img);
}

if(isset($_FILES)&&!empty($_FILES['userfile'])&&$_FILES['userfile']['size']>0){
  $uploadfile = "./".time()."_".$_FILES['userfile']['name'];
  if (copy($_FILES['userfile']['tmp_name'],$uploadfile)) {
    makeImageWaterMark($uploadfile,2,"Photo by Macc",16,"$43042A");
    echo "<img src=\"".$uploadfile."\"border=\"0\">";
  }
  else{
    echo "文件上傳錯(cuò)誤!<br/>";
  }
}
?>

<html>
<head>
<title>GDTest.php</title>
</head>

<body>
  <form enctype="multipart/form-data" method="POST">
    選擇上傳圖片:<input name="userfile" type="file">
    <input type="submit" value="上傳">
  </form>
</body>
</html>


//4.生成已有圖片的縮略圖:
<?php
$img_name = "tower.jpg";
$src_img = imagecreatefromjpeg($img_name);

$ow = imagesx($src_img);    //取得原圖的寬
$oh = imagesy($src_img);    //取得原圖的高

$nw = round($ow*200.0/$ow); //計(jì)算新圖的寬度
$nh = round($oh*200.0/$oh); //計(jì)算新圖的高度

$desc_img = imagecreate($nw,$nh); //建立新圖

imagecopyresized($desc_img,$src_img,0,0,0,0,$nw,$nh,$ow,$oh); //生成縮略圖
imagejpeg($desc_img);

imagedestroy($desc_img);
imagedestroy($src_img);
?>


//5.使用imagecopyresampled函數(shù)做縮略圖:
<?php
$img_name = "tower.jpg";
$percent = 0.2;

$src_img = imagecreatefromjpeg($img_name);

$ow = imagesx($src_img);    //取得原圖的寬
$oh = imagesy($src_img);    //取得原圖的高

$nw = $ow * $percent   //計(jì)算新圖的寬度
$nh = $oh * $percent   //計(jì)算新圖的高度

$desc_img = imagecreate($nw,$nh); //建立新圖

imagecopyresampled($dec_img,$src_img,0,0,0,0,$nw,$nh,$ow,$oh); //生成縮略圖

imagejpeg($desc_img);
imagedestroy($desc_img);
imagedestroy($src_img);
?>
  • 實(shí)例:生成帶有底紋的數(shù)字驗(yàn)證碼圖片
<?php
$img_height = 60;
$img_width = 20;

for ($tmpa=0; $tmpa <4 ; ++$tmpa) {
  $nmsg[$tmpa]=dechex(rand(0,15));    //生成隨機(jī)數(shù),并轉(zhuǎn)成十六進(jìn)制,作為驗(yàn)證碼
}

$aimg = imagecreate($img_height,$img_width);    //生成圖片
imagecolorallocate($aimg,255,255,255);          //圖片底色
$black = imagecolorallocate($aimg,0,0,0);       //定義需要的黑色

//用黑色的矩形把圖片包圍
imagerectangle($aimg,0,0,$img_height-1,$img_width-1,$black);

//下面的代碼生成底紋,其實(shí)就是在圖片上生成的一些符號(hào)
for ($i=0; $i < 100; ++$i) {
  //使用*行號(hào)作為底紋,為了使底紋看起來雜亂無章、五顏六色,需要一個(gè)個(gè)地生成,同時(shí)使位置、顏色、大小都用隨機(jī)數(shù)
  imagestring($aimg,1,mt_rand(1,$img_height),mt_rand(1,$img_width),"*",
  imagecolorallocate($aimg,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
}

//生成驗(yàn)證碼,同樣的道理,驗(yàn)證碼一個(gè)個(gè)地輸出到圖片上,同時(shí)其位置、顏色、大小都用隨機(jī)數(shù)
for($i=0;$i<count($nmsg);++$i){
  imagestring($aimg,mt_rand(3,5),$i*$img_height/4+mt_rand(1,10),mt_rand(1,$img_width/4),
  $nmsg[$i],imagecolorallocate($aimg,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200)));
}

header("Content-type:image/png");
imagepng($aimg);
imagedestroy($aimg);
?>

七、PHP 與 MySQL

Web程序中的各類數(shù)據(jù)需要靠數(shù)據(jù)庫存儲(chǔ),只有在數(shù)據(jù)庫配合的基礎(chǔ)上,PHP才能發(fā)揮其最大功效。

MySQL本身并不是數(shù)據(jù)庫,他只是用來創(chuàng)建、維護(hù)、管理數(shù)據(jù)庫的計(jì)算機(jī)軟件。

1.MySQL數(shù)據(jù)庫的基本操作

//windous 登錄MySQL命令
mysql -u user_name -p password -h host
//退出MySQL
quit
exit

//創(chuàng)建數(shù)據(jù)庫
create database database_name;

//刪除數(shù)據(jù)庫
drop database database_name;

//表的建立
create table Users(
UserId int unsignd not null,
UserName varchar(50) not null,
Gender char(6) not null defaultale',
RegTime date not null;
);
// varchar是變長(zhǎng)字符串,在1-255之間
// char指定長(zhǎng)度,不足空格補(bǔ)

//建立索引:INDEX
create table books(
id int not null,
name varchar(40) not null,
price = decimal(3,2),
index idx(id)
);

//特殊索引,主鍵
create table users(
id int not null primary key,
name varchar(30),
create_time date
);

//查看某個(gè)數(shù)據(jù)庫中所有表的命令
show tables

//查看某個(gè)表的結(jié)構(gòu)
use database
describe table_name

//插入數(shù)據(jù)
insert into users(id,name,created_time) values (1,'MrLiuQ','2017-07-22 10:18:00');
insert into users values(1,'MrLiuQ','2017-07-22 10:18:00');//省略字段名
insert into users set id=2,name='David',create_name='2017-07-22 10:18:00';

//查詢數(shù)據(jù)
SELECT name,created_time AS ct FROM users;

//條件查詢
SELECT *FROM users WHERE name='MrLiuQ';
SELECT *FROM users WHERE created_time>'2017-07-22 10:18:00';
SELECT *FROM users WHERE name='MrLiuQ'->AND created_time>'2017-07-22 10:18:00';
SELECT *FROM users WHERE name='MrLiuQ'->OR created_time>'2017-07-22 10:18:00';

//更新數(shù)據(jù)
UPDATE users SET name'Lily Cameron' WHERE id=3;//成功后,表users中id為3的用戶名被修改為L(zhǎng)ily Cameron

//刪除數(shù)據(jù)
DELETE FROM users WHERE name='Lily Cameron';

//對(duì)查詢結(jié)果做排序
SELECT *FROM users WHERE created_time >'2017-07-22 10:18:00'->ORDER BY id DESC;//ASC表示升序,DESC表示降序。

//對(duì)查詢結(jié)果做分組
SELECT city FROM users GROUP BY city;

//對(duì)查詢結(jié)果做限定
SELECT name,city FROM users ORDER BY name LIMIT 4;//返回前4條信息

2.MySQL的數(shù)據(jù)類型

INT:整數(shù)值。UNSIGNED INT指定無符號(hào)整數(shù)值
DECIMAL:指定數(shù)字值的精度和范圍
REAL:浮點(diǎn)數(shù)值
CHAR:定長(zhǎng)字符類型
VARCHAR:變長(zhǎng)字符串,在1~255之間
TEXT:文本類型
DATE:日期值
TIME:時(shí)間值
DATETIME:MySQL支持,存放日期和日期類型

3.MySQL函數(shù)

COUNT():統(tǒng)計(jì)表中記錄個(gè)數(shù)或這列中值的個(gè)數(shù)
MAX():返回某列中的最大值
MIN():返回某列中的最小值
SUM():指定列的值求和
AVG():計(jì)算指定列的平均值
LENGTH():字符串的長(zhǎng)度
SUBSTRING():截取子字符串
YEAR():返回指定日期的年份
UNIX_TIMESTAMP():返回一個(gè)UNIX時(shí)間戳
DATE_FORMAT():將一個(gè)日期格式化
NOW():返回MySQL服務(wù)器系統(tǒng)的當(dāng)前日期和時(shí)間

//計(jì)算表中總共有多少條記錄
SELECT COUNT(*) FROM users;
//計(jì)算特定值的個(gè)數(shù)
SELECT COUNT(*) FROM users WHERE name LIKE 'J%';

//計(jì)算列最大值
SELECT MAX(salary) AS max_salary FROM emp_salary;

//計(jì)算列最小值
SELECT MIN(salary) AS max_salary FROM emp_salary;

//求和
SELECT SUM(salary) AS total_salary FROM emp_salary;

//求平均
SELECT AVG(salary) AS avg_salary FROM emp_salary;

//字符串長(zhǎng)度
SELECT LENGTH('string in MySQL');

//截取指定長(zhǎng)度字符串
SUBSTRING(string,pos,len);

//獲取一個(gè)UNIX時(shí)間戳
SELECT UNIX_TIMESTAMP() AS timestamp;

//格式化輸出日期
SELECT DATE_FORMAT<created_time,'%Y年%m月%d日'> AS DATE-> FROM users WHERE id=3;

4.用PHP操作MySQL數(shù)據(jù)庫

步驟:
=> 建立數(shù)據(jù)庫的鏈接
=> 選擇要使用的數(shù)據(jù)庫
=> 創(chuàng)建SQL語句
=> 執(zhí)行SQL語句
=> 獲取SQL執(zhí)行結(jié)果
=> 處理數(shù)據(jù)結(jié)果集
=> 關(guān)閉與數(shù)據(jù)庫的鏈接

//連接數(shù)據(jù)庫
mysql_connect(string $server,string $user_name,string $password,[bool $new_link,int $client_type]);
mysql_pconnect(...)  //長(zhǎng)久鏈接
$conn = mysql_connect('locolhost','root','user_pass');

//關(guān)閉數(shù)據(jù)庫
bool mysql_close([resource $link]);

//執(zhí)行SQL語句
mysql_query(string $sql);

//處理查詢結(jié)果集的函數(shù)
mysql_affected_rows();      //取前一次MySQL操作記錄行數(shù)。
mysql_fetch_row($result);  //從查詢結(jié)果集中返回一行數(shù)據(jù)。$result是執(zhí)行mysql_query()之后返回的資源標(biāo)識(shí)符
mysql_fetch_array($result,$type);  //從結(jié)果集中返回一行作為關(guān)聯(lián)數(shù)組
mysql_fetch_assoc($result);        //該函數(shù)只將結(jié)果集作為關(guān)聯(lián)數(shù)組返回

//獲取字段信息
object mysql_fetch_field($result [, int field_offset]);

//選擇一個(gè)數(shù)據(jù)庫
mysql_select_db($database);
//取得結(jié)果集的行目數(shù)
mysql_num_rows($result);
//返回最近一次MySQL操作產(chǎn)生的錯(cuò)誤文本信息
mysql_error();


//PHP程序
<?php
$host = 'localhost';    //定義服務(wù)器
$user_name = 'root';  //定義用戶名
$password = 'admin';  //定義密碼

$conn = mysql_connect($host,$user_name,$password);  //連接MySQL
if(!$conn){
      die('數(shù)據(jù)庫連接失敗:'.mysql_error());
}
mysql_select_db('test');  //連接數(shù)據(jù)庫

$sql = 'select id,name,city from users';  
$result = mysql_query($sql) OR die("<br/>ERROR:<b>".mysql_error()."</b><br/><br/><br/>產(chǎn)生問題的SQL<br/>".$sql);  //獲取查詢結(jié)果


if($result){
    echo 'SQL語句:'.$sql.'<br/>已經(jīng)成功執(zhí)行!';
    $num = mysql_num_rows($result);  //調(diào)用mysql_num_row()獲取SELECT語句查詢
    echo '<br/>該SQL語句查詢到<b>'.$num.'</b>行數(shù)據(jù)';
}

if($num = mysql_num_rows($result))  //判斷SELECT語句查找到的行數(shù)
{
    $row = mysql_fetch_array($result);  //mysql_fetch_array()將結(jié)果集中的一行作為數(shù)組返回
    echo '<pre>';   //格式化輸出
    while($row = mysql_fetch_array($result,MYSQL_ASSOC))
    {
      print_r($row);    //輸出每行數(shù)據(jù)
    }
}

mysql_close($conn);
?>

八、PHP 與 MVC開發(fā)設(shè)計(jì)模式


1.什么是MVC模型?

MVC是Model_View_Control的縮寫,簡(jiǎn)單的講Model是程序的數(shù)據(jù)模型,View是程序的視圖界面,Control是程序的流程控制處理部分。

大部分的操作由Control完成,主要有兩個(gè)動(dòng)作:
1.根據(jù)用戶界面(view)的操作完成對(duì)程序數(shù)據(jù)(model)的更新
2.將程序數(shù)據(jù)(model)的改變及時(shí)反映到用戶界面(view)上

優(yōu)點(diǎn):程序結(jié)構(gòu)更加清晰,代碼穩(wěn)定性更強(qiáng),有利于提高開發(fā)效率,有利于控制開發(fā)速度。

2.MVC模型的核心組成:

1.模型(Model——M):既然是數(shù)據(jù)模型,那么它就攜帶著數(shù)據(jù),通常還會(huì)將業(yè)務(wù)規(guī)則的實(shí)現(xiàn)放進(jìn)模型,這意味著模型不僅僅是數(shù)據(jù)的容器,還是數(shù)據(jù)的監(jiān)控者
2.視圖(View——V):Web而言,視圖就是用戶看到的HTML頁面,從程序角度來說,視圖負(fù)責(zé)生成用戶界面,通常根據(jù)數(shù)據(jù)模型中的數(shù)據(jù)轉(zhuǎn)化成HTML輸出給用戶
3.控制器(Controller——C):負(fù)責(zé)協(xié)調(diào)整個(gè)應(yīng)用程序的運(yùn)轉(zhuǎn),對(duì)于WEB而言,就是接受瀏覽器的請(qǐng)求,并決定調(diào)用哪個(gè)模型構(gòu)件去處理瀏覽器端發(fā)出的請(qǐng)求,然后確定用哪個(gè)視圖來顯示模型處理返回的數(shù)據(jù)。

3.PHP開發(fā)中的模板技術(shù):

在PHP開發(fā)中,模板不可或缺。本節(jié)將首先介紹模板的基本概念和其在PHP程序中的用法,然后一個(gè)優(yōu)秀的模板引擎——Smarty。

  • 什么是模板?
    模板是一組插入了HTML的PHP腳本,或者說是插入了PHP腳本的HTML文件
  • 在PHP程序中使用模板:Demo
//temp.html
<html>
  <head>
    <title>{pagetitle}</title>
  </head>
  <body>
    {greetings}
  </body>
</html>


//temp.php
<?php
$template_file = "temp.html";     //模板文件

$fs = fopen($template_file,"r");  //打開文件
$content = fread($fs,filesize($template_file));   //讀取文件內(nèi)容
fclose($fs);

$content = print_page($content,"pagetitle","模板應(yīng)用");
$page = print_page($content,"greetings","您好,這個(gè)頁面由模板生成");
echo $page;

function print_page($temp_c,$temp_v,$str_c){
  return preg_replace("/\{".$temp_v."\}/",$str_c,$temp_c);
}
?>
  • Smarty模板引擎:
    PHP中有很多模板引擎可供選擇,Smarty是一款易于使用且功能強(qiáng)大的PHP模板引擎
    Demo:
//Smarty.tpl
{* 這里是Smarty模板的注釋*}
<html>
<head>
  <title>{$page_title}</title>
</head>

<body>
大家好,我是{$name}模板引擎,歡迎大家在PHP程序中使用{$name}。
</body>
</html>
{*模板文件結(jié)束*}


//Smarty.php
<?php
include("./Smarty/libs/Smarty.class.php");  //包含Smarty類文件

$smarty = new Smarty();   //建立Smarty類的實(shí)例$smarty
$smarty->template_dir = "./templates";  //設(shè)置模板目錄
$smarty->compile_dir = "./templates_c"; //設(shè)置編譯目錄

$smarty->left_delimiter = "{";    //設(shè)定左右邊界符為{},Smarty推薦使用<{}>
$smarty->right_delimiter = "}";

$smarty->assign("name","Smarty");            //進(jìn)行模板變量替換
$smarty->assign("page_title","Smarty的使用"); //進(jìn)行模板變量替換

$smarty->display("Smarty.tpl");     //編譯并顯示位于./templates下的Smarty.tpl模板
?>

4.其他常見的基于MVC的PHP框架簡(jiǎn)介:

  • Laravel:在國外非常流行,國內(nèi)用的少,適用于大項(xiàng)目。官網(wǎng):http://laravel.com
  • thinkphp:適用于小項(xiàng)目,國產(chǎn),在中國用的比較多。官網(wǎng):http://thinkphp.cn
  • CodeIgniter:適用于中小型項(xiàng)目。一個(gè)小巧、但功能強(qiáng)大的、由PHP編寫的、基于MVC的Web應(yīng)用開發(fā)框架。同時(shí)也是經(jīng)過Apache/BSD-style開源許可授權(quán)的免費(fèi)框架。官網(wǎng):http://codeigniter.org.cn
  • CakePHP:命令行代碼生成工具讓開發(fā)者可以快速生成應(yīng)用程序框架。官網(wǎng):http://www.cakephp.org
  • Zend Framework: PHP官方的框架,由Zend公司負(fù)責(zé)開發(fā)和維護(hù)。官網(wǎng):http://framework.zend.com
  • FleaPHP:一款國產(chǎn)Web開發(fā)框架,官網(wǎng):http://www.fleaphp.org

尾篇:總結(jié)了15天,終于寫完了,存在很多不足,需要去完善
各位大神如果發(fā)現(xiàn)那里寫的不對(duì),可以私信我。
我會(huì)細(xì)心修改,
謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,915評(píng)論 18 139
  • PHP 學(xué)習(xí)目錄 ├─PHP視頻教程 1 LAMP網(wǎng)站構(gòu)建 │ ├─PHP教程 1.1.1 新版視頻形式介紹│ ...
    曹淵說創(chuàng)業(yè)閱讀 16,175評(píng)論 29 417
  • PHP常用函數(shù)大全 usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進(jìn)制字符串對(duì)數(shù)據(jù)進(jìn)行解...
    上街買菜丶迷倒老太閱讀 1,381評(píng)論 0 20
  • 本文原發(fā)于微信公眾號(hào)“小夭書咖”,關(guān)注我們,更多精彩。如若轉(zhuǎn)發(fā),請(qǐng)聯(lián)系作者,就是我啦,嘻嘻( ????? ) 在無...
    慕諼閱讀 349評(píng)論 0 0
  • tomcat的會(huì)話保持方式有三種:1、session sticky:會(huì)話粘滯,通過同一個(gè)客戶端的相關(guān)請(qǐng)求分發(fā)到同一...
    姜餅人_9e7b閱讀 1,988評(píng)論 0 2