PHP对数据库的访问一般包括下列步骤:连接数据库系统→选择数据库→执行SQL语句→关闭结果集→关闭数据库连接→结束。
连接数据库是建立用户程序到数据库系统的对话通道的过程。连接MySQL数据库的语句如下:
〈?
$LinkID=@mysql_connect("localhost","root" , "") die("Could not connect: " .
mysql_errno() ."
:".mysql_error()); ?〉
用到
mysql_connect、mysql_errno、mysql_error()函数。
mysql_connect() 建立一个到 MySQL服务器的连接。
FALSE。
函数前面的“@”符号,用于限制这个命令的出错信息的显示。此符号可用于其它函数前起到相同作用。这个例子里,是在mysql_connect前加“@”符号的提示
Could not connect: Access denied for user 'root'@'localhost'(using password: NO)
下面的则是去掉“@”符号后的现示,可以比较一下不同:
Warning: mysql_connect() [
function.mysql-connect]: Access denied foruser 'root'@'localhost' (using password: NO) in
D:shcuniodcmysql_conn.php on line
3
Could not connect: Access denied for user 'root'@'localhost' (usingpassword: NO)
mysql_error():返回上一个 MySQL操作产生的文本错误信息
mysql_errno():返回上一个 MySQL函数的错误号码,如果没有出错则返回
0(零)。
如果函数调用出错,将执行or后面的语句。die()函数表示向用户输出引号中的内容后,程序终止执行。不过在调试的时候,我们还是可以不要屏蔽出错信息。
数据库选择
〈?@mysql_select_db("DBname",$LinkID) ordie(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 resultresource
这个错误提示往往是因为没有查询到有记录到结果集,分解结果集出错造成的。而不是mysql_fetch_row()函数本身的问题。这时就要检查一下前面的mysql_connect和mysql_select_db,往往是这两步出错导致查询不到结果集。
附:一个功能比较全的mysql连接类
classdbLink
//数据库查询的类
{
var$dBaseLink;
//数据库连接指针
var$dBase;
functiondbLink($base="")
//构造函数
//$base为选择数据库名称
{$this->dBaseLink=@mysql_connect("host","user","password");
if(!$this->dBaseLink)die($this->dbError("1"));
if($base!="")$this->dbChange($base);
}
functiondbClose()
//关闭数据库连接
{mysql_close($this->dBaseLink);
}
functiondbError($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"<divstyle='background-color:#dddddd;color:#000000;font-size:9pt;width=400'align=center>错误 $n:".$dbErrorCode[$n]."<BR>".$sql."</div>";
}
functiondbChange($base)
//改变当前数据库
{
$this->dBase=$base;
@mysql_select_db($base,$this->dBaseLink);
if($msg=mysql_errno($this->dBaseLink))die($this->dbError($msg));
}
functiondbQuery($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;$i<$num;$i++)
$rtArray[$i]=($type==0)?mysql_fetch_array($result):mysql_fetch_row($result);
}
@mysql_free_result($result);
return$rtArray;
}
functiondbCountRecords($table,$where="",$base="",$index="id")
//统计表中记录的数目
//$table操作的数据表名称
//$where完整的where子句
//$base
操作的数据库名称
//$index操作所使用的索引字段
{ if($base!="" ||$this->dBase!=$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;
}
functiondbIo($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);
returnmysql_insert_id($this->dBaseLink);
}
functiondbFieldList($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<$n;$i++){
$name
=
mysql_field_name($pt,$i);
$type
=
mysql_field_type($pt,$i);
$len
=
mysql_field_len($pt,$i);
$rt[$i]=array("name"=>$name,
//字段名称
"type"=>$type,
//字段类型
"len"
=>$len);
//字段长度
}
return$rt;
}
functiondbTableList($basename)
//数据库basename的表信息
{
$result=mysql_list_tables($basename,$this->dBaseLink);
$rt=mysql_fetch_array($result);
@mysql_free_result($result);
return$rt;
}
}