PHP 16: MySql的数据库访问-阿里云开发者社区

开发者社区> 杰克.陈> 正文

PHP 16: MySql的数据库访问

简介: 原文:PHP 16: MySql的数据库访问本章介绍PHP访问MySql的方法。如果你对MySQL不是很清晰,可以参看PHP 17: MySQL的简单介绍。对于数据库的操作,无非就是以下几个点: 如何连接到数据库 如何执行SQL 如何返回数据结果集 如何从结果集取出数据 关闭连接  以上就是数据库的常规操作。
+关注继续查看
原文: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 
或者
img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gif
<?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   img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gifimg_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
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下却运行正常。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
多样化实现Windows Phone 7本地数据库访问&lt;下&gt;
  在上一篇多样化实现Windows Phone 7本地数据库访问采用两种方式Effproze和SQlite来验证Window Phone 7访问本地数据库.验证结论是可行的.  得到圆友及时反馈当然也发现一些细节上问题.
792 0
MySQL---数据库从入门走向大神系列(七)-Java访问数据库配置及简单使用方法execute
从操作配置文件properties中读取连接字符串,通过该字符串进行数据连接,需要写三个文件其中,两个是java类,一个是后缀名为.properties的文件,该文件放在src工作目录下。
974 0
论数据库访问组件的选择--火地晋大作读后感
前言 火地晋做了一件有意义的事情。把这些ORM对比了一下(http://www.cnblogs.com/yelaiju/p/3209506.html)。 这里要讨论一下我们用一个什么样的策略来选择数据库访问组件。
776 0
fbh
cmd命令行访问远程mysql数据库
要想远程访问mysql数据库,需要在本地安装mysql数据库软件,客户端软件也可以。 然后在cmd下执行 mysql -uhello -pworld -h192.
1248 0
SQLServer 数据库变成单个用户后无法访问问题的解决方法
今天不知怎么点错了东西,SQLServer中的一个数据库变成单用户了,而且无法访问,下面是解决方法,有需要的朋友可以参考一下   解决办法是: 运行下面SQL 复制代码 代码如下: USE master;  GO  ...
753 0
php访问url的四种方式
1.fopen方式 2.file_get_contents方式(打开远程文件的时候会造成CPU飙升。file_get_contents其实也可以post) 3.curl方式4.fsockopen方式(只能获取网站主页信息,其他页面不可以)以上就是php访问url的四种方式的详细内容,更多请关注php...
629 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载