技巧:PHP+MYSQL动态网页编程纠错指南

关于数据库在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命令行接口这样的命令行工具中,看一看是否能够返回数据。如果还是无法解决问题,就应该查看一下所使用帐号的用户权限。

时间: 2024-09-05 14:19:12

技巧:PHP+MYSQL动态网页编程纠错指南的相关文章

PHP+MYSQL动态网页编程纠错指南

关于数据库在WEB编程当中,数据库的作用已经越来越不容忽视.提到数据库,应当说PHP具有非常强大的数据库支持功能,从FileMaker到 Oracle,几乎与所有的数据库系统都可以实现无缝连接.为了方便本文的讲解,我们将主要以MySQL为例进行说明.不过对于其它的数据库应用也同样适用. 使用PHP进行数据库操作一般需要包括以下语句: <? $Host="localhost"; $MySQL_UserName="root"; $MySQL_UserPass=&q

动态网页编程:JSP入门学习教程

js|编程|动态|教程|网页 一. 什么是JSP JSP(JavaServer Pages)是由Sun Microsystems公司倡导.许多公司参与一起建立的一种 动态网页技术标准,其网址为http://www.javasoft.com/products/jsp. 在传统的网页HTML文件(*htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(*.jsp).Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片段,然后将执行结果

学习ASP动态网页编程技术很有用的代码

编程|动态|网页 1.数据库连接. ASP与Access数据库连接: <%@ language=VBscript%> <% dim conn,mdbfile mdbfile=server.mappath("数据库名称.mdb") set conn=server.createobject("adodb.connection") conn.open "driver={microsoft access driver (*.mdb)};uid=a

ASP动态网页编程的19个基本技巧

编程|动态|技巧|网页 1. 现在的日期时间命令是<%=now%> 即可 2.ASP取得表格(from)数据输入的方法,是使用一个内置的对象(object)-Requect,它以get,post而异. 3.若要自己用VB或其它语言编写,.dll文件供ASP使用需将DLL文件注册方可:DOS下输入 regsbr32 *.dll 4.显示五个重复的句子,字体越来越大<% for i=1 to 5 %><font size=<% =i %> color=#00ffff&

PHP动态网页编程常用技巧四则

1.配置PHP文件目录 作为服务器端解释执行的脚本语言,PHP程序放置在某个服务器可以访问的目录下,一般可以通过修改Apache的httpd.conj进行配置,例如我们在该文件中的一句: Alias /test/ "d:/phpwebsite/php/" 那么在浏览器端输入:"http://localhost/test/+PHP文件名"就可以访问d:/phpwebsite/php/下的PHP文件了:可见该行不过是为存放PHP文件的目录起一个别名. 其次,还可以通过指

动态网页编程中优化数据库注意的十大原则

与没有数据库的网站相比,数据库的存取会降低你的系统性能.但是大多数情况下,网站和数据库有密不可分的关系,正是数据库给站点提供了大容量.多样性.个性化等特色,并实现了很多特殊的功能. 1不要忘记给数据库做索引.合理的索引能立即显著地提高数据库整个系统的性能.可以参考有关SQL性能调试书 籍,学会根据所需查询方式合理制作索引和根据索引方式改进查询语句. 2在适当的情况下,尽可能的用存储过程而不是SQL查询,因为前者已经过了预编译,运行速度更快.同时让数据库仅仅返回你所需要的那些数据,而不是返回大

PHP技巧:优化动态网页技术PHP程序的12条技巧

1.If a method can be static, declare it static. Speed improvement is by a factor of 4. 1.如果一个函数可以声明为静态的,那么就用静态的,速度是改进的一个因素4. 2.# Avoid magic like __get, __set, __autoload 2.避免使用__get, __set, __autoload等魔术函数 3.require_once() is expensive 3.require_onc

PHP动态网页编程:include()与require()的对比

php的require()性能与include()相类似. 不同之处在于,对include()来说,在include()执行时文件每次都要进行读取和评估:而对于require()来说,文件只处理一次(实际上,文件内容替换了require()语句). 这就意味着如果有包含这些指令之一的代码和可能执行多次的代码,则使用require()效率比较高.另一方面,如果每次执行代码时相读取不同的文件,或者有通过一组文件叠代的循环,就使用include(),因为可以给想要包括的文件名设置一个变量,当参数为in

第一章 容错机制 &amp;lt;&amp;lt;高质量动态网页技术编程指南(草稿)&amp;gt;&amp;gt;

第一章 容错机制 以国内最流行ASP为例,我不知道有多少人会在写代码时想到"容错"这个概念,实际上当我遇到这种事时,也是不了了之.为什么呢,想想最初的意思是认为写如下代码就能容错了,见示例1-1. <%@ Language=VBScript %><%option explicit%><%'出错过滤on error resume next-----(代码略)%> 示例1-1 常见代码一瞥以上代码就经常出现在各位同仁的手中,不用说出个中原因,我完成能理解