php釋放資料庫連接,php與資料庫的連接

本文目錄一覽:

php及資料庫

PHP調用三種資料庫的方法

本文比較詳細的介紹PHP調用MySQL、ODBC以及ORACLE資料庫。

MySQL是一個小巧靈瓏的資料庫伺服器軟體,對於中、小型應用系統是非常理想的。除了支持標準的ANSI SQL語句外,最重要的是,它還支持多種平台,而在Unix/Linux系統上,MySQL支持多線程運行方式,從而能獲得相當好的性能。它和PHP、 Apache一樣,是屬於開放源代碼軟體。其官方網站是:,上面提供Windows,Linux,Unix版本的源代碼的下載。

注意,MySQL訪問函數都需要有相應的許可權才能運行。常用的相關函數介紹如下:

(1)integer mysql_connect(主機,用戶名,口令);

此函數開始一個對指定主機上的MySQL資料庫的連接。若該資料庫位於一個不同地埠,則在主機名後加上冒號和埠號。所有參數均為可選的,預設情況下分別對應為本地主機、用戶正在執行的腳本名和空。主機可以是IP地址或域名。

在腳本執行結束時,連接被自動關閉,也可以用mysql_close提前關閉。

(2)boolean mysql_create_db(資料庫名);

創建一個資料庫。注意必須用一個帶有創建資料庫許可權的帳號打開連接。

(3)boolean mysql_select_db(資料庫名,連接號);

選擇預設資料庫。

(4)integer mysql_query(SQL語句,連接號);

對指定資料庫進行查詢。如果SQL語句是select,則返回一個結果號,否則返回的值可以不理會。如果失敗,返回false.。

(5)array mysql_fetch_array(結果號);

取出下一行,返回一個數組.可以用數字下標訪問(第一個欄位是下標 0),也可以用字元串下標訪問(即使用各欄位名)。如已取了最後一行,返回 false.。

(6)mysql_fetch_row(結果號);

返回一個矩陣代表結果集中一行的所有域。每次調用都會產生下一行,直到沒有行剩下時返回false。每個域值都由一個從零開始的偏移量索引。這是從查詢中獲取結果的最快方法。

(7)integer mysql_num_rows(結果號);

返回結果集中行的數目

(8)integer mysql_num_fields(結果號);

返回結果集中域的數目。

(9)integer mysql_list_dbs();

向伺服器查詢資料庫列表。它返回一個結果指針,該指針可用於mysql_fetch_row函數及類似函數。

(10)mysql_list_tables(資料庫名);

獲取一個指向指定資料庫的表單列表的結果指針。該結果指針可用於任何從結果集中獲取行的函數。

(11)mysql_close(連接號);

關閉對資料庫的連接。連接必須是由mysql_connect打開的。該函數的使用不是嚴格必需的,因為在腳本結束時,所有非永久鏈路都會被自動關閉。

(12)mysql_pconnect(主機,用戶名,口令);

與mysql_connect完全相似,但建立一個”永久連接”,該連接一經建立永不關閉,即使使用mysql_close函數或程序執行完畢也不關閉.下一次試圖建立永久連接時,系統如發現已存在一個永久連接,則直接返回該連接號而不重新創建。

下面是一個調用MYSQL資料庫並分頁顯示的例子。

?

$pagesize = 5; //每頁顯示5條記錄

$host=”localhost”;

$user=”user”;

$password=”psw”;

$dbname=”book”; //所查詢的庫表名;

//連接MySQL資料庫

mysql_connect(“$host”,”$user”,”$password”) or die(“無法連接MySQL資料庫伺服器!”);

$db = mysql_select_db(“$dbname”) or die(“無法連接資料庫!”);

$sql = “select count(*) as total from pagetest”;//生成查詢記錄數的SQL語句

$rst = mysql_query($sql) or die(“無法執行SQL語句:$sql !”); //查詢記錄數

$row = mysql_fetch_array($rst) or die(“沒有更多的記錄!”); /取出一條記錄

$rowcount = $row[“total”];//取出記錄數

mysql_free_result($rst) or die(“無法釋放result資源!”); //釋放result資源

$pagecount = bcdiv($rowcount+$pagesize-1,$pagesize,0);//算出總共有幾頁

