目录
1 引言
(1)为实现网页访问后台数据库的功能,需要在网页代码中将其与对应的数据库进行连接。
(2)PHP 5 及以上版本建议使用以下方式连接 MySQL :
- MySQLi extension (“i” 意为 improved)。
- PDO (PHP Data Objects)。
(3)两种连接方式的比较:
- PDO 应用在 12 种不同数据库中, MySQLi 只针对 MySQL 数据库。
- 如果项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和部分查询语句即可。 如果使用 MySQLi 连接不同数据库,需要重新编写所有代码,包括查询。
- 两者都是面向对象, 但 MySQLi 还提供了 API 接口。
- 两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的。
(4)本节以简单的例子介绍实现PHP与SQL连接的全过程,主要介绍 MySQLi 方法。
2 PHP与SQL数据库交互实验演示
2.1 实验环境
(1)服务端:本实验基于虚拟机win2008系统的WAMP环境进行,该环境相关配置过程参考文章《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》。
(2)客户端:使用浏览器访问与控制。
(3)服务端与客户端处于同一个局域网下,开启服务端的phpstudy并确保能从客户端浏览器访问。
2.2 创建数据库
(1)通过访问phpMyAdmin登录数据库。管理员通过浏览器登录phpMyAdmin(位置位于网站默认根目录下的phpMyAdmin文件夹下),在浏览器中输入网址服务器IP/phpMyAdmin
进入mysql数据库的登录页面;输入用户名和密码并登录(默认用户名和密码均为root),点击执行后可登录mysql数据库。
(2)数据库页面。登录数据库后可以看到以下界面,左侧是默认的4个数据库。点击箭头所示的数据库,可以对数据库进行操作。
(3)创建数据库jrlt。按如下操作,新建数据库jrlt,类型选择为“utf8_genrral_ci”,点击创建。创建成功后,在左侧这里可以看到创建后的数据库。
(4)进入数据库。点击该数据库进入,进入后可以看到该数据库中没有任何数据表。
(5)创建一个数据表users(主要用于存放用户信息id、name、password、photo、money共5个字段)。按如下操作创建数据表,并点击执行。
(6)编辑数据表。新建数据表的列名(id name password photo money),并设置响应的类型和长度,将id键设为主键。(主键要求非空递增),并点击保存数据表。
(7)可点击左侧新建完成的users表,该表详细结构信息如下图所示。
2.3 插入数据
(1)进入数据表SQL操作界面。单击users表→单击SQL进入表格修改界面→点击需要使用的SQL预定义语句。
(2)修改SQL命令。修改命令如下并点击执行。注意符号为英文格式的。
INSERT INTO `users`(`name`, `password`,`photo`, `money`) VALUES ("DuZZ",123456,"c:\\photo\\touxiang.png",100);
INSERT INTO `users`( `name`, `password`, `photo`, `money`) VALUES ("GuQQ",654321,"c:\\photo\\touxiang.png",100);
(3)点击左侧的users表,可以看到我们输入的用户信息。此处我们输入了DuZZ和GuQQ两个账户,如下图所示。
2.4 实现PHP与数据库交互
2.4.1 实现PHP与数据库交互三步走
(1) 建立连接。用户建立连接时,需要提供用户名+密码+地址+数据库名,其中数据库名在连接过程中可以切换。
(2) 执行SQL语句。
(3) 断开连接。
2.4.2 过程化代码一:简单实现三步走
简单实现交互三步走,并根据是否成功建立连接反馈信息。访问该网页可得到结果
<?php
$dbhost="127.0.0.1";//数据库地址
$dbUser="root"; //登录数据库的用户名
$dbPass="root"; //登录数据库的密码
$dbName="jrlt"; //数据库的名称
$link=mysqli_connect($dbhost, $dbUser, $dbPass, $dbName); //建立数据库连接
if(!$link){
echo mysqli_connect_error(); //捕获数据库连接时的错误信息
}
$sql="select * from users"; //定义要执行的语句
$results=mysqli_query($link,$sql); //从数据库中获取执行语句的数据
var_dump($results);//输出数据内容及类型
mysqli_close($link);
?>
代码中的函数解析如下,更多详细信息请查看官方手册《MySQL增强版扩展》。
- mysqli_connect():与数据库建立连接 returns an object which represents the connection to a MySQL Server, 或者在失败时返回 false.
- mysqli_connect_error():捕获与数据库建立连接时的错误信息.
- mysqli_close($link); 断开与数据库的连接;
- mysqli_query(mysqli $link, string $query, int $resultmode = MYSQLI_STORE_RESULT):查询失败时返回 false,通过mysqli_query() 成功执行SELECT, SHOW, DESCRIBE或 EXPLAIN查询会返回一个mysqli_result 对象,其他查询则返回true。
代码执行结果如下:
2.4.3 过程化代码二:优化代码一
代码一输出的是对象,不方便查看。我们可以利用mysqli_fetch_assoc()
函数 以关联数组的方式获取对象中记录的数据。由于mysqli_fetch_assoc()
函数执行一次只能获取一条数据,且是依次获取。因此可以以mysqli_fetch_assoc()
函数为条件,当成功执行时则依次打印所获取的关联数组信息。具体代码如下:
<?php
$dbhost="127.0.0.1";//数据库地址
$dbUser="root"; //登录数据库的用户名
$dbPass="root"; //登录数据库的密码
$dbName="jrlt"; //数据库的名称
$link=mysqli_connect($dbhost, $dbUser, $dbPass, $dbName); //建立数据库连接
if(!$link){
echo mysqli_connect_error(); //捕获数据库连接时的错误信息
}
$sql="select * from users"; //定义要执行的语句
//if...else语句是为了检查sql语句是否有错误,增强代码的可检查性
if($results=mysqli_query($link,$sql)){
while($result=mysqli_fetch_assoc($results)){ //使用mysqli_fetch_assoc函数以关联数组的方式获取一条对象中记录的数据
var_dump($result);
echo "<br/>";
}
}else{
die(mysqli_error($link));//捕获SQL语句的错误,并结束脚本运行
}
mysqli_close($link);
?>
上述代码执行结果如下:
2.4.4 面向对象代码三:改连接方式为面向对象
面向对象的连接方式与代码一二中的面向过程的主要区别在于,连接过程、判断过程、断开过程的差异。在数据访问和使用过程是基本一致的。
<?php
$dbHost = "127.0.0.1";
$dbUser = "root";
$dbPass = "root";
$dbName = "jrlt";
$link = @new mysqli($dbHost,$dbUser,$dbPass,$dbName);
if ($link->connect_error)
{echo $mysqli->connect_error;}
$sql = "select * from users";
if ($results = mysqli_query($link,$sql)){ //mysqli_query函数执行失败时返回 false,通过mysqli_query() 成功执行SELECT, SHOW, DESCRIBE或 EXPLAIN查询会返回一个mysqli_result 对象,其他查询则返回true。
while ($result = mysqli_fetch_assoc($results)){ //使用mysqli_fetch_assoc函数获取返回对象中的具体数据。
var_dump($result);
echo "<hr/>";
}
}
else{
die(mysqli_error($link));
}
$link->close();
?>
3 相关函数简介
3.1 数据库连接操作相关函数
函数名 | 作用 |
---|---|
new mysqli() 、mysqli_connect() | 连接指定数据库 |
$mysqli->connect_errno、mysqli_connect_errno() | 返回最后一次连接调用的错误代码 |
$mysqli->connect_error、mysqli_connect_error() | 返回一个字符串描述的最后一次连接调用的错误代码 |
l i n k − > c l o s e ( ) 、 m y s q l i c l o s e ( link->close()、mysqli_close( link−>close()、mysqliclose(link) | 断开连接,其中$link表示所建立的连接。 |
3.2 操作结果集对象相关函数
函数 | 作用 |
---|---|
mysqli_fetch_row() | 以索引数组的方式获取一条记录的数据 |
mysqli_fetch_assoc() | 以关联数组的方式获取一条记录的数据 |
mysqli_fetch_array() | 以索引数组或关联数组的方式获取一条记录的数据 |
mysqli_fetch_all() | 以索引数组或关联数组的方式获取全部记录的数据 |
mysqli_num_rows() | 获取结果中行的数量 |
mysqli_free_result() | 释放与一个结果集合相关的内存 |
3.3 更多命令
更多命令请参考官方手册《MySQL增强版扩展》。
4 归纳
(1)掌握phpstudy中通过myadmin对数据库进行操作的方法;
(2)使用PHP语句实现PHP与MySQL进行交互;
(3)掌握数据库连接及操作结果集对象的常用命令;
(4)学会查阅官方手册《MySQL增强版扩展》。
参考文章
[1] 《【PHP基础】实现PHP与SQL数据库的连接》