PHP 16: MySql的数据库访问

系统 1320 0
原文: PHP 16: MySql的数据库访问

本章介绍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 ' ;
  }
  
?>  
或者
 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 16: MySql的数据库访问


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论