原文:
PHP 16: MySql的數據庫訪問
對于MySQL而言,由于其版本不同,訪問數據庫的方法也不同。PHP4有個MySQL一般的訪問方法,過程都是以"mysql_"為前綴的。當到了PHP5,除了它,還擴展了這個方法。并且以2種形式表現,一種是面向對象的,一種是以"mysqli_"開頭的過程函數。
以下介紹的將分為面向對象以及過程方法來描述。
建立一個連接
面向對象的連接
我們可以用以下語句來建立MySQL的連接
過程方法的連接
上面對應的過程方法是
在這里需要說明的是mysqli的大多數過程函數都有一個對應的面向接口。通常情況下,過程函數都是以mysqli_開始的,同時需要傳入 mysqli_connect 返回的數據庫連接資源。
嘗試連接的結果需要檢查,萬一不成功也好做出相應的處理呀。對于此,可以實用mysqli_connect_errno()來處理。
代碼可以如下
選擇使用的數據庫
在SQL里面,我們可以使用如下SQL來選擇數據庫
執行SQL語句
要查詢數據庫,我們可以使用mysql_query()函數,在進行此操作前最好把你的sql建立以下,例如
現在我們可以調用以下的方式來執行SQL語句。
< ?php
$db? = ?mysqli_connect("localhost",?"bm_user",?"password",?"bookmarks");
/* ?check?connection? */
if ?(mysqli_connect_errno())?{
???printf("Connect?failed:? % s\n",?mysqli_connect_error());
??? exit ();
}
/* ?Create?table?doesn't?return?a?resultset? */
if ?(mysqli_query($db," CREATE ? TEMPORARY ? TABLE ?mybookmark? LIKE ?bookmark")? === ?TRUE)?{
???printf(" Table ?mybookmark?successfully?created.\n");
}
else
{
????echo? ' error<br> ' ;
}
$sql = " select ? * ? from ?bookmark?limit? 10 ";
/* ?Select?queries?return?a?resultset? */
if ?($result? = ?mysqli_query($db,$sql))?{
???printf(" Select ?returned? % d?rows.\n",?$result -> num_rows);
??? /* ?free?result?set? */
????mysqli_free_result($result);
}
if ?($result? = ?mysqli_query($db," SELECT ? * ? FROM ?mybookmark",?MYSQLI_USE_RESULT))?{
??? if ?(mysqli_query($db," SET ? @a : = ' this?will?not?work ' "))?{
???????printf("Error:? % s\n",?$db -> error);
???}
???mysqli_free_result($result);
}
mysqli_close($db);
? > ?
??
簡單吧。
對查詢結果的處理
首先確定結果集的行數。我們可以利用下面的代碼實現它。
那么,我想得到每一列值怎么辦呢?很簡單,調用
除了上面的方法還有沒有其他方法得到每一行呢?還有2種方法:
1) 獲取每一行的枚舉數組
??? 可以為??
2) 還有一種方法就是將每行返回到一個對象里。
? 可以為
? ?? $row = $result -> fetch_object()
?? 或??
??
斷開數據庫連接
在前面已經見到了,
結果集的釋放:
數據庫的關閉:
使用Prepared語句
?這個功能有點類似.net SqlParameter.
?先舉個例子
line 1,需要注意的是2個問號。表示每個數據的位置。在C#里確實@+列名。
line 2:調用 $db -> prepare()構建一個需要處理的資源,過程函數是mysqli_stmt_prepare().
line 3:調用 stmt -> bind_param將相應的值綁定到相應的位置上。過程函數是mysqli_stmt_bind_param.
line 4:執行語句。
需要注意的是,在PHP5RC2版本里,Windows下執行有時會crash掉,但在unix下卻運行正常。
本章介紹PHP訪問MySql的方法。
如果你對MySQL不是很清晰,可以參看
PHP 17: MySQL的簡單介紹
。
對于數據庫的操作,無非就是以下幾個點:
- 如何連接到數據庫
- 如何執行SQL
- 如何返回數據結果集
- 如何從結果集取出數據
- 關閉連接
對于MySQL而言,由于其版本不同,訪問數據庫的方法也不同。PHP4有個MySQL一般的訪問方法,過程都是以"mysql_"為前綴的。當到了PHP5,除了它,還擴展了這個方法。并且以2種形式表現,一種是面向對象的,一種是以"mysqli_"開頭的過程函數。
以下介紹的將分為面向對象以及過程方法來描述。
建立一個連接
面向對象的連接
我們可以用以下語句來建立MySQL的連接
1
?
@?
$db
=
new
?mysqli(
'
localhost
'
,
'
root
'
,
'
pwd
'
,
'
mysql
'
);
簡單描述以下,這里建立一個mysqli的類,它傳入mysql所在的主機名,然后是用戶名,用戶密碼,以及訪問的數據庫。
過程方法的連接
上面對應的過程方法是
?@?
$db
=
mysqli_connect
(
'
localhost
'
,
'
root
'
,
'
pwd
'
,
'
mysql
'
);
此函數返回的不是一個對象,而是一個連接數據的資源。如果你使用過程方法,必須將資源傳遞到mysqli的所有其他函數。
在這里需要說明的是mysqli的大多數過程函數都有一個對應的面向接口。通常情況下,過程函數都是以mysqli_開始的,同時需要傳入 mysqli_connect 返回的數據庫連接資源。
嘗試連接的結果需要檢查,萬一不成功也好做出相應的處理呀。對于此,可以實用mysqli_connect_errno()來處理。
代碼可以如下
<?
php
?@? $db = new ?mysqli ( ' localhost ' , ' root ' , ' password ' , ' mysql ' );
? if ( mysqli_connect_errno ())
?{
?????? echo ? ' Error:?Can?not?connect?to?database. ' ;
??}
?? else
??{
?????? echo ? ' Connect?to?database?OK ' ;
??}
??
?> ?
或者
?@? $db = new ?mysqli ( ' localhost ' , ' root ' , ' password ' , ' mysql ' );
? if ( mysqli_connect_errno ())
?{
?????? echo ? ' Error:?Can?not?connect?to?database. ' ;
??}
?? else
??{
?????? echo ? ' Connect?to?database?OK ' ;
??}
??
?> ?
?1
?
<?
php
?2 ? ?@? $db = mysqli_connect ( ' localhost ' , ' root ' , ' password ' , ' mysql ' );
?3 ? ? if ( mysqli_connect_errno ())
?4 ? ?{
?5 ? ?????? echo ? ' Error:?Can?not?connect?to?database. ' ;
?6 ? ??}
?7 ? ?? else
?8 ? ??{
?9 ? ?????? echo ? ' Connect?to?database?OK ' ;
10 ? ??}
11 ? ??
12 ? ?> ?
mysqli_connect_errno()將返回一個連接數據庫出現的錯誤代碼,如果連接成功,返回0.
?2 ? ?@? $db = mysqli_connect ( ' localhost ' , ' root ' , ' password ' , ' mysql ' );
?3 ? ? if ( mysqli_connect_errno ())
?4 ? ?{
?5 ? ?????? echo ? ' Error:?Can?not?connect?to?database. ' ;
?6 ? ??}
?7 ? ?? else
?8 ? ??{
?9 ? ?????? echo ? ' Connect?to?database?OK ' ;
10 ? ??}
11 ? ??
12 ? ?> ?
選擇使用的數據庫
在SQL里面,我們可以使用如下SQL來選擇數據庫
use
?mysql
那么在PHP里呢?我們可以使用如下代碼:
1
?
$db
->
select_db(dbname)
//
dbname為你選擇的數據庫
或者
1
?
mysqli_select_db(db_resource,dbname)
//
db_resource就是前面提到的數據庫的連接資源
執行SQL語句
要查詢數據庫,我們可以使用mysql_query()函數,在進行此操作前最好把你的sql建立以下,例如
$query
=
"
select
?
*
?
from
?bookmark
where
bm_url
like
?
'
abc
'
";
需要說明的一點是,這里不需要在SQL語句后加一個分號,這和在MySQL監視器里是不一樣的。
現在我們可以調用以下的方式來執行SQL語句。
$result
=
$db
->
query($query)
以上是面向對象的方法,過程方法可以為:
$result
=
mysqli_qurey($db,$query)
面向對象版本返回一個結果對象,過程版本返回一個資源。無論何種方法,都會降結果保存在一個變量里($result)中,這個函數執行失敗,將返回false。Ok,給個實例吧。
?1
?
<
?php
?2 ? $db? = ?new?mysqli("localhost",?"bm_user",?"password",?"bookmarks");
?3 ?
?4 ? /* ?check?connection? */
?5 ? if ?(mysqli_connect_errno())?{
?6 ? ???printf("Connect?failed:? % s\n",?mysqli_connect_error());
?7 ? ??? exit ();
?8 ? }
?9 ?
10 ?
11 ? /* ?Create?table?doesn't?return?a?resultset? */
12 ? if ?($db -> query(" CREATE ? TEMPORARY ? TABLE ?mybookmark? LIKE ?bookmark")? === ?TRUE)?{
13 ? ???printf(" Table ?mybookmark?successfully?created.\n");
14 ? }
15 ? else
16 ? {
17 ? ????echo? ' error<br> ' ;
18 ? }
19 ?
20 ? $sql = " select ? * ? from ?bookmark?limit? 10 ";
21 ? /* ?Select?queries?return?a?resultset? */
22 ? if ?($result? = ?$db -> query($sql))?{
23 ? ???printf(" Select ?returned? % d?rows.\n",?$result -> num_rows);
24 ?
25 ? ??? /* ?free?result?set? */
26 ? ???$result -> close ();
27 ? }
28 ?
29 ? if ?($result? = ?$db -> query(" SELECT ? * ? FROM ?mybookmark",?MYSQLI_USE_RESULT))?{
30 ?
31 ? ??? if ?($db -> query(" SET ? @a : = ' this?will?not?work ' "))?{
32 ? ???????printf("Error:? % s\n",?$db -> error);
33 ? ???}
34 ? ???$result -> close ();
35 ? }
36 ?
37 ? $db -> close ();
38 ? ? > ?
39 ? ??
40 ?
或者
?2 ? $db? = ?new?mysqli("localhost",?"bm_user",?"password",?"bookmarks");
?3 ?
?4 ? /* ?check?connection? */
?5 ? if ?(mysqli_connect_errno())?{
?6 ? ???printf("Connect?failed:? % s\n",?mysqli_connect_error());
?7 ? ??? exit ();
?8 ? }
?9 ?
10 ?
11 ? /* ?Create?table?doesn't?return?a?resultset? */
12 ? if ?($db -> query(" CREATE ? TEMPORARY ? TABLE ?mybookmark? LIKE ?bookmark")? === ?TRUE)?{
13 ? ???printf(" Table ?mybookmark?successfully?created.\n");
14 ? }
15 ? else
16 ? {
17 ? ????echo? ' error<br> ' ;
18 ? }
19 ?
20 ? $sql = " select ? * ? from ?bookmark?limit? 10 ";
21 ? /* ?Select?queries?return?a?resultset? */
22 ? if ?($result? = ?$db -> query($sql))?{
23 ? ???printf(" Select ?returned? % d?rows.\n",?$result -> num_rows);
24 ?
25 ? ??? /* ?free?result?set? */
26 ? ???$result -> close ();
27 ? }
28 ?
29 ? if ?($result? = ?$db -> query(" SELECT ? * ? FROM ?mybookmark",?MYSQLI_USE_RESULT))?{
30 ?
31 ? ??? if ?($db -> query(" SET ? @a : = ' this?will?not?work ' "))?{
32 ? ???????printf("Error:? % s\n",?$db -> error);
33 ? ???}
34 ? ???$result -> close ();
35 ? }
36 ?
37 ? $db -> close ();
38 ? ? > ?
39 ? ??
40 ?

