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

 更新时间:2016年11月25日 16:40  点击:1938

关于数据库在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.检查字符串,注重假如要想在“”当中再使用“”的话,必须使用转义符“”。

在Soundbreak我们天天24小时不间断之播放实况音频和视频,所以对于MySQL之新增之复制特性,我们不能做出很令人信服之测试。通过测试我们发现,可以使用这个特性来与备份数据库服务器保持数据同步,这样当主服务器因为某种原因处理失效时,能够使用备份机处理所有之查询。对于这样之要求,配置两台服务器并不困难。我将具体讨论整个处理过程,同时讨论一下当主服务器失效时,如何使用PHP来重定向查询。

  MySQL内部复制功能是建立在两个或两个以上服务器之间,通过设定它们之间之主-从关系来实现之。其中一个作为主服务器,其它之作为从服务器。我将具体讨论如何配置两台服务器,将一个设为主服务器,另一个设为从服务器。并且描述一下在它们之间进行切换之处理过程。我是在MySQL之3.23.23版本上进行之配置设置过程,并且也是在这个版本上进行之测试。MySQL开发人员建议最好使用最新版本,并且主-从服务器均使用相同之版本。同时MySQL 3.23版本仍然是beta测试版,而且这个版本可能不能向下兼容。所以因为这个原因,在实际之网站中,我现在还没有使用这个版本。拥有容错能力具有一个好处是,在不需中断任何查询之情况下,对服务器进行升级。

第一步:配置主服务器
  在这篇文章之剩下篇幅中,我将指定两台服务器。A(IP为10.1.1.1)作为主服务器(简称为主机)。B(IP为10.1.1.2)作为后备服务器(简称为备机)。

  MySQL之复制功能之实现过程为:备机(B)与主机(A)连接,然后读出主机之二进制更新日志,再将发生之变化合并到自已之数据库中。备机需要一个用户帐号来与主机连接,所以在主机上创建一个帐号,并只给它FILE权限,如下操作:

