標籤:
計應134(實驗班)詹加全
對於資料庫的操作,無非就是以下幾個點:
- 如何串連到資料庫
- 如何執行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‘;
}
?>
或者
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.
選擇使用的資料庫
在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
或者
<?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().如果函數沒有返回行,迴圈將會停止執行。可以為:
$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();
解釋一下。
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資料庫訪問