if(!isset($pageno)) {

$pageno = 1; //在沒有設置pageno時,預設為顯示第1頁

}

if($pageno1) {

$pageno = 1; //若pageno比1小,則把它設置為1

}

if($pageno$pagecount) {

$pageno = $pagecount; //若pageno比總共的頁數大,則把它設置為最後一頁

}

if($pageno0) {

$href = eregi_replace(“%2f”,”/”,urlencode($PHP_SELF));//把$PHP_SELF轉換為可以在URL上使用的字元串,這樣的話就可以處理中文目錄或中文文件名

if($pageno1){//顯示上一頁的褳接

echo “a href=”” . $href . “?pageno=” . ($pageno-1) . “”上一頁/a “;

}

else{

echo “上一頁”;

}

for($i=1;$i$pageno;$i++){

echo “a href=”” . $href . “?pageno=” . $i . “”” . $i . “/a “;

}

echo $pageno . ” “;

for($i++;$i=$pagecount;$i++){

echo “a href=”” . $href . “?pageno=” . $i . “”” . $i . “/a “;

}

if($pageno$pagecount){//顯示下一頁的褳接

echo “a href=”” . $href . “?pageno=” . ($pageno+1) . “”下一頁/a “;

}

else{

echo “下一頁 “;

}

$offset = ($pageno-1) * $pagesize;//算出本頁第一條記錄在整個表中的位置(第一條記錄為0)

$sql = “select * from pagetest LIMIT $offset,$pagesize”;//生成查詢本頁數據的SQL語句

$rst = mysql_query($sql);//查詢本頁數據

$num_fields = mysql_num_fields($rst);//取得欄位總數

$i = 0;

while($i$num_fields){//取得所有欄位的名字

$fields[$i] = mysql_field_name($rst,$i);//取得第i+1個欄位的名字

$i++;

}

echo “table border=”1″ cellspacing=”0″ cellpadding=”0″”;//開始輸出表格

echo “tr”;

reset($fields);

while(list(,$field_name)=each($fields)){//顯示欄位名稱

echo “th$field_name/th”;

}

echo “/tr”;

while($row=mysql_fetch_array($rst)){//顯示本頁數據

echo “tr”;

reset($fields);

while(list(,$field_name)=each($fields)){//顯示每個欄位的值

$field_value = $row[$field_name];

if($field_value==””){

echo “td /td”;

}

else{

echo “td$field_value/td”;

}

}

echo “/tr”;

}

echo “/table”;//表格輸出結束

mysql_free_result($rst) or die(“無法釋放result資源!”);//釋放result資源

}

else{

echo “目前該表中沒有任何數據!”;

}

mysql_close($server) or die(“無法與伺服器斷開連接!”);//斷開連接並釋放資源

?

開放資料庫連接(ODBC)已成為一種與資料庫進行通信的工業標準。PHP也提供了標準的介面,使得PHP能調用Access,SQL SERVER等資料庫。其相關函數是:

(1)integer odbc_connect(string dsn, string user, string password)

連接到一個ODBC資料庫源名字上。

(2)integer odbc_exec(integer connection, string query)或 odbc_do(integer connection, string query)

在一個連接上執行查詢。

(3)boolean odbc_fetch_row(integer result, integer row)

從一個結果集中獲取一行數據。Row參數是可選的,若為空缺,則返回下一個有效行。在結果集中不再剩餘行時返回false。

(4)boolean odbc_close(integer connection)

關閉一個資料庫的連接。若在該連接上有打開的事務,則返回一個錯誤,而且連接不會被關閉。

最後,還是看個分頁的例子:

?

//設定每頁顯示條數

$show_num = 10;

$spages = $pages;//避免$pages後期被改變

//定義連接

$dsn = “localhost”;

$user = “sa”;

$password = “”;

//計算總記錄數

$rs_num = “select count(*) as id from bbs where zu=’0′ and lei='”.$lei.”‘”;

$conn_id = odbc_connect($dsn,$user,$password);

$rnum = odbc_exec($conn_id,$rs_num);

while(odbc_fetch_row($rnum)){

$total_rs = odbc_result($rnum,”id”);//將總記錄數放入$total_rs變數

}

