- 论坛徽章:
- 0
|
用peardb很久了,几乎忘了简单的php数据库连接类该怎么写了。前两天看了一篇关于session应用的文章,里面说了很多session的错误提示信息,才发现自己虽然经常用session,可是还是很多细节没有注意到。趁了今天一点时间,从头缕一遍数据库连接,从最基础的方法到一些经典的封装类,最重点的是训练自己能注意一些细节。
PHP对数据库的访问一般包括下列步骤:连接数据库系统→选择数据库→执行SQL语句→关闭结果集→关闭数据库连接→结束。
连接数据库
是建立用户程序到数据库系统的对话通道的过程。连接MySQL数据库的语句如下:
〈?
[email=$LinkID=@mysql_connect("localhost]$LinkID=@mysql_connect("localhost[/email]
", "root" , "") die("Could not connect: " . mysql_errno() .":".mysql_error()); ?〉
用到 mysql_connect、mysql_errno、mysql_error()函数。
mysql_connect() 建立一个到 MySQL 服务器的连接。
共有三个参数,主机,用户名,密码。如果成功则返回一个 MySQL 连接标识,失败则返回 FALSE。
函数前面的“@”符号,用于限制这个命令的出错信息的显示。此符号可用于其它函数前起到相同作用。
这个例子里,是在mysql_connect前加“@”符号的提示
Could not connect: Access denied for user 'root'@'localhost' (using password: NO)
下面的则是去掉“@”符号后的现示,可以比较一下不同:
Warning: mysql_connect() [
function.mysql-connect
]: Access denied for user 'root'@'localhost' (using password: NO) in D:\shc\unio\dc\mysql_conn.php on line 3
Could not connect: Access denied for user 'root'@'localhost' (using password: NO)
mysql_error():返回上一个 MySQL 操作产生的文本错误信息
mysql_errno():返回上一个 MySQL 函数的错误号码,如果没有出错则返回 0(零)。
如果函数调用出错,将执行or后面的语句。die( )函数表示向用户输出引号中的内容后,程序终止执行。不过在调试的时候,我们还是可以不要屏蔽出错信息。
数据库选择
〈? @mysql_select_db("DBname",$LinkID) or die(mysql_erron().":".mysql_error); ?〉
$LinkID为mysql_connect()产生的连接标识。
mysql_select_db() 设定与指定的连接标识符所关联的服务器上的当前激活数据库。如果没有指定连接标识符,则使用上一个打开的连接。如果没有打开的连接,本函数将无参数调用
mysql_connect
每个其后的
mysql_query()
调用都会作用于活动数据库。
mysql_query() 向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询。如果没有指定 link_identifier,则使用上一个打开的连接。如果没有打开的连接,本函数会尝试无参数调用
mysql_connect()
函数来建立一个连接并使用之。查询结果会被缓存。
$query = "insert into Resume(Name,Intro) values('$Name', '$Intro')"; //生成SQL语句
$result = @mysql_query("$query",$LinkID) or die(mysql_error()); //执行
下面要介绍的是mysql_fetch_array(),mysql_fetch_assoc(),mysql_fetch_row(),这三个函数某驼初学时费了一些时候才弄清楚,所以想拿出来区别一下。
mysql_fetch_row() 从和指定的结果标识关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。 也就是说,用该函数取出来的数组索引是从0开始的整数。
mysql_fetch_array() 是
mysql_fetch_row()
的扩展版本。除了将数据以数字索引方式储存在数组中之外,还可以将数据作为关联索引储存,用字段名作为键名。mysql_fetch_array() 中可选的第二个参数 result_type 是一个常量,可以接受以下值:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH。如果用了 MYSQL_BOTH,将得到一个同时包含关联和数字索引的数组。用 MYSQL_ASSOC 只得到关联索引(如同
mysql_fetch_assoc()
那样),用 MYSQL_NUM 只得到数字索引(如同
mysql_fetch_row()
那样)。
mysql_fetch_assoc() 和用
mysql_fetch_array()
加上第二个可选参数 MYSQL_ASSOC 完全相同。它仅仅返回关联数组。这也是
mysql_fetch_array()
起初始的工作方式。如果在关联索引之外还需要数字索引,用
mysql_fetch_array()
。
也就是说:mysql_fetch_assoc()=mysql_fetch_array(,MYSQL_ASSOC);
mysql_fetch_row()=mysql_fetch_array(,MYSQL_NUM);
这下他们三个的关系总算理清楚了。
在手册里介绍mysql_fetch_row函数时有一句:依次调用 mysql_fetch_row() 将返回结果集中的下一行。以前没注意到,现在提一下,这句话就是我们为什么要用while循环的原因。当然也可以用for。
资源释放
操作的最后,是释放结果集,释放结果集和数据库连接资源。
〈?
@mysql_free_result($result);
@mysql_close($LinkID);
?〉
如果在多个网页中都要频繁进行数据库访问,则可以建立与数据库服务器的持续连接来提高效率。因为每次与数据库服务器的连接需要较长的时间和较大的资源开销,持续的连接相对来说会更有效。
建立持续连接的方法,就是在数据库连接的时候,调用函数mysql_pconnect()代替mysql_connect() 。建立的持续连接在本程序结束时,不需要调用mysql_close()来关闭。下次程序在此执行mysql_pconnect()时,系统自动直接返回已经建立的持续连接的ID号,而不再去真的连接数据库。
用到了
mysql_free_result() 将释放所有与结果标识符 result 所关联的内存。仅需要在考虑到返回很大的结果集时会占用多少内存时调用。在脚本结束后所有关联的内存都会被自动释放。
mysql_close() 关闭指定的连接标识所关联的到 MySQL 服务器的连接。如果没有指定 link_identifier,则关闭上一个打开的连接
综合以上所说的内容
连接数据库系统
mysql_connect/
→选择数据库
mysql_select_db
→执行SQL语句
mysql_qurey/mysql_fetch_row/mysql_fetch_array/mysql_fetch_assoc
→关闭结果集
mysql_free_result
→关闭数据库连接
mysql_close
→结束。
就走完了一个mysql连接和断开的过程。这是最简单的一个流程,然而某驼还要提到的是,驼以前犯过几次错误,遇到了这样的错误提示:
mysql_fetch_row(): supplied argument is not a valid MySQL result resource
这个错误提示往往是因为没有查询到有记录到结果集,分解结果集出错造成的。而不是mysql_fetch_row()函数本身的问题。这时就要检查一下前面的mysql_connect和mysql_select_db,往往是这两步出错导致查询不到结果集。
附:一个功能比较全的mysql连接类
class dbLink //数据库查询的类
{ var $dBaseLink; //数据库连接指针
var $dBase;
function dbLink($base="") //构造函数
//$base 为选择数据库名称
{ $this->dBaseLink=@mysql_connect("host","user","password");
if(!$this->dBaseLink) die($this->dbError("1"));
if($base!="") $this->dbChange($base);
}
function dbClose() //关闭数据库连接
{ mysql_close($this->dBaseLink);
}
function dbError($n,$sql="") //输出错误信息,并退出程序
{
$dbErrorCode=array(
1 => "不能连接到数据库",
1004 => DB_ERROR_CANNOT_CREATE,
1005 => DB_ERROR_CANNOT_CREATE,
1006 => DB_ERROR_CANNOT_CREATE,
1007 => "对象已经存在,不能完成创建操作",
1008 => "不能完成删除操作",
1046 => DB_ERROR_NODBSELECTED,
1050 => DB_ERROR_ALREADY_EXISTS,
1051 => DB_ERROR_NOSUCHTABLE,
1054 => "所检索的字段不存在",
1062 => DB_ERROR_ALREADY_EXISTS,
1064 => DB_ERROR_SYNTAX,
1100 => DB_ERROR_NOT_LOCKED,
1136 => DB_ERROR_VALUE_COUNT_ON_ROW,
1146 => "所检索的数据表不存在",
1049 => "所选择的数据库不存在"
);
echo "错误 $n :".$dbErrorCode[$n]."
".$sql."";
}
function dbChange($base) //改变当前数据库
{
$this->dBase=$base;
@mysql_select_db($base,$this->dBaseLink);
if($msg=mysql_errno($this->dBaseLink)) die($this->dbError($msg));
}
function dbQuery($sql,$base="",$type=0) //对指定数据库进行访问
//$sql为SQL语句
//$base为访问的数据库名,如果没有则使用上次使用的
//$type为返回数组格式,0返回name=>value形式,1返回value格式
{ if($base!="" || $this->dBase!=$base) $this->dbChange($base);
$result=@mysql_query($sql,$this->dBaseLink);
if($msg=mysql_errno($this->dBaseLink)) die($this->dbError($msg,$sql));
@$num=mysql_num_rows($result);
if($num==0) $rtArray="";
else {
for($i=0;$idBase!=$base) $this->dbChange($base);
$result = mysql_query("select count(".$index.") as 'num' from $table ".$where,$this->dBaseLink);
@$num = mysql_result($result,0,"num");
@mysql_free_result($result);
return $num;
}
function dbIo($sql,$base="") //无返回值的SQL操作,例如insert操作,返回新插入的id,update和delete无返回值
{ if($base!="" || $this->dBase!=$base) $this->dbChange($base);
$result=@mysql_query($sql,$this->dBaseLink);
@mysql_free_result($result);
return mysql_insert_id($this->dBaseLink);
}
function dbFieldList($table,$base) //字段信息列表
{ $pt = @mysql_list_fields($base,$table);
if($msg=mysql_errno($this->dBaseLink)) die($this->dbError($msg));
$n=mysql_num_fields($pt);
for($i=0;$i $name, //字段名称
"type" => $type, //字段类型
"len" => $len); //字段长度
}
return $rt;
}
function dbTableList($basename) //数据库basename的表信息
{
$result=mysql_list_tables($basename,$this->dBaseLink);
$rt=mysql_fetch_array($result);
@mysql_free_result($result);
return $rt;
}
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8573/showart_76716.html |
|