国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

技巧:PHP+MYSQL動態網頁編程糾錯指南

2024-07-24 12:56:57
字體:
來源:轉載
供稿:網友


關于數據庫在web編程當中,數據庫的作用已經越來越不容忽視。提到數據庫,應當說php具有非常強大的數據庫支持功能,從filemaker到 oracle,幾乎與所有的數據庫系統都可以實現無縫連接。為了方便本文的講解,我們將主要以mysql為例進行說明。不過對于其它的數據庫應用也同樣適用。

  使用php進行數據庫操作一般需要包括以下語句:

  <?
  $host="localhost";
  $mysql_username="root";
  $mysql_userpass="password";
  $mysql_database="db";
  $query="select * from domain";
  mysql_connect ($host, $mysql_username, $mysql_userpass);
  mysql_select_db ($mysql_database);
  $result_id=mysql_query ($query);
  while ($result=mysql_fetch_row($result_id)){
  print ------------------<br>;
  print "$result[0]<br>";
  print "$result[1]<br>";
  print "$result[2]<br>";
  print "$result[3]<br>";
  print -------------------<br>;
  }?>

  基本步驟包括建立與mysql數據庫的連接,選擇數據庫操作對象,然后執行查詢語句。對于在上述過程中出現的錯誤的提示信息一般來說都能夠較為準確和詳細的描述所出現的問題。例如,“connection failed due to a bad username”錯誤報告就清楚的指出由于用戶名錯誤而導致與數據庫的連接失敗。

  我們可以對以上所提到的這些函數的返回值加以利用,從而減少出現不必要的麻煩。例如,mysql_connect函數在連接成功時會返回一個連接id標識,如果連接失敗則發出錯誤提示。對此,我們可以進行如下利用:

  if (!mysql_connect (’localhost’, ’root’, ’password’)){
  print "cannot connect to mysql<br>";
  exit;
  }

  當與數據庫的連接出現問題時,我們可以輸出錯誤提示,并終止程序的執行。從長遠來看,這是一項非常好的防范措施。以此方式,我們重新編寫腳本如下:

  <?
  $host="localhost";
  $mysql_username="root";
  $mysql_userpass="password";
  $mysql_datab ="db";
  $query="select * from domain";
  if (!mysql_connect ($host, $mysql_username, $mysql_userpass)){
  print "cannot connect to mysql: ".mysql_error();
  exit;
  }
  if (!mysql_select_db ($mysql_database)){
  print "cannot select db<br>";
  exit;
  }
  if (!$result_id=mysql_query ($query)){
  print "query error: ".mysql_error();
  exit;
  }
  while ($result=mysql_fetch_row($result_id)){
  print ------------------<br>;
  print "$result[0]<br>";
  print "$result[1]<br>";
  print "$result[2]<br>";
  print "$result[3]<br>";
  print -------------------<br>;
  }?>

  這樣,當程序出現問題時,我們就可以立刻找到錯誤的根源,從而能夠做到有的放矢。

  接下來,我們就可以對數據庫進行查詢。不過,很多時候,當我們運行編寫好的查詢語句時,卻得不到任何返回數據。到底是什么地方出錯了呢?最好的解決方法是把sql語句賦予一個變量,例如:

  <?
  ....
  $sql="select * from $tablename where $columnname > $limit";
  $result_id=mysql_query($query);
  ...?>

  然后當出現問題時,使用“print”或“echo”命令顯示該語句。注意檢查$columnname和$limit的拼寫是否正確,是否無意當中創建了新的變量。使用輸出顯示的方法可以很容易的找到并解決拼寫錯誤的問題。但是如果我們將sql語句顯示出來之后仍然沒有找到明顯的錯誤該怎么辦呢?這里我們可以把輸出的語句粘貼到象mysql命令行接口這樣的命令行工具中,看一看是否能夠返回數據。如果還是無法解決問題,就應該查看一下所使用帳號的用戶權限。

  如今,我們可以使用許多免費提供的類完成絕大部分的數據庫操作。php classes(http://phpclasses.upperdesign.com/)上就有許多相關的信息,可以供有興趣的用戶參考。其中, metabase能夠提供不依賴某種數據庫系統的查詢和管理。如果用戶正在同時使用幾種不同的數據庫系統,或者希望自己的程序能夠移植到其它的數據庫平臺上的話,可以留意一下metabase的使用。

  注意事項最后,我們把使用php進行編程的過程中所應當注意的一些問題進行一下匯總,希望能夠對大家有所幫助。

  1.檢查(),[],以及{}等符號,看看是否成對出現。
  2.檢查字符串,注意如果要想在“”當中再使用“”的話,必須使用轉義符“/”。
  3.檢查保留關鍵字的拼寫是否正確。例如,myslq_num_rows()應當改為mysql_num_rows。
  4.對照php用戶手冊(www.php.net/manual),檢查程序的語法是否正確。
  5.如果在函數中使用全局變量,一定不要忘了進行變量聲明。
  6.如果希望使用setcookie()函數設置cookie信息,一定要確保在此之前沒有輸出任何字符,包括在“<?”或“<?php”之前不能有任何空格。“<?”必須作為程序的第一行。
  7.如果數據庫查詢操作失敗,使用echo或print寫出查詢語句,檢查語法是否正確,特別應當注意語句中出現的變量。
  8.如果sql語句沒有明顯問題,可以嘗試著使用數據庫系統所提供的命令行接口。
  9.如果問題仍然沒有解決,應當檢查是否具有足夠的數據庫訪問權限。
  10.如果出現“can’t redeclare foo()”錯誤,表明用戶可能把同一個文件引用了兩次。可以使用include_once()函數避免出現這一問題。
  11.注意區分大小寫。例如,$foo和$foo是兩個不同的變量。
  12.注意數組的正確使用格式。例如:$this->$foo()和$this->$variable應當分別改為$this->foo()和$this->variable。

分號的使用正象我們平時寫文章時必須要在每一句話的結尾處加上句號一樣,php要求程序中的每一條語句都必須使用分號“;”結束。這是一條最基本的語法規則,但是同時也最容易出現問題。我們在編寫程序時,很少會一行一行的檢查是否漏掉了分號,但是一旦出現任何一處疏忽,解析程序就回立刻發出錯誤報告。有時,報告中可能會包含出現問題的語句行數。

  <?
  $output="hello world";
  echo $output
  $other="blah";
  print $somemoretext;
  ?>

  上述代碼的第二行“echo $output”的結尾處我們漏掉了一個分號,如果執行該腳本將會產生如下錯誤提示:

  parse error: parse error, expecting `’,’’ or `’;’’ in /usr/local/apache/htdocs/test.php on line 8報告雖然指出了出現錯誤的原因,即漏掉了逗號“,”或分號“;”,但是卻將出現問題的語句定在了第八行。因為這段代碼非常簡單,我們很容易就可以找到真正出現錯誤的地方。但是,如果程序非常復雜時,要想順利的找出錯誤就有些困難了。

  根據筆者以往的經驗,建議采用以下方法:

  如果當錯誤報告中指出的語句沒有明顯的問題時,可以檢查位于該語句之前的其它指令行(不包括注釋行)是否正確。如果仍然沒有找到錯誤,可以將報告中指出的語句行注釋掉(在該語句行的最前面加上“//”或“#”注釋符號)或者改為用戶能夠確保完全沒有問題的其它語句。之后,重新運行程序,如果錯誤提示仍然指向同一行,就表明真正有問題的語句應當位于被注釋掉的語句行的前面。按照上述方法逐一檢查位置靠前的每一行指令,直到錯誤提示信息發生改變。這時,我們就成功的挖出了真正的罪魁禍首。

  變量的問題與其它編程語言要求用戶顯式聲明變量不同,php語言允許用戶自動使用所有變量而不必進行事先的聲明。變量名稱的拼寫錯誤成為困擾php用戶的一個大問題。

  <?
  function combine ($firsthalf, $secondhalf)
  {
   $combined_string=$firsthalf.$secondhalf;
   return $combined_string;
  }
  $firststring="wdvl - ";
  $secondstring="illustrated encyclopedia";
  $combine_result=combine ($firststring, $secondstring);
  print $combined_result;
  ?>

  當我們運行以上腳本時,將會看到由于程序沒有返回任何數據而出現的錯誤提示。這里,我們為了更好的說明問題選擇了一個非常直觀的例子。在現實當中,有時問題并不會這么簡單。相信大家都已經找到了出現問題的原因,那就是“print $combined_result;”中的變量名稱“$combined_result”應當改為“$combine_result”。
事實上,腳本中任何一處出現的拼寫錯誤都會導致同樣的問題。如果用戶懷疑自己的程序中有拼寫錯誤的話,一個非常好的檢查方法就是在變量的前后顯示文字信息。例如:

   print “the combined result is: |”.$combined_result.“|”;

按照上述方法替換輸出語句的腳本重新執行之后的結果如下:

   the combined result is: ||

 其中,在兩個管道符號“|”之間沒有任何內容。按照這種方法,我們就可以在程序中找到出現問題的變量。

下面,我們再舉一個更加復雜的例子進行說明。

現在,很多網絡應用都需要對用戶的身份進行驗證。一個最簡單的實現腳本可以如下:

<?
 $password=“secret”;
 $name=“admin”;
 function verifypassword ($userpassword, $username){
  if ($password=$userpassword && $name=$username){
   return 1;
  }
  else { return 0;}
 }
 if (verifypassword (“foo1ish”,“admin”)){
  print “the password is correct”;
 }
 else {
  print “i’m sorry, the password is incorrect”;
 }
?>

雖然在上述腳本中調用verifypassword函數時輸入的是錯誤的密碼,但是程序運行之后仍然會產生如下結果:

   the password is correct

  問題可能會出現在任何地方,下面就讓我們使用排除法一一檢查。首先,我們很難確定腳本最后的“if”條件語句是否正確。雖然看上去好象是沒有問題,但是為了確保程序正確無誤,我們不能放過任何一個環節。因此,我們將該條件語句注釋掉,同時按照前面介紹的方法對verifypassword()函數進行輸出。具體如下:

<?
 $password=“secret”;
 $name=“admin”;
 function verifypassword ($userpassword, $username){
  if ($password=$userpassword && $name=$username){
   return 1;
  }
  else { return 0;}
 }
 print “the result of verifypassword() is:”;
 print verifypassword (“foo1ish”, “admin”);
 /*if (verifypassword (“foo1ish”, “admin”)){
  print “the password is correct”;
 }
 else {
  print “i’m sorry, the password is incorrect”;
 }*/
?>

  因為我們使用了錯誤的密碼,所以結果應當為0。但是程序運行之后,我們發現實際結果如下:

   the result of verifypassword() is: 1

  這樣,我們就知道問題是出現在verifypassword()函數的身上。檢查了一遍函數之后,我們懷疑問題可能出現在“if”語句中。所以我們屏蔽到verifypassword()函數中的條件語句,并進行如下輸出:

 print “userpassword => $userpassword, password => $password,”;
 print “password==userpassword => ”.(int)($password==$userpassword).“<br>”;
 print “username => $username, name => $name, ”;
 print “name==username =>”.(int)($name==$username).“<br>”;

(說明:我們使用(int)($password==$userpassword)語句將比較結果轉化為整數0或1)

程序修改之后的實際輸出結果如下:

userpassword => foo1ish, password => , password==userpassword => 0
username => admin, name => , name==username => 1
i’m sorry, the password is incorrect

  這里,我們可以清楚的看出password和name兩個變量都是空值,也就難怪判斷語句不起作用了。

  那么為什么$password為空值呢?我們在程序的開頭部分就已經明確的對$password變量進行了賦值,但是因為某種原其變量值無法帶入到verifypassword()函數中。回想一下php語言關于變量作用域的規定,我們可以立刻找到出現問題的原因,那就是如果要想在函數中使用變量,必須將該變量聲明為全局變量。知道了錯誤的根源之后,我們在verifypassword()函數的第一行加入以下語句,然后重新運行程序:

global $password, $name;

程序運行結果如下:

userpassword => foo1ish, password => secret, password==userpassword => 0
username => admin, name => admin, name==username => 1
the password is correct

  為什么?按理說我們應當得到密碼不正確的錯誤提示。再一次仔細檢查遍程序之后,終于發現原來我們把邏輯運算符“==”誤用成“=”,這樣就把$userpassword變量的值賦給了$password變量。把最后的這兩處錯誤改正過來之后,完成的程序如下:

<?
 $password=“secret”;
 $name=“admin”;
 function verifypassword ($userpassword, $username){
  global $password, $name;
  if ($password==$userpassword && $name==$username){
   return 1;
  }
  else { return 0;}
 }
 if (verifypassword (“foo1ish”, “admin”)){
  print “the password is correct”;
 }
 else {
  print “i’m sorry, the password is incorrect”;
 }
?>

執行程序得到如下結果:

  i’m sorry, the password is incorrect.

輸入正確密碼重新運行時,得到以下結果:

  the password is correct

這樣,我們就成功的找到并解決了問題。希望大家能夠從以上的介紹中領悟到查找錯誤時的一些方法和思路。

  關于數據庫在web編程當中,數據庫的作用已經越來越不容忽視。提到數據庫,應當說php具有非常強大的數據庫支持功能,從filemaker到oracle,幾乎與所有的數據庫系統都可以實現無縫連接。為了方便本文的講解,我們將主要以mysql為例進行說明。不過對于其它的數據庫應用也同樣適用。

  使用php進行數據庫操作一般需要包括以下語句:

  <?
  $host="localhost";
  $mysql_username="root";
  $mysql_userpass="password";
  $mysql_database="db";
  $query="select * from domain";
  mysql_connect ($host, $mysql_username, $mysql_userpass);
  mysql_select_db ($mysql_database);
  $result_id=mysql_query ($query);
  while ($result=mysql_fetch_row($result_id)){
 print "------------------<br>";
  print "$result[0]<br>";
  print "$result[1]<br>";
  print "$result[2]<br>";
  print "$result[3]<br>";
  print "-------------------<br>";
  }?>

  基本步驟包括建立與mysql數據庫的連接,選擇數據庫操作對象,然后執行查詢語句。對于在上述過程中出現的錯誤的提示信息一般來說都能夠較為準確和詳細的描述所出現的問題。例如,“connection failed due to a bad username”錯誤報告就清楚的指出由于用戶名錯誤而導致與數據庫的連接失敗。

  我們可以對以上所提到的這些函數的返回值加以利用,從而減少出現不必要的麻煩。例如,mysql_connect函數在連接成功時會返回一個連接id標識,如果連接失敗則發出錯誤提示。對此,我們可以進行如下利用:

  if (!mysql_connect (’localhost’, ’root’, ’password’)){
  print "cannot connect to mysql<br>";
  exit;
  }

  當與數據庫的連接出現問題時,我們可以輸出錯誤提示,并終止程序的執行。從長遠來看,這是一項非常好的防范措施。以此方式,我們重新編寫腳本如下:

  <?
  $host="localhost";
  $mysql_username="root";
  $mysql_userpass="password";
  $mysql_database="db";
 $query="select * from domain";
  if (!mysql_connect ($host, $mysql_username, $mysql_userpass)){
  print "cannot connect to mysql: ".mysql_error();
  exit;
 }
  if (!mysql_select_db ($mysql_database)){
  print "cannot select db<br>";
  exit;
  }
  if (!$result_id=mysql_query ($query)){
  print "query error: ".mysql_error();
  exit;
  }
  while ($result=mysql_fetch_row($result_id)){
  print "------------------<br>";
  print "$result[0]<br>";
  print "$result[1]<br>";
  print "$result[2]<br>";
  print "$result[3]<br>";
  print "-------------------<br>";
  }?>

  這樣,當程序出現問題時,我們就可以立刻找到錯誤的根源,從而能夠做到有的放矢。

  接下來,我們就可以對數據庫進行查詢。不過,很多時候,當我們運行編寫好的查詢語句時,卻得不到任何返回數據。到底是什么地方出錯了呢?最好的解決方法是把sql語句賦予一個變量,例如:

  <?
  ....
  $sql="select * from $tablename where $columnname > $limit";
  $result_id=mysql_query($query);
  ...?>

  然后當出現問題時,使用“print”或“echo”命令顯示該語句。注意檢查$columnname和$limit的拼寫是否正確,是否無意當中創建了新的變量。使用輸出顯示的方法可以很容易的找到并解決拼寫錯誤的問題。但是如果我們將sql語句顯示出來之后仍然沒有找到明顯的錯誤該怎么辦呢?這里我們可以把輸出的語句粘貼到象mysql命令行接口這樣的命令行工具中,看一看是否能夠返回數據。如果還是無法解決問題,就應該查看一下所使用帳號的用戶權限。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 维西| 井研县| 贵定县| 图木舒克市| 逊克县| 安阳市| 新营市| 方城县| 正阳县| 甘肃省| 固阳县| 德阳市| 马边| 崇文区| 金塔县| 安吉县| 哈巴河县| 九龙城区| 巴林右旗| 南和县| 白水县| 巨野县| 阿拉善左旗| 中山市| 辽阳县| 沅江市| 绍兴县| 四子王旗| 兴宁市| 游戏| 贵德县| 宜昌市| 黄陵县| 灵川县| 遂溪县| 梅州市| 灯塔市| 瑞安市| 思南县| 凤城市| 潜江市|