< ?php
$db? = ?mysqli_connect("localhost",?"bm_user",?"password",?"bookmarks");
/* ?check?connection? */
if ?(mysqli_connect_errno())?{
???printf("Connect?failed:? % s\n",?mysqli_connect_error());
??? exit ();
}
/* ?Create?table?doesn't?return?a?resultset? */
if ?(mysqli_query($db," CREATE ? TEMPORARY ? TABLE ?mybookmark? LIKE ?bookmark")? === ?TRUE)?{
???printf(" Table ?mybookmark?successfully?created.\n");
}
else
{
????echo? ' error<br> ' ;
}
$sql = " select ? * ? from ?bookmark?limit? 10 ";
/* ?Select?queries?return?a?resultset? */
if ?($result? = ?mysqli_query($db,$sql))?{
???printf(" Select ?returned? % d?rows.\n",?$result -> num_rows);
??? /* ?free?result?set? */
????mysqli_free_result($result);
}
if ?($result? = ?mysqli_query($db," SELECT ? * ? FROM ?mybookmark",?MYSQLI_USE_RESULT))?{
??? if ?(mysqli_query($db," SET ? @a : = ' this?will?not?work ' "))?{
???????printf("Error:? % s\n",?$db -> error);
???}
???mysqli_free_result($result);
}
mysqli_close($db);
? > ?
??
對查詢結果的處理
首先確定結果集的行數。我們可以利用下面的代碼實現它。
$num_rows
=
$result
->
num_rows;
或
$num_rows
=
mysqli_num_rows($result)
得到了結果的行數之后,我們就可以處理每個結果了。例如可以有以下代碼:
1
?
for
(
$index
=
0
;
$index
<
num_rows;
$index
++
)
2 ? {
3 ? ?? // Your?code?here?to?handle?each?record.
4 ? ??
5 ? }
為了得到每一行,我們可以調用$result->fetch_assoc()函數或者mysqli_fetch_assoc().如果函數沒有返回行,循環將會停止執行。可以為:
2 ? {
3 ? ?? // Your?code?here?to?handle?each?record.
4 ? ??


5 ? }
$row
=
$result
->
fetch_assoc()
或
$row
=
mysqli_fetch_assoc
(
$result
)
來實現,如果你曾經在VC里用ODBC操作數據庫的話,你會發現有些類似。
那么,我想得到每一列值怎么辦呢?很簡單,調用
$row
[
'
bm_url
'
]
字符串'bm_url'就是列名。
除了上面的方法還有沒有其他方法得到每一行呢?還有2種方法:
1) 獲取每一行的枚舉數組
??? 可以為??
$row
=
$result
->
fetch_row()
? 或??
$row
=
mysqli_fetch_row
(
$result
)
屬性值就是每個數組值,例如$row[0],$row[1]等。
2) 還有一種方法就是將每行返回到一個對象里。
? 可以為
? ?? $row = $result -> fetch_object()
?? 或??
$row
=
mysqli_fetch_object
(
$result
)
如果訪問個列值,實用$row->username,$row->bm_url
??
斷開數據庫連接
在前面已經見到了,
結果集的釋放:
$result
->
free()
.
或者
mysqli_free_result
(
$result
)
.
數據庫的關閉:
$db
->
close()
或者
mysql_close
(
$db
)
使用Prepared語句
?這個功能有點類似.net SqlParameter.
?先舉個例子
1
?
$insertSql
=
"
Insert?into?bookmark?values(?,?)
"
;
2 ? ? $stmt = $db -> prepare( $insertSql );
3 ? ? $stmt -> bind_param( $username , $bookmark_url );
4 ? ? $stmt -> execute();
5 ? ? echo ? $stmt -> affected_rows . ' ?bookmarks?inserted?into?database. ' ;
6 ? ? $stmt -> close();
解釋一下。
2 ? ? $stmt = $db -> prepare( $insertSql );
3 ? ? $stmt -> bind_param( $username , $bookmark_url );
4 ? ? $stmt -> execute();
5 ? ? echo ? $stmt -> affected_rows . ' ?bookmarks?inserted?into?database. ' ;
6 ? ? $stmt -> close();
line 1,需要注意的是2個問號。表示每個數據的位置。在C#里確實@+列名。
line 2:調用 $db -> prepare()構建一個需要處理的資源,過程函數是mysqli_stmt_prepare().
line 3:調用 stmt -> bind_param將相應的值綁定到相應的位置上。過程函數是mysqli_stmt_bind_param.
line 4:執行語句。
需要注意的是,在PHP5RC2版本里,Windows下執行有時會crash掉,但在unix下卻運行正常。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