//計算與頁有關的條數

$nnn = $total_rs / $show_num;//計算總頁數

$hnnn = intval($nnn);//將總頁數取整

$cnnnn = $nnn – $hnnn;

//計算所需總頁數

switch ($cnnn){

case “0”:

$hnnn++;

$nnn = $hnnn;//總頁數

break;

default :

$nnn = $hnnn;//總頁數

break;

};

if ($nnn == 0)$nnn++;

//計算頁面改變所需的條件

$fore = $pages;

$next = $pages;

$fore -= 1;

$next += 1;

if ($fore 0) {

echo “a首頁/a”;

echo “a前頁/a”;

};

if ($pages $nnn) {

echo “a後頁/a”;

echo “a尾頁/a”;

};

echo “共”.$nnn.”頁”;

$query_string = “SELECT * FROM table where condition order by you wanted order”;

$cur = odbc_exec($conn_id,$query_string);

//取到循環的頂部

$cnum = ($pages-1) * $show_num;//計算當前的記錄游標的位置

//空循環到顯示記錄游標處

if ($cnum != 0){

for ($i=0;$i=$cnum;odbc_fetch_row($cur));

};

$i=1;

//顯示記錄

while(odbc_fetch_row($cur)){

echo ;

if ($i == $show_num){//在不滿頁數時跳出程序

break;

};

$i++;

};

//關閉連接

odbc_close($conn_id);

?

Oracle(甲骨文)是世界上最為流行的關係資料庫。它是大公司推崇的工業化的強有力的引擎。我們先看看其相關的函數:

(1)integer ora_logon(string user , string password)

開始對一個Oracle資料庫伺服器的連接。

(2)integer ora_open(integer connection)

打開給出的連接的游標。

(3)integer ora_do(integer connection, string query)

在給出的連接上執行查詢。PHP生成一個指示器,解析查詢,並執行之。

(4)integer ora_parse(integer cursor, string query)

解析一個查詢並準備好執行。

(5)boolean ora_exec(integer cursor)

執行一個先前由ora_parse函數解析過的查詢。

(6)boolean ora_fetch(integer cursor)

此函數會使得一個執行過的查詢中的行被取到指示器中。這使得您可以調用ora_getcolumn函數。

(7)string ora_getcolumn(integer cursor, integer column)

返回當前的值。列由零開始的數字索引。

(8)boolean ora_logoff(integer connection)

斷開對資料庫伺服器的鏈接。

以下是向ORACLE資料庫插入數據的示常式序:

html

headtitle向ORACLE資料庫中插入數據/title/head

body

form action=”?echo $PHP_SELF;?” method=”post”

table border=”1″ cellspacing=”0″ cellpadding=”0″

tr

thID/th

thname/th

thDescription/th

/tr

tr

tdinput type=”text” name=”name” maxlength=”50″ size=”10″/td

tdinput type=”text” name=”email” maxlength=”255″ size=”30″/td

tdinput type=”text” name=”Description” maxlength=”255″ size=”50″/td

/tr

tr align=”center”

td colspan=”3″input type=”submit” value=”提交”  input type=”reset” value=”重寫”/td

/tr

/table

/form

?

//先設置兩個環境變數ORACLE_HOME,ORACLE_SID

putenv(“ORACLE_HOME=/oracle/app/oracle/product/8.0.4”);

putenv(“ORACLE_SID=ora8”);

//設置網頁顯示中文

putenv(“NLS_LANG=Simplified_Chinese.zhs16cgb231280”);

if($connection=ora_logon(“scott”,”tiger”)) {

//庫表test有ID,name,Description三項

$sql = ‘insert into test(ID,name,Description) values ‘;

$sql .= ‘(” . $ID . ”,” . $name . ”,”. $Description . ”)’;

if($cursor=ora_do($connect,$sql)) {

print(“insert finished!”);

}

$query = ‘select * from test’;

if($cursor=ora_do($connect,$query)) {

ora_fetch($cursor);

$content0=ora_getcolumn($cursor,0);

$content1=ora_getcolumn($cursor,1);

$content2=ora_getcolumn($cursor,2);

print(“$content0”);

print(“$content1”);

print(“$content2”);

ora_close($cursor);

}

ora_logoff($connection);

}