GRANT FILE ON *.* TO replicate@10.1.1.2 IDENTIFIED BY password;

  为了备机能够与主机连接,要在主机上运行FLUSH PRIVILEGES,不过不要担心,因为我们将在下面之步骤中停掉服务器。

  现在我们需要主机数据库之一个快照,并且对主机进行配置,答应生成二进制之更新日志。首先编辑my.cnf文件,以便答应二进制更新日志,所以在[mysqld]部分之下面某个之方增加一行:log-bin。在下一次服务器启动时,主机将生成二进制更新日志(名为:<主机名>-bin.<增量序号#>)。为了让二进制更新日志有效,关闭MySQL服务程序,然后将主机上之所有数据库目录到另一个目录中,接着重新启动mysqld。
请确定得到了所有数据库,否则在进行复制时,假如一个表在主机上存在但在备机上不存在,将因为出错而退出。现在你已经得到了数据之快照,和一个从建立快照以来之二进制日志,上面记录着任何对数据库之修改。请注重MySQL数据文件(*.MYD,*.MYI和*.frm)是依靠于文件系统之,所以你不能仅仅进行文件传输,如从Solaris到Linux。假如你处于一个异种之服务器环境,你将不得不使用mysqldump实用程序或其它之定制脚本来得到数据快照。

第二步:配置备机
  让我们继续。停掉备机上之MySQL服务程序,并且把从主机上拷贝来之数据库目录移到备机上之data目录下。请确认将目录之拥有者和属组改变为MySQL用户相应值,并且修改文件模式为660(只对拥有者和属组可读、可写),目录本身为770(只对拥有者和属组可读、可写和可执行)。

  继续。在备机上启动MySQL服务程序,确认MySQL工作正常。运行几个select查询(不要update或insert查询),看一看在第一步中得到之数据快照是否成功。接着,在测试成功后关掉MySQL服务程序。

  在备机上配置需要访问之主机,以便接收主机之更改。所以需要编辑务机上之my.cnf文件,在[mysqld]部分中增加下面几行:

master-host=10.1.1.1
master-user=replicate
master-password=password

  在启动备机服务程序后,备机服务程序将查看在my.cnf文件中所指定之主机,查看是否有改变,并且将这些改变合并到自已之数据库中。备机保持了主机之更新记录,这些记录是从主机之master.info文件中接收下来之。备机线程之状态可以通过sql命令SHOW SLAVE-STATUS看到。在备机上处理二进制日志中假如
发生错误,都将导致备机线程之退出,并且在*.err之日志文件中生成一条信息。然后错误可以被改正,接着可以使用sql语句SLAVE START来重新启动备机线程。线程将从主机二进制日志处理中断之之方继续处理。

  至此,在主机上所发生之数据改变应该已经复制到备机上了,要测试它,你可以在主机上插入或更新一条记录,而在备机上选择这条记录。

  现在我们拥有了从A机到B机之这种主-从关系,这样当A机可能当机之时候,答应我们将所有之查询重定向到B机上去,但是当A机恢复时,我们没有办法将发生之改变恢复到A机中去。为了解决这个问题,我们创建从B机到A机之主-从关系。

第三步:创建相互之主从关系
  首先在B机上之my.cnf文件中,在[mysqld]部分中加入log-bin,接着重新启动mysqld,然后创建可在它之上面执行复制功能之用户帐号,使用:

GRANT FILE ON *.* TO replicate@10.1.1.1 IDENTIFIED BY password;

  在B机上运行FLUSH PRIVILEGES命令,以便装入在加入复制用户后之新之授权表,接着回到A机上,在它之my.cnf中加入下面几行:

master-host=10.1.1.2
master-user=replicate
master-password=password

  在重启A机之服务程序之后,现在我们一拥有了在A机与B机之间之相互主-从关系。不管在哪个服务器上更新一条记录或插入一条记录,都将被复制到另一台服务器上。要注重之是:我不敢确定一个备机合并二进制日志变化之速度有多快,所以用这种方法来进行插入或更新语句之负载平衡可能不是一个好办法。

第四步:修改你之数据库连接程序
  既然你已经在A机和B机之间建立了一个相互之关系,你需要修改数据库连接程序,以便从这种方式中得到好处。下面之函数首先试图与A机连接,假如不能建立连接则与B机连接。


/********************************************************
function db_connect()



returns a link identifier on success, or false on error
********************************************************/
function db_connect(){
$username = "replUser";
$password = "password";

#这是我的MySql数据的配置
#本文中我的用计算机的mysql数据库安装目录是“d:webservermysql”
#我的数据库目录是“f:sun datamysql data”
#我的计算机的IP地址为192.168.0.2假如是公网IP也是一样
#[mysqld]部分为mysql的环境配置部分
#[WinMySQLadmin]为数据库启动部分
[code]到[/code]之间的为配置环境变量及事务处理数据库的部分

#本文中使用"#"的部分为注释行正文部分带有“#”的为可选的,可以打开

#本文参考了部分mysql的阅读文件。

[mysqld]
basedir=d:/webserver/mysql
#bind-address=192.168.0.2
datadir=F:/Sun Date/mysql data/
#language=d:/webserver/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
[WinMySQLadmin]
Server=d:/webserver/mysql/bin/mysqld-max-nt.exe
user=启动数据库的用户名
password=启动数据库的密码
[code]
innodb_data_file_path = ibdata1:1000M;ibdata2:1000M
innodb_data_home_dir = d:webservermysqlibdata
set-variable = innodb_mirrored_log_groups=1
innodb_log_group_home_dir = d:webservermysqliblogs
innodb_flush_log_at_trx_commit=1
innodb_log_arch_dir = d:webservermysqliblogs
innodb_log_archive=0
set-variable = innodb_buffer_pool_size=80M
set-variable = innodb_additional_mem_pool_size=10M
set-variable = innodb_file_io_threads=4
set-variable = innodb_lock_wait_timeout=50
set-variable = innodb_log_files_in_group=3
set-variable = innodb_log_file_size=30M
set-variable = innodb_log_buffer_size=8M
#set-variable = key_buffer=16M
[/code]

以下是在Linux下通过Apache PHP对Mysql数据库的备份的文件代码:

文件一、Listtable.php (文件列出数据库中的所有表格,供选择备份)

<html>
<head>
<title>
使用XML备份Mysql数据库</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000">
请选择要备份的表格:
<?
$con=mysql_connect('localhost','root','xswlily');
$lists=mysql_list_tables("embed",$con);
//数据库连接代码
$i=0;
while($i<mysql_num_rows($lists)){
$tb_name=mysql_tablename($lists,$i);
echo "<a href=backup.php?table=".$tb_name.">".$tb_name."</a>
";
//列出所有的表格
$i ;}

?>
</body>
</html>


文件二、Backup.php

<?if ($table=="") header("Location:listtable.php");?><html>
<head>
<title>
使用XML备份Mysql数据库</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<?
$con=mysql_connect('localhost','root','xswlily');
$query="select * from $table ";
//数据库查询
$result=mysql_db_query("embed",$query,$con);
$filestr="<"."?xml version="1.0" encoding="GB2312"?".">";
$filestr.="<".$table."s>";
while ($row=mysql_fetch_array($result))
//列出所有的记录
{$filestr.="<".$table.">";
$fields=mysql_list_fields("embed",$table,$con);
$j=0;
//$num_fields=mysql_field_name($fields,$j);
//echo $num_fields;
while ($j<mysql_num_fields($fields)){
$num_fields=mysql_field_name($fields,$j);
$filestr.="<".$num_fields.">";
$filestr.=$row[$j];
$filestr.="</".$num_fields.">";
$j ;}
$filestr.="</".$table.">";
}
$filestr.="</".$table."s>";
echo $filestr;
//以下是文件操作代码
$filename=$table.".xml";
$fp=fopen("$filename","w");
fwrite($fp,$filestr);
fclose($fp);
Echo "数据表".$table."已经备份成功!";?>
</body>
</html>

通过以上文件的操作就可以实现对数据库中选定的表格进行备份.

以上主要介绍了通过PHP实现XML备份数据库的操作方法,其实并不复杂,通过XML,我们可以备份各种各样的数据库,当然也可以通过相关的方法将备份的XML文档恢复到数据库中,这里就不具体描述了。

通过PHP连接MYSQL数据库


$conn = mysql_connect("localhost","root","password") or die("无法连接数据库");
mysql_select_db("table" ,$conn) or die ("找不到数据源");


-----------------------------------------------------------------------
通过PHP创建MYSQL数据库

$conn = mysql_connect("localhost","root","password") or die("无法连接数据库");
mysql_create_db("webjx") or die("无法创建数据库");
$sqlstr = "create database other_webjx";
mysql_query($sqlstr) or die("无法创建,一般请检查权限什么的");

----------------------------------------------------------------------------
创建mysql的表

$conn = mysql_connect("localhost","root","password") or die("无法连接数据库");
mysql_select_db("webjx",$conn) or die("无法连接数据库webjx");
$sql = "create table webjx_table(
ids integer not null auto_increment ,
primary key(ids)
)";
$mysql_query($sql) or die(mysql_error());

[!--infotagslink--]

相关文章

  • ps动态环绕动画效果怎么制作

    ps动态环绕动画效果是现在很多人都非常喜欢的,大多数人还不知道ps动态环绕动画效果怎么制作下面文章就给大家介绍下ps怎么制作科技感十足的动态环绕动画效果,一起来看看...2017-07-06
  • vue 实现动态路由的方法

    这篇文章主要介绍了vue 实现动态路由的方法,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-06
  • Vue实现动态查询规则生成组件

    今天我们来给大家介绍下在Vue开发中我们经常会碰到的一种需求场景,本文主要介绍了Vue动态查询规则生成组件,需要的朋友们下面随着小编来一起学习学习吧...2021-05-27
  • jQuery动态添加与删除tr行实例代码

    最近由于项目的需要,需要动态的添加和删除table中的tr,感觉用JS可以实现,但是在网上找了一下,单纯的自己写JS,感觉太麻烦,而且也不好维护。于是想到了最近学的jQuery。这篇文章给大家用实例介绍了jQuery动态添加与删除tr行的方法,有需要的朋友们可以参考借鉴。...2016-10-20
  • C#中动态显示当前系统时间的实例方法

    想在网页中动态地显示当前系统的时间,找了好多,不过都是一些停在那里不动的。。。不过皇天不负有心人,终于让我找到了...2020-06-25
  • 浅谈node.js中async异步编程

    1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。示例: for (var i = 1; i <= 3; i++) {setTimeout(functi...2015-10-23
  • c#动态调用Webservice的两种方法实例

    这篇文章介绍了c#动态调用Webservice的两种方法实例,有需要的朋友可以参考一下...2020-06-25
  • c# socket网络编程接收发送数据示例代码

    这篇文章主要介绍了c# socket网络编程,server端接收,client端发送数据,大家参考使用吧...2020-06-25
  • SQL Server中执行动态SQL

    本文详细讲解了SQLServer中执行动态SQL的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2022-05-19
  • jQuery为动态生成的select元素添加事件的方法

    下面小编就为大家带来一篇jQuery为动态生成的select元素添加事件的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-09-01
  • C#编程总结(六)详解异步编程

    本篇文章主要介绍了C#异步编程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。...2020-06-25
  • 用C++面向对象的方式动态加载so的方法

    下面小编就为大家带来一篇用C++面向对象的方式动态加载so的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • C#实现动态显示及动态移除图片方法

    这篇文章主要介绍了C#实现动态显示及动态移除图片方法,对于C#的初学者了解图像操作有一定的帮助,需要的朋友可以参考下...2020-06-25
  • 理解javascript异步编程

    这篇文章主要为大家介绍了javascript异步编程,从浅入深的学习javascript异步编程,对javascript异步编程感兴趣的小伙伴们可以参考一下...2016-01-29
  • vue2 中如何实现动态表单增删改查实例

    本篇文章主要介绍了vue2 中如何实现动态表单增删改查实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...2017-06-15
  • 读Javascript高性能编程重点笔记

    这篇文章主要介绍了读Javascript高性能编程重点笔记,需要的朋友可以参考下...2016-12-31
  • Springboot使用thymeleaf动态模板实现刷新

    这篇文章主要介绍了Springboot使用thymeleaf动态模板实现刷新,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-31
  • 基于RequireJS和JQuery的模块化编程——常见问题全面解析

    下面小编就为大家带来一篇基于RequireJS和JQuery的模块化编程——常见问题全面解析。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-04-17
  • 再谈JavaScript异步编程

    再谈JavaScript异步编程,简单描述了几种JavaScript异步编程模式,感兴趣的小伙伴们可以参考一下...2016-01-29
  • 探究JavaScript函数式编程的乐趣

    本文是函数式编程系列的第一篇文章,这里我会简要介绍一下编程范式,然后会直接介绍使用Javascript进行函数式编程的概念,需要的朋友可以参考下...2015-12-16