PHP 16: MySql的数据库访问

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 原文: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.gif img_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下却运行正常。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
15天前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
16天前
|
存储 SQL 关系型数据库
MySQL的安装&数据库的简单操作
本文介绍了数据库的基本概念及MySQL的安装配置。首先解释了数据库、数据库管理系统和SQL的概念,接着详细描述了MySQL的安装步骤及其全局配置文件my.ini的调整方法。文章还介绍了如何启动MySQL服务,包括配置环境变量和使用命令行的方法。最后,详细说明了数据库的各种操作,如创建、选择和删除数据库的SQL语句,并提供了实际操作示例。
58 13
MySQL的安装&数据库的简单操作
|
3天前
|
关系型数据库 Unix MySQL
MySQL是一种关系型数据库管理系统
MySQL是一种关系型数据库管理系统
11 2
|
5天前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
17 2
|
11天前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
22 4
|
11天前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
|
7天前
|
SQL 安全 Java
探索研究Servlet 数据库访问
【9月更文挑战第28天】
17 0
|
29天前
|
NoSQL 关系型数据库 PHP
php连接数据库
要使用PHP连接PolarDB或MongoDB数据库,需先准备连接信息,并编写相应代码。对于PolarDB,需设置主机地址、端口、数据库名及凭据,使用`pg_connect`函数建立连接;而对于MongoDB副本集,需安装MongoDB PHP驱动,通过`MongoDB\Client`连接指定的副本集实例。请确保替换示例代码中的占位符为实际值,并正确配置副本集名称和主机信息。更多详细信息与示例代码,请参考相关链接。
135 72
|
9天前
|
SQL 关系型数据库 数据库连接
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
本文介绍了PHP中PDO(PHP Data Objects)扩展的基本概念和使用方法。内容包括PDO类和PDOStatement类的介绍,PDO的简单使用,预定义占位符的使用方法,以及PDOStatement对象的使用。文章还讨论了绑定预定义占位符参数的不同形式,即bindValue和bindParam的区别。通过具体示例,展示了如何使用PDO进行数据库连接、数据查询、数据插入等操作。
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
|
9天前
|
SQL 关系型数据库 MySQL
php学习笔记-连接操作mysq数据库(基础)-day08
本文介绍了PHP中连接操作MySQL数据库的常用函数,包括连接服务器、设置字符集、关闭连接、选择数据库、结果集释放、获取影响行数以及遍历结果集等操作。通过书籍查询的实例演示了如何使用这些函数进行数据库操作,并提供了一个PHP操纵MySQL数据库的模板。
php学习笔记-连接操作mysq数据库(基础)-day08
下一篇
无影云桌面