?

/body

/html

通過PHP你可以輕鬆的連接到資料庫,請求數據並將其顯示在你的web站點中,甚至修改資料庫中的數據。 MySQL是一種很流行的資料庫,並且在互聯網中有許多有關PHP與MySQL的教程。MySQL是免費的,這一點也許就吸引了不少人。由於其廣泛應用, 我就不想在這裡贅述MySQL的使用方法了。Oracle被大量在企業應用中採用,因此我們就利用Oracle來介紹PHP與資料庫的連接。我們當然不會 提及Oracle資料庫的設計原理,原因是這已經超出了我們的討論範圍。

PHP提供了兩套函數與Oracle連接,分別是ORA_和OCI函數。其中ORA_函數略顯陳舊。OCI函數更新據說更好一些。兩者的使用語法幾乎相差無幾。如前所述,你的PHP安裝選項應該可以支持兩者的使用。

想獲得更多有關在Microsoft Windows平台上安裝支持PHP3的Apache伺服器的知識以及更多有關Oracle資料庫的知識,請查閱以下URL:。

4.1 連接

if ($conn=Ora_Logon(“user@TNSNAME”,”password”))

{

echo “SUCCESS ! Connected to database\n”;

}

else

{

echo “Failed :-( Could not connect to database\n”;

}

Ora_Logoff($conn);

phpinfo();

?

以上代碼使用TNSNAME(在你的tnsnames.ora文件中指明)定義的Oracle資料庫名稱、用戶名稱和密碼連接資料庫。在成功連接的基礎上,ora_logon函數返回一個非零的連接ID並儲存在變數$conn中。

4.2 查詢

假設與資料庫已經連接就緒,下面我們就來實際的應用對資料庫的查詢。下面的代碼演示了一個連接並查詢的典型例子:

/*

* 連接資料庫並執行查詢

*/

function printoraerr($in_cur)

{

// 檢查Oracle是否出錯

// 如果存在錯誤則顯示

// 當指針被激活時每次請求Oracle後調用該函數

if(ora_errorcode($in_cur))

echo “Oracle code – “.ora_error($in_cur).”\n”;

return;

}

/** 主程序 */

if (!($conn=ora_logon(“user@TNSNAME”,”password”)))

{

echo “Connection to database failed\n”;

exit;

}

echo “Connected as connection – $conn

\n”;

echo “Opening cursor …

\n”;

$cursor=ora_open($conn); printoraerr($cursor);

echo “Opened cursor – $cursor

\n”;

$qry=”select user,sysdate from dual”;

echo “Parsing the query $qry …

\n”;

ora_parse($cursor,$qry,0); printoraerr($cursor);

echo “Query parsed

\n”;

echo “Executing cursor …

\n”;

ora_exec($cursor); printoraerr($cursor);

echo “Executed cursor

\n”;

echo “Fetching cursor …

\n”;

while(ora_fetch($cursor))

{

$user=ora_getcolumn($cursor,0); printoraerr($cursor);

$sysdate=ora_getcolumn($cursor,1); printoraerr($cursor);

echo ” row = $user, $sysdate

\n”;

}

echo “Fetched all records

\n”;

echo “Closing cursor …

\n”;

ora_close($cursor);

echo “Closed cursor

\n”;

echo “Logging off from oracle…

\n”;

ora_logoff($conn);

echo “Logged off from oracle

\n”;

?

(譯者註:以上代碼段缺少注釋,請讀者參考PHP Manual的Oracle資料庫函數部分)

4.3 顯示結果

以下代碼演示了怎樣查詢資料庫並將結果輸出:

function printoraerr($in_cur, $conn)

{

// 檢查Oracle是否出錯

// 如果存在錯誤則顯示

// 當指針被激活時每次請求Oracle後調用該函數

// If it encountered an error, we exit immediately

if(ora_errorcode($in_cur))

{

echo “Oracle code – “.ora_error($in_cur).”

n”;

ora_logoff($conn);

exit;

}

return;

}

function exequery($w_qry,$conn)

{

$cursor=ora_open($conn); printoraerr($cursor,$conn);

ora_parse($cursor,$w_qry,0); printoraerr($cursor,$conn);

ora_exec($cursor); printoraerr($cursor,$conn);

$numrows=0;

$w_numcols=ora_numcols($cursor);

// 顯示頭部

echo ”

\n”;

for ($i=0;$i$w_numcols;$i++)

{

$align=(ora_columntype($cursor,$i)==”NUMBER”)?”RIGHT”:”LEFT”;

echo “\t “.ora_columnname($cursor,$i).” \n”;

}

echo ”

\n”;

while(ora_fetch($cursor))

{

echo ” \n”;

for ($i=0;$i$w_numcols;$i++)

{

$align=(ora_columntype($cursor,$i)==”NUMBER”)?”RIGHT”:”LEFT”;

if(ora_columntype($cursor,$i)==”LONG”)

echo ” “.

ora_getcolumn($cursor,$i).”

\n”;

else

echo ” “.ora_getcolumn($cursor,$i).” \n”;

printoraerr($cursor,$conn);

}

$numrows++;

echo ”

\n”;

}

if ($numrows==0)

echo ” Query returned no records

\n”;

else

{

echo ” \n”;

echo ” Count \n”;

echo ” $numrows \n”;

echo ”

\n”;

}

echo ” \n”;

ora_close($cursor);

return;

}

// 主程序

if(!($conn=ora_logon(“user@SID”,”password”)))

{

echo “Error: Cannot connect to database\n”;

exit;

}

$qry=”SELECT

deptno \”Dept\”

,empno \”Emp\”

,empnm \”Name\”

,salary \”Salary\”

FROM

employee

ORDER BY 1,2″;

exequery($qry);

ora_logoff($conn);

?

(譯者註:以上代碼段缺少注釋,請讀者參考PHP Manual的Oracle資料庫函數部分)

4.4 基於HTTP的Oracle登錄

將以下代碼加在PHP頁面代碼之前以確認Oracle登錄。注意你必須正確設定$ SID。

if(!isset($PHP_AUTH_USER))

{

Header(“WWW-authenticate: basic realm=\”$SID\””);

Header(“HTTP/1.0 401 Unauthorized”);

$title=”Login Instructions”;

echo “

You are not authorized to enter the site

\n”;

exit;

}

else

{

if (!($conn=ora_logon(“$PHP_AUTH_USER@$SID”,$PHP_AUTH_PW)))

{

Header(“WWW-authenticate: basic realm=\”$SID\””);

Header(“HTTP/1.0 401 Unauthorized”);

$title=”Login Instructions”;

echo “

You are not authorised to enter the site

\n”;

exit;

}

}

?

php頻繁刷新網頁運行一段時間後出現資料庫連接錯誤?

這是由於資料庫連接數過多導致的,說明之前建立的連接你沒有釋放。

看到你的需求是實時獲取資料庫裡面的內容,可以考慮使用內存資料庫,這樣返回的效率高,也會避免過多連接的錯誤。

可以使用redis和memcache來解決這個問題。代碼如下,記得首先要安裝redis,並且要安裝php-redis擴展。

?php

$redis = new Redis();

$redis-connect(‘127.0.0.1’, 6379);//serverip port

$redis-auth(‘mypassword’);//my redis password

$redis -set( “test” , “Hello World”);

echo $redis -get( “test”);

關於php 資料庫 連接和斷開

寫反了,先斷開連接,然後在退出

// 釋放結果集

mysql_free_result($result);

// 關閉連接

mysql_close($link);

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/197081.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-03 13:27
下一篇 2024-12-03 13:27

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝資料庫方案

    本文將介紹在openeuler操作系統中安裝資料庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟體源 sudo…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 資料庫第三範式會有刪除插入異常

    如果沒有正確設計資料庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係資料庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的資料庫存儲引擎

    本文將介紹兩款高性能的資料庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • Python怎麼導入資料庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的資料庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • Think-ORM數據模型及資料庫核心操作

    本文主要介紹Think-ORM數據模型建立和資料庫核心操作。 一、模型定義 Think-ORM是一個開源的ORM框架,用於簡化在PHP應用中(特別是ThinkPHP)與關係資料庫之…

    編程 2025-04-27
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若伺服器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27

發表回復

登錄後才能評論