先來操做函數部分,廣泛的MySQL 函數方法,但隨着PHP5的發展,有些函數使用的要求加劇了,有些則將廢棄不用,有些則參數必填...php
===============================================================================================================================mysql
說PHP就不能不提MySQL,而要講MySQL,那麼PHP也是必然要被提起。PHP的迅速崛起,離不開MySQL,而MySQL的普遍應用,也與PHP休慼相關。 sql
下面詳細分析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 ide
$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個):
一、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()函數配合使用,單獨使用它就沒有意義了!
二、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個):
一、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開始的!
二、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()執行速度快,而且都是對下一行數據進行讀取。
三、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 : 此函數功能少,但使用方便。
四、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->字段名
五、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個):
一、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!";
?>
二、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個):
一、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>";
?>
其實這也能夠經過下面這個函數來達到一樣的目的。
二、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個):
一、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命令
二、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 // // // ///////////////////////////////////////////////// ?>
================================待續======================================