在PHP中使用MySQL Mysqli操作数据库 ,以及类操作方法
先来操作函数部分,普遍的MySQL 函数方法,但随着PHP5的发展,有些函数使用的要求加重了,有些则将废弃不用,有些则参数必填...
===============================================================================================================================
说PHP就不能不提MySQL,而要讲MySQL,那么PHP也是必然要被提起。PHP的迅速崛起,离不开MySQL,而MySQL的广泛应用,也与PHP休戚相关。
下面详细分析PHP4中与MySQL相关操作的函数(共32个,开头都为mysql_):
<1>. 连接数据库服务器(database server)的函数(2个):
(1).mysql_connect() 格式:int mysql_connect(string [hostname] [:port],string [username],string [password]);
参数中的port参数表示数据库服务器的端口号,一般用它的默认端口号就可以了。 如果不填任何参数,则默认的hostname为localhost,username为root,password为空。
函数执行成功,返回一个int 类型的连接号(link_identifier),执行失败,返回false值。 例子:
<?php
$connect = mysql_connect("localhost","user","password");
if($connect) echo "Connect Successed!"; //连接成功,显示Connect Successed! else echo "Connect Failed!"; //连接失败,显示Connect Failed!
?>
在上例中,如mysql_connect()执行失败,将显示系统的错误提示,而后继续往下执行。那,该如何屏蔽这些系统的错误提示并在失败后结束程序?
在MySQL中,允许在数据库函数之前加上@符号,屏蔽系统的错误提示,同时用die()函数给出更易理解的错误提示,然后die()函数将自动退出程序。
上例可以改为:
<?php
$connect = @mysql_connect("localhost","user","password") or die ("Unable to connect database server!"); ?>
如mysql_connect()执行失败,将显示 Unable to connect database server!后,退出程序。
(2).mysql_pconnect() 格式:int mysql_pconnect(string [hostname] [:port],string [username],string [password]);
此函数与(1)的mysql_connect()基本相同,区别在于:
--------- 当数据库操作结束之后 ,由(1)的mysql_connect()建立的连接将自动关闭,而(2)的mysql_pconnect()建立的连接将继续存在,是一种稳固持久的连接。
--------- 在(2)的mysql_pconnect(),每次连接前,都会检查是否有使用同样的hostname,use,password的连接,如果有,则直接使用这个连接号。
--------- (1)的mysql_connect()建立的连接可以用mysql_close()关闭,而(2)的mysql_pconnect()不能用mysql_close()来关闭。
<2>.关闭数据库连接函数(1个):
mysql_close() 格式:int mysql_close(int link_identifier);
关闭由mysql_connect()函数建立的连接,执行成功,返回ture值,失败则返回false值。 例子如下:
<?php
$connect = @mysql_connect("hostname","user","password") or die("Unable to connect database server!");
$close = @mysql_close($connect) or die ("Unable to close database server connect!");
?>
注:mysql_close()不能关闭由mysql_pconnect()函数建立的连接。
<3>.选择数据库函数(1个):
mysql_select_db()
格式:int mysql_select_db(string database name , int link_identifier);
选择指定的database name ,成功,返回1个真值(True),失败,则返回1个False值。 例子1:
<?php
$select = mysql_select_db('forum' , $connect);
if($select) {echo "connect db forum successed!";}
else {echo "connect db forum failed!";}
?>
例子2:
<?php
$select = mysql_select_db("forum",$connect) or die("Can not connect this DB!");
?>
注:此函数相当于在MySQL中的USE语句:如 USE forum
<4>.SQL查询函数(2个):
1、mysql_query()
格式:int mysql_query(string sqlquery , int link_identifier);
向服务器发一段标准SQL语句请求。如果失败,则返回一False值。
例子:
<?php
$connect = mysql_connect($hostname,$user,$pwd);
$select = mysql_select_db($dbname,$connect);
$query = mysql_query($sql , $connect);
if($query) echo "Successed !";
else echo "Failed !";
?>
此函数一定要与mysql_select_db()函数配合使用,单独使用它就没有意义了!
2、mysql_db_query()
格式:int mysql_db_query(string database , string sqlquery , int link_identifier);
在此函数中必须指定数据库名database和SQL语句sqlquery,如失败则返回False。
例子:
<?php
$connect = mysql_connect($hostname , $user , $pwd);
$query = mysql_db_query($dbname , $sql , $connect);
if($query) echo "Successed !";
else echo "Failed !";
?>
mysql_db_query()与mysql_query()的区别就在于前者可以不用使用mysql_select_db()来选择数据库database,而在执行SQL语句的同时,进行选择数据库。
<5>.数据库记录操作函数(5个):
1、mysql_fetch_array()
格式:array mysql_fetch_array(int query);
执行成功,返回1个数组,该数组保存有下一条记录的值,如执行失败,则返回False值。
返回的数组既可以用下标来表示,也可以用字段名来表示。
例子:
<?php
$query = mysql_query($sql , $connect);
while($arrary = mysql_fetch_array($query))
{
echo $array[column1]." | ".$array[column2]; //echo $array[0]." | ".$array[1];
}
?>
Note : 数组的下标是从0开始的!
2、mysql_fetch_row()
格式:array = mysql_fetch_row(int query);
与1的mysql_fetch_array()函数功能基本相同。区别在于mysql_fetch_row()只能以数组下标来表示。
成功返回1个数组,失败返回False值。
例子:
<?php
$query = mysql_query($sql , $connect);
while($row = mysql_fetch_row($query))
{
echo $row[0] . " | " . $row[1] . "<br>"; }
?>
Note : mysql_fetch_row()函数只能用数组下标来表示,并从0开始。
另:mysql_fetch_row()比mysql_fetch_array()执行速度快,并且都是对下一行数据进行读取。
3、mysql_result()
格式:int mysql_result(int query , int row , string filedname);
在mysql_result()中,参数row必须从0开始,参数filedname必须是真实的字段名,不能用下标来表示。
执行成功,返回由数据库中取出的字段的数值,失败则返回False值。
例子:
<?php
$query = mysql_query($sql , $connect);
echo mysql_result($query , 0 , "column1")."<br>";
echo mysql_result($query , 1, "column1")."<br>";
echo mysql_result($query , 2, "column1")."<br>";
?> Note : 此函数功能少,但使用方便。
4、mysql_fetch_object()
格式: object mysql_fetch_object(int query)
能对指定的字段进行循环读取,执行成功,将以对象object的形式返回数值,失败则返回False值。
例子:
<?php
$query = mysql_query($sql , $connect);
while($object = mysql_fetch_object($query))
{
echo $object->column1 . "<br>";
echo $object->column2 . "<br>";
echo $object->column3 . "<br>";
}
?>
Note : mysql_fetch_object()函数执行成功后返回的是1个对象object !
操作如下: $object->字段名
5、mysql_data_seek()
格式:int mysql_data_seek(int row , int query);
移动游标到指定的行(row_number)
执行成功,返回真值,失败,返回False值。
此函数可以与mysql_fetch_array()或mysql_fetch_row()配合使用,即在使用mysql_data_seek()函数之后,就可以用mysql_fetch_array()或mysql_fetch_row()函数来显示指定的行了。
例子:
<?php
$query = mysql_query($sql , $connect);
$seek = mysql_data_seek($query , 2);
$arrary = mysql_fetch_array($query);
echo $array[column1]."<br>";
echo $array[column2]."<br>";
?>
<6>.数据库级database的操作函数(2个):
1、mysql_create_db()
格式:int mysql_create_db(string database name , int link_identifier);
通过程序来建立1个数据库database,当然你也可以用mysql_query()或者mysql_db_query()函数来建立或删除database
但我们可以用这个函数更为方便地建立1个database。
成功返回1个真值,失败,则返回1个false。
例子:
<?php
$connect = mysql_connect("$hostname","$user","$pwd");
$create = mysql_create_db("dbtest" , $connect);
if($create) echo "create database dbtest successed!";
else echo "create database dbtest failed!";
?>
2、mysql_drop_db()
格式:int mysql_drop_db(string database name , int link_identifier);
通过程序来删除1个数据库database。
但我们可以用这个函数更为方便地删除1个database。
成功返回1个真值,失败,则返回1个false。
例子:
<?php
$connect = mysql_connect("$hostname","$user","$pwd");
$create = mysql_drop_db("dbtest" , $connect);
if($create) echo "drop database dbtest successed!";
else echo "drop database dbtest failed!";
?>
Note : 如用mysql_query()或mysql_db_query(),则SQL语句应为:
(1)create database dbtest
(2)drop database dbtest
(7) 数据库信息函数(2个):
1、mysql_fetch_field()
格式:object mysql_fetch_field(int query , int [field_offset]);
返回1个对象,即一哈希表,下标有:
table : 表名 name : 字段名 max_length : 该字段的最大长度
not_null : 字段为not null则返回1,否则返回0
primary_key : 字段为primary key则返回1,否则返回0
unique_key : 字段为unique key则返回1,否则返回0
multiple_key : 字段为非unique key则返回1,否则返回0
numeric : 字段为numeric则返回1,否则返回0
blob : 字段为blob则返回1,否则返回0
type : 字段的类型 unsigned : 字段为unsigned则返回1,否则返回0
zerofill : 字段为zero filled则返回1,否则返回0
引用格式为:对象名->下标名
使用此函数可以得到表名、字段名、类型.......
例子:
<?php
$query = mysql_query($sql , $connect);
while($object = mysql_fetch_field($query))
{
echo "table name : ".$object->table."<br>";
echo "field name : ".$object->name."<br>";
echo "primary key : ".$object->primary_key."<br>";
echo "not null : ".$object->not_null."<br>";
echo "field type : ".$object->type."<br>";
echo "field max length : ".$object->max_length."<br>";
}
?>
Note : 哈希表的是从0坐标开始的,即第一个字段为哈希表中的0项。
如果我们想直接得到哈希表的第三项即第三个字段的信息,可用如下格式:
<?php
$query = mysql_query($sql , $connect);
$object = mysql_fetch_field($query , 2);
echo "table name : ".$object->table."<br>";
echo "field name : ".$object->name."<br>";
echo "primary key : ".$object->primary_key."<br>";
echo "not null : ".$object->not_null."<br>";
echo "field type : ".$object->type."<br>";
echo "field max length : ".$object->max_length."<br>";
?>
其实这也可以通过下面这个函数来达到同样的目的。
2、mysql_field_seek()
格式:int mysql_field_seek(int $query , int field_offset);
将游标移到指定的字段上。
例子:
<?php
$query = mysql_query($sql , $connect);
$seek = mysql_field_seek($query , 2);
$object = mysql_fetch_field($query);
echo "table name : ".$object->table."<br>";
echo "field name : ".$object->name."<br>";
echo "primary key : ".$object->primary_key."<br>";
echo "not null : ".$object->not_null."<br>";
echo "field type : ".$object->type."<br>";
echo "field max length : ".$object->max_length."<br>";
?>
这样也达到与上例同样的要求。
(8) 取数据库名和表名(2个):
1、mysql_list_dbs()
格式: int mysql_list_dbs(int link_identifier);
取得所有可用的数据库名(database name)。
例子:
<?php
$connect = mysql_connect($host , $usr ,$pwd);
$dbs = mysql_list_dbs($connect);
$rows = mysql_num_rows($dbs);
echo "database total : ".$rows;
$i = 0;
while($i<$rows)
{
$db_name[$i] = mysql_tablename($dbs , $i);
echo $db_name[$i]; $i++; }
?>
即可依次显示出MySQL中所有的数据库名字(database name )。
Note : 相当于MySQL中的 show databases命令
2、mysql_list_tables()
格式:int mysql_list_tables(string database name);
显示该数据库下所有的表的名字Table name。
例子:
<?php
$connect = mysql_connect($host , $usr , $pwd);
$tables = mysql_list_tables("mysql");
$rows = mysql_num_rows($tables);
echo "Table total : ".$rows; $i = 0;
while($i<$rows)
{
$table_name[$i] = mysql_tablename($tables , $i);
echo $table_name[$i]; $i++; }
?>
即可依次显示出mysql下所有的表的名字
Note : 相当于MySQL中的 show tables命令(先要用 use mysql命令选中1个数据库)
======================================================================================================================
======================================================================================================================
再来一些mysqli 对象形式部分
PHP的 mysqli 扩展提供了其先行版本的所有功能,此外,由于 MySQL 已经是一个
具有完整特性的数据库服务器 , 这为PHP 又添加了一些新特性 。 而 mysqli 恰恰也支持了
这些新特性。
一. 建立和断开连接
与 MySQL数据库交互时,首先要建立连接,最后要断开连接,这包括与服务器连接并
选择一个数据库 , 以及最后关闭连接 。与 mysqli 几乎所有的特性一样 , 这一点可以使用面向
对象的方法来完成,也可以采用过程化的方式完成。
1. 创建一个 mysqli 的对象
$_mysqli = newmysqli();
2. 连接 MySQL的主机、用户、密码、数据库
$_mysqli->connect( 'localhost' , 'root' , 'yangfan' , 'guest' );
3. 创建带连接参数的 mysqli对象
$_mysqli = newmysqli( 'localhost' , 'root' , 'yangfan' , 'guest' );
4. 单独选择数据库
$_mysqli->select_db( 'testguest' );
5. 断开 MySQL
$_mysqli->close();
二. 处理连接错误
如果无法连接 MySQL数据库,那么这个页面不太可能继续完成预期的工作。因此,一
定要注意监视连接错误并相应地做出反应 。Mysqli 扩展包含有很多特性可以用来捕获错误信
息,例如:mysqli_connect_errno() 和 mysqli_connect_error() 方法。
mysqli_connect_errno()函数返回连接数据库返回的错误号。
Mysqli_connect_error()函数返回连接数据库返回的错误代码。
if(mysqli_connect_errno()) {
echo' 数据库连接错误,错误信息: ' .mysqli_connect_error();
exit();
}
errno属性返回数据库操作时的错误号。
error属性返回数据库操作时的错误代码。
if( $_mysqli ->errno) {
echo' 数据库操作时发生错误,错误代码是: ' . $_mysqli ->error;
}
三. 与数据库进行交互
绝大多数查询都与创建(Creation) 、获取 (Retrieval) 、更新 (Update) 和删除 (Deletion) 任
务有关,这些任务统称为 CRUD 。
1. 获取数据
网页程序大多数工作都是在获取和格式化所请求的数据。为此,要向数据库发送
SELECT查询,再对结果进行迭代处理,将各行输出给浏览器,并按照自己的要求输出。
// 设置一下编码 utf8
$_mysqli->set_charset( "utf8" );
// 创建一句 SQL 语句
$_sql = "SELECT* FROM t g_user" ;
// 执行 sql 语句把结果集赋给$_result
$_result = $_mysqli->query( $_sql );
// 将结果集的第一行输出
print_r( $_result->fetch_row());
// 释放查询内存 ( 销毁 )
$_result->free();
2. 解析查询结果
一旦执行了查询并准备好结果集 ,下面就可以解析获取到的结果行了 。 你可以使用多个
方法来获取各行中的字段 ,具体选择哪一个方法主要取决于个人喜好 , 因为只是引用字段的
方法有所不同。
将结果集放到对象中
由于你可能会使用 mysqli的面向对象的语法 , 所以完全可以采用面向对象的方式管理结
果集。可以使用fetch_object() 方法来完成。
// 将结果集包装成对象
$_row = $_reslut->fetch_object();
// 输出对象中的一个字段(属性)
echo $_row->tg_username;
// 遍历所有的用户名称
while (!! $_row =$_reslut ->fetch_object()) {
echo$_row ->tg_username. ' <br /> ' ;
}
使用索引数组和关联数组
// 将结果集包装成数组 ( 索引 +关联 )
$_row = $_reslut->fetch_array();
// 输出下标是 3 的字段(属性)
echo $_row [ 3 ];
// 将结果集包装成索引数组
$_row = $_reslut->fetch_row();
echo $_row [ 3 ];
// 将结果集包装成关联数组
$_row = $_reslut->fetch_assoc();
echo $_row ['tg_username' ];
3. 确定所选择的行和受影响的行
通常希望能够确定 SELECT查询返回的行数 , 或者受 INSERT 、 UPDATE 或 DELET 查询
影响的行数。我们可以使用num_rows 和 affected_rows 两个属性
// 当使用查询时,想了解 SELECT查询了多少行,可以使用 num_rows 。
echo $_reslut->num_rows;
// 当使用查询时 , 想了解SELECT 、 INSERT 、 UPDATE 、 DELETE 查询时影响的行
数,可以使用affected_rows; 注意,它是 $_mysqli 下的属性
echo $_mysqli->affected_rows;
4. 移动指针的操作和获取字段
当你并不想从第一条数据开始获取 ,或者并不想从第一个字段获取 , 你可以使用数据指
针移动或者字段指针移动的方式调整到恰当的位置。 当然 , 你还可以获取字段的名称及其相
关的属性。
// 计算有多少条字段
echo $_reslut->field_count;
// 获取字段的名称
$_field = $_reslut->fetch_field();
echo $_field->name;
// 遍历字段
while (!! $_field =$_reslut ->fetch_field()) {
echo$_field ->name. '<br />' ;
}
// 一次性取得字段数组
print_r( $_reslut->fetch_fields());
// 移动数据指针
$_reslut->data_seek( 5 );
// 移动字段指针
$_reslut->field_seek( 2 );
5. 执行多条 SQL 语句
有的时候 ,我们需要在一张页面上同时执行多条 SQL 语句 , 之前的方法就是分别创建多
个结果集然后使用。但这样资源消耗很大,也不利于管理。PHP 提供了执行多条 SQL 语句
的方法 $_mysqli->multi_query() ;
// 创建多条 SQL 语句
$_sql .="SELECT * FROM tg_user;" ;
$_sql .="SELECT * FROM tg_photo;" ;
$_sql .="SELECT * FROM tg_article" ;
// 开始执行多条 SQL 语句
if ( $_mysqli->multi_query( $_sql )) {
//开始获取第一条 SQL 语句的结果集
$_result= $_mysqli ->store_result();
print_r($_result ->fetch_array());
//将结果集指针移到下一个
$_mysqli->next_result();
$_result= $_mysqli ->store_result();
print_r($_result ->fetch_array());
$_mysqli->next_result();
$_result= $_mysqli ->store_result();
print_r($_result ->fetch_array());
} else {
echo'sql 语句有误! ' ;
}
6. 执行数据库事务
事务 (transaction)是作为整个一个单元的一组有序的数据库操作 。 如果一组中的所有操
作都成功 , 则认为事务成功 ,即使只有一个失败操作 , 事务也不成功 。 如果所有操作成功完
成 , 事务则提交 (commit) ,其修改将作用于所有其他数据库进程 。 如果一个操作失败 , 则事
务将回滚 (roll back),该事务所有操作的影响都将取消。
首先 , 您的 MySQL 是InnoDB 或 BDB 引擎的一种 , 一般来说 , 你安装了 AppServ 的集成
包 , 你选择 InnoDB的引擎的数据库即可 。 如果你建立的表不是 InnoDB , 可以在 phpmyadmin
里修改。
// 首先你必须关闭自动提交数据
$_mysqli->autocommit( false );
// 创建一个 SQL 语句,必须同时运行成功,不能出现一个成功,一个失败
$_sql .="UPDATE tg_friend SET tg_state=tg_state+5 WHERE tg_id=1;" ;
$_sql .="UPDATE tg_flower SET tg_flower=tg_flower-5 WHERE tg_id=1;" ;
// 执行两条 SQL 语句
if ( $_mysqli->multi_query( $_sql )) {
//获取第一条 SQL 一影响的行数
$_success= $_mysqli ->affected_rows == 1 ? true : false ;
//下移,第二条 SQL
$_mysqli->next_result();
//获取第二条 SQL 影响的行数
$_success2 = $_mysqli ->affected_rows == 1 ? true : false ;
//判断是否都正常通过了,两个 SQL
if( $_success && $_success2 ) {
$_mysqli->commit();
echo' 完美提交! ' ;
}else {
$_mysqli->rollback();
echo' 程序出现异常! ' ;
}
}
} else {
echo"SQL 语句有误: " . $_mysqli ->errno. $_mysqli ->error;
}
// 最后还必须开启自动提交
$_mysqli->autocommit( true );
===============================================================================================================================
===============================================================================================================================
其次是mysql 类操作方法,附上代码片..
<?php class DummyMySQLClass{ var $DBHost = ''; /* 数据库主机名称 */ var $DBUser = ''; /* 数据库用户名称 */ var $DBPswd = ''; /* 数据库密码 */ var $DBName = ''; /* 数据库名称 */ var $Result = NULL; /* private */ var $LinkId = NULL; /* private */ var $Record = NULL; /* 包含一条记录的内容 */ var $Rows = 0; var $MustBeHalt = true; /* 有了错误立即停止 */ var $RecordCase = NULL; /* 只在 nextRecord() 和 f()方法里出现 */ function DummyMySQLClass($DBHost = '', $DBUser = '', $DBPswd = '', $DBName = '', $newLink = false){ if(is_array($DBHost)){ $DBHost = $DBHost[0]; $DBUser = $DBHost[1]; $DBPswd = $DBHost[2]; $DBName = $DBHost[3]; $newLink = empty($DBHost[4])?false:$DBHost[4]; }elseif(str_replace(array("/", "@"), array("", ""), $DBHost) != $DBHost){ $dsn = $this->splitDSN($DBHost); $DBTpye = $dsn[0]; $DBHost = $dsn[1].":".$dsn[2]; $DBUser = $dsn[3]; $DBPswd = $dsn[4]; $DBName = $dsn[5]; $newLink = $dsn[6] == ''?$newLink:$dsn[6]; } $this->DBHost = empty($DBHost)?$this->DBHost:$DBHost; $this->DBUser = empty($DBUser)?$this->DBUser:$DBUser; $this->DBPswd = empty($DBPswd)?$this->DBPswd:$DBPswd; $this->DBName = empty($DBName)?$this->DBName:$DBName; if(!empty($DBHost)){ $this->connect($this->DBHost, $this->DBUser, $this->DBPswd, $newLink); } if(!empty($DBName)){ $this->selectDB($DBName); } } function splitDSN($dsn){ //$dsn = "数据库类型名称://入口帐号:入口密码@数据库主机名:端口号/数据库名/是否总是打开新的连接"; //$dsn = "MySQL://Dummy:123@localhost:3306/tetx/false"; $dsn = preg_split("/[://@]/", $dsn); $DBTpye = ''; $DBHost = ''; $DBPort = ''; $DBUser = ''; $DBPswd = ''; $DBName = ''; $DBNewLink = false; $DBTpye = $dsn[0]; $DBHost = $dsn[5]; $DBPort = $dsn[6]; $DBUser = $dsn[3]; $DBPswd = $dsn[4]; $DBName = $dsn[7]; $DBNewLink = $dsn[8]; return array($DBTpye, $DBHost, $DBPort, $DBUser, $DBPswd, $DBName, $DBNewLink); } function affectedRows(){ /* 取得前一次 MySQL 操作所影响的记录行数 */ return mysql_affected_rows($this->LinkId); } function changeUser($user, $password){ /* 改变活动连接中登录的用户 */ return mysql_change_user($user, $password, $this->DBName, $this->LinkId); } function clientEncoding(){ /* 返回字符集的名称 */ return mysql_client_encoding($this->LinkId); } function close(){ /* 关闭 MySQL 连接 */ $close = mysql_close($this->LinkId); $this->LinkId = NULL; $this->Result = NULL; $this->Record = NULL; return $close; } function connect($DBHost = '', $DBUser = '', $DBPswd = '', $newLink = false){//, int client_flags){ /* 打开一个到 MySQL 服务器的连接 */ $connect = @mysql_connect(empty($DBHost)?$this->DBHost:$DBHost, empty($DBUser)?$this->DBUser:$DBUser, empty($DBPswd)?$this->DBPswd:$DBPswd, $newLink); if(!is_resource($connect)){ $this->halt("连接数据库失败!", 1); return false; } $this->LinkId = $connect; return true; } function createDB($DBName){ /* 新建一个 MySQL 数据库 */ return @mysql_create_db($DBName, $this->LinkId) or die($this->halt("创建数据库 ".$DBName." 失败!")); } function dataSeek($rowNumber){ /* 移动内部结果的指针 */ return mysql_data_seek($this->Result, $rowNumber); } function dbName($row, $field = NULL){ /* 取得结果数据 */ if(empty($field)){ return mysql_db_name($this->Result, $row); } return mysql_db_name($this->Result, $row, $field); } function dbQuery($DBName, $queryString){ /* 发送一条 MySQL 查询 */ $this->Result = mysql_db_query($DBName, $queryString, $this->LinkId); return $this->Result?true:false; } function dropDB($DBName){ /* 丢弃(删除)一个 MySQL 数据库 */ return mysql_drop_db($DBName, $this->LinkId); } function errno(){ /* 返回上一个 MySQL 操作中的错误信息的数字编码 */ return mysql_errno($this->LinkId); } function error(){ /* 返回上一个 MySQL 操作产生的文本错误信息 */ return mysql_error($this->LinkId); } function escapeString($unescapedString){ /* 转义一个字符串用于 mysql_query */ return mysql_escape_string($unescapedString); } function fetchArray($Rows = 0, $resultType = MYSQL_BOTH){ /* 从结果集中取得一行作为关联数组,或数字数组,或二者兼有 */ if(!is_resource($this->Result)){ return false; } $fetchArray = mysql_fetch_array($this->Result, $resultType); if($fetchArray && $Rows){$this->Rows++;} return $fetchArray; } function fetchAssoc($Rows = 0){ /* 从结果集中取得一行作为关联数组 */ if(!is_resource($this->Result)){ return false; } $fetchAssoc = mysql_fetch_assoc($this->Result); if($fetchAssoc && $Rows){$this->Rows++;} return $fetchAssoc; } function fetchField($fieldOffset = NULL){ /* 从结果集中取得列信息并作为对象返回 */ if(empty($fieldOffset)){ return mysql_fetch_field($this->Result, $fieldOffset); } return mysql_fetch_field($this->Result); } function fetchLengths(){ /* 取得结果集中每个输出的长度 */ return mysql_fetch_lengths($this->Result); } function fetchObject($Rows = 0){ /* 从结果集中取得一行作为对象 */ if(!is_resource($this->Result)){ return false; } $fetchObject = mysql_fetch_object($this->Result); if(is_object($fetchObject) && $Rows){$this->Rows++;} return is_object($fetchObject)?$fetchObject:false; } function fetchRow($Rows = 0){ /* 从结果集中取得一行作为枚举数组 */ if(!is_resource($this->Result)){ return false; } $fetchRow = mysql_fetch_row($this->Result); if($fetchRow && $Rows){$this->Rows++;} return $fetchRow; } function fieldFlags($fieldOffset){ /* 从结果中取得和指定字段关联的标志 */ return mysql_field_flags($this->Result, $fieldOffset); } function fieldLen($fieldOffset){ /* 返回指定字段的长度 */ return mysql_field_len($this->Result, $fieldOffset); } function fieldName($fieldIndex){ /* 取得结果中指定字段的字段名 */ return mysql_field_name($this->Result, $fieldIndex); } function fieldSeek($fieldOffset){ /* 将结果集中的指针设定为制定的字段偏移量 */ return mysql_field_seek($this->Result, $fieldOffset); } function fieldTable($fieldOffset){ /* 取得指定字段所在的表名 */ return mysql_field_table($this->Result, $fieldOffset); } function fieldType($fieldOffset){ /* 取得结果集中指定字段的类型 */ return mysql_field_type($this->Result, $fieldOffset); } function freeResult(){ /* 释放结果内存 */ return mysql_free_result($this->Result); } function getClientInfo(){ /* 取得 MySQL 客户端信息 */ return mysql_get_client_info(); } function getHostInfo(){ /* 取得 MySQL 主机信息 */ return mysql_get_host_info($this->LinkId); } function getProtoInfo(){ /* 取得 MySQL 协议信息 */ return mysql_get_proto_info($this->LinkId); } function getServerInfo(){ /* 取得 MySQL 服务器信息 */ return mysql_get_server_info($this->LinkId); } function info(){ /* 取得最近一条查询的信息 */ return mysql_info($this->LinkId); } function insertId(){ /* 取得上一步 INSERT 操作产生的 ID */ return mysql_insert_id($this->LinkId); } function listDBs(){ /* 列出 MySQL 服务器中所有的数据库 */ $this->Result = mysql_list_dbs($this->LinkId); return $this->Result?true:false; } function listFields($DBName, $tableName){ /* 列出 MySQL 结果中的字段 */ $this->Result = mysql_list_fields($DBName, $tableName, $this->LinkId); return $this->Result?true:false; } function listProcesses(){ /* 列出 MySQL 进程 */ $this->Result = mysql_list_processes($this->LinkId); return $this->Result?true:false; } function listTables($DBName = ''){ /* 列出 MySQL 数据库中的表 */ $DBName = empty($DBName)?$this->DBName:$DBName; $this->Result = mysql_list_tables($DBName, $this->LinkId); return $this->Result?true:false; } function numFields(){ /* 取得结果集中字段的数目 */ return mysql_num_fields($this->Result); } function numRows(){ /* 取得结果集中行的数目 */ return mysql_num_rows($this->Result); } function pconnect($DBHost = '', $DBUser = '', $DBPswd = ''){ /* 打开一个到 MySQL 服务器的持久连接 */ $connect = @mysql_pconnect(empty($DBHost)?$this->DBHost:$DBHost, empty($DBUser)?$this->DBUser:$DBUser, empty($DBPswd)?$this->DBPswd:$DBPswd); if(!is_resource($connect)){ $this->halt("连接数据库失败!",1); return false; } $this->LinkId = $connect; return true; } function ping(){ /* Ping 一个服务器连接,如果没有连接则重新连接 */ return mysql_ping($this->LinkId); } function query($queryString){ /* 发送一条 MySQL 查询 */ if(empty($queryString)){ $this->halt("SQL 语句为空!", 1); return false; } if(!is_resource($this->LinkId)){ $this->halt("请先确保数据库已经连接上!", 1); return false; } $this->Result = mysql_query($queryString, $this->LinkId);// or die(mysql_error());//print_r($this); return $this->Result?true:false; } function realEscapeString($unescapedString){ /* 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 */ return mysql_real_escape_string($unescapedString, $this->LinkId); } function result($row, $field = NULL){ /* 取得结果数据 */ if(empty($field)){ return mysql_result($this->Result, $row, $field); } return mysql_result($this->Result, $row); } function selectDB($DBName = 'test'){ /* 选择 MySQL 数据库 */ return mysql_select_db(empty($DBName)?$this->$DBName:$DBName, $this->LinkId); } function stat(){ /* 取得当前系统状态 */ return mysql_stat($this->LinkId); } function tablename($index){ /* 取得表名 */ return mysql_tablename($this->Result, $index); } function threadId(){ /* 返回当前线程的 ID */ return mysql_thread_id($this->LinkId); } function unbufferedQuery($queryString){ /* 向 MySQL 发送一条 SQL 查询,并不获取和缓存结果的行 */ $this->Result = mysql_unbuffered_query($queryString,$this->LinkId); return $this->Result?true:false; } /*-- 上面的方法名跟手册上 MySQL 的那些函数名是一对一的,除了“splitDSN”和“构造函数” --*/ /*-- 下面是扩展,也就是说下面的这些方法在手册上是找不到影子的 --*/ function free(){ /* 释放结果内存,效果 freeResult 一样,只是这样简单些,少写几个字母,算是别名吧~ ^_^ */ return $this->freeResult(); } function setMustBeHalt($MustBeHalt = false){ $this->MustBeHalt = $MustBeHalt; } function getMustBeHalt(){ return $this->MustBeHalt; } /* 以下是支持事物扩展 */ function setAutoCommit($AutoCommit = 1){ /* 默认为不支持事务 */ mysql_query("SET AUTOCOMMIT = ".$AutoCommit); } function begin(){ /* 事务开始 */ @mysql_query("LOCK TABLES"); @mysql_query("UNLOCK TABLES"); $this->setAutoCommit(0); mysql_query("BEGIN"); } function rollback(){ /* 回滚,继续默认的不支持事务 */ mysql_query("ROLLBACK"); @mysql_query("UNLOCK TABLES"); $this->setAutoCommit(1); } function commit(){ /* 事务结束,继续默认的不支持事务 */ mysql_query("COMMIT"); @mysql_query("UNLOCK TABLES"); $this->setAutoCommit(1); } /* 以上是支持事物扩展 */ function getRows(){ /* 取得已经读出的数据记录数 */ return $this->Rows; } function getDBName(){ return $this->DBName; } function nextRecord($resultType = 0){ /* 跟 phplib 接轨,同 phplib 的 next_record */ $record = NULL; switch($resultType){ case 1: $record = @mysql_fetch_assoc($this->Result); $this->RecordCase = 1; break; case 2: $record = @mysql_fetch_row($this->Result); $this->RecordCase = 2; break; case 3: $record = @mysql_fetch_object($this->Result); $this->RecordCase = 3; break; default: $record = @mysql_fetch_array($this->Result); $this->RecordCase = 0; break; } if(is_resource($record)){ $this->Record = $record; }else{ return false; } } function f($fieldName){ /* 跟 phplib 接轨 */ switch($this->RecordCase){ case 3: return is_object($this->Record)?$this->Record->$fieldName:NULL; break; default: return $this->Record[$fieldName]; break; } } /* 下面的自己可以定义格式 */ function halt($msg = "未知错误!", $MustBeHalt = 0){ echo $msg; if($MustBeHalt !== 0 || $this->getMustBeHalt()){ die(); } } /* 下面的可要可不要,因为得PHP5才行 */ function __get($nm){ if(isset($this->$nm)){ // }else{ $this->halt("没有的成员变量 :$nm/n",1); } } function __set($nm, $val){ // } function __call($m, $a){ print "<hr>调用不存在的方法——".$m."(".join(",",$a).")!/n"; echo '<pre>'; var_dump($a); echo '</pre>'; $this->halt("<hr>"); } } // End DummyMySQLClass ?> <?php /** function __autoload($className) { include_once $className . ".php"; } $DMC = new DummyMySQLClass("localhost","root","","test"); //print_r($DMC); */ //--------------------------------------------------------- //--------------------------------------------------------- //--------------------------------------------------------- /**4 $DMC->query("SELECT * FROM `purchase_product` LIMIT 1"); while($fetchObject = $DMC->fetchObject(3)){ echo $DMC->fieldName(0).'<br>'; // 效果如:ID echo $DMC->fieldType(0).'<br>'; echo $DMC->fieldLen(0).'<br>'; // 效果如:9 print_r($DMC->fieldFlags(0)); // 效果如:not_null primary_key auto_increment echo '<hr>合起来的效果:<br>'; echo '`'.$DMC->fieldName(0).'` '.$DMC->fieldType(0).'('.$DMC->fieldLen(0).') '.str_replace(array("NOT_NULL","PRIMARY_KEY"),array("NOT NULL","PRIMARY KEY"),strtoupper($DMC->fieldFlags(0))).",/n<br>"; } //下面这是秘籍!!^_^ $DMC->query("show create table `purchase_product`"); while($fetchObject = $DMC->fetchObject(3)){ $t = 'Create Table';print_r($fetchObject->$t); } */ //--------------------------------------------------------- /**4 echo "getHostInfo() --- ".$DMC->getHostInfo().'<br>'; echo "getClientInfo() - ".$DMC->getClientInfo().'<br>'; echo "getProtoInfo() -- ".$DMC->getProtoInfo().'<br>'; echo "getServerInfo() - ".$DMC->getServerInfo().'<br>'; echo "info() ---------- ".$DMC->info().'<br>'; */ //--------------------------------------------------------- /**3 //取得指定库的所有表 $DMC->listTables("test"); while($row = $DMC->fetchRow()){ print "Table: ".$row[0]."/n"; } //下面for的效果跟上面while的一样 for ($i = 0; $i < $DMC->numRows(); $i++){ printf ("Table: %s/n", $DMC->tablename($i)); } */ //--------------------------------------------------------- /**2 //数据查询 $DMC->query("SELECT * FROM `purchase_product` LIMIT 1"); while($fetchObject = $DMC->fetchObject(3)){ print_r($fetchObject); print_r($DMC->fetchLengths()); // 是记录的长度,不是字段的长度 //print_r($DMC); } */ //--------------------------------------------------------- /**1 // 取得指定库指定表名称的字段 $DMC->listFields("test","purchase_product"); $a = $DMC->numFields(); for($i=0; $i<$a; $i++){ echo $DMC->fieldName($i).' '; } */ ///////////////////////////////////////////////// // // // 环境:PHP5.0.2 + APACHE:2.0.52 +Win2Kp_sp4 // // // ///////////////////////////////////////////////// ?>
================================待续======================================