PHP与MySQL的连接

 

一.PHP数据库的扩展分类。

1.MySQL 扩展是针对 MySQL 4.1.3 或更早版本设计的,是 PHP 与 MySQL数据库交互的早期扩展。由于其不支持 MySQL 数据库服务器的新特性,且安全性差,在项目开发中不建议使用,可用 MySQLi 扩展代替。

2.MySQLi 扩展是 MySQL 扩展的增强版,它不仅包含了所有 MySQL 扩展的功能函数,还可以使用 MySQL 新版本中的高级特性。例如,多语句执行和事务的支持,预处理方式完全解决了 SQL 注入问题等。MySQLi 扩展只支持MySQL 数据库,如果不考虑其他数据库,该扩展是一个非常好的选择。

3.PDO 是 PHP Data Objects(数据对象)的简称,它提供了一个统一的 API接口,只要修改其中的 DSN (数据源),就可以实现PHP应用与不同类型数据库服务器之间的交互。

需要注意的是,PHP 中的数据库扩展在使用之前需要开启。打开 PHP 的配置文件 php.ini去掉前面的注释符号(;)

extension=php_mysql.dll

extension=php_mysqli.dll

Extension_dir=‘ext的文件路径’;

extension=php_pdo_mysql.dll

保存 php.ini 文件后,重新启动 Apache 服务器,通过 phpinfo() 函数即可查看扩展是否开启。以 MySQLi 扩展为例,具体如图所示。

4.验证mysqli扩展是否开启。

 

a.验证mysqli扩展是否开启     

phpinfo();  

b.检测扩展是否加载         

var_dump(extension_loaded('mysqli'));         var_dump(extension_loaded('curl'));

c.检测函数是否存在         

var_dump(function_exists('mysqli_connect'));

d.得到当前已经开启的扩展         

print_r(get_loaded_extensions());

二.连接数据库。

1.通过MySQL类库操作数据库的步骤

建立到MySQL的连接-打开指定的数据库-设置默认客户端的字符集-执行SQL查询-释放字符集-关闭连接

2.连接数据库,并通过$mysqli保存连接

$mysqli = new mysqli('localhost', 'root', '123456', 'itcast');

   a.连接数据库,并屏蔽错误信息

$mysqli = @new mysqli('localhost', 'root', ‘1’,’test’);

   b.设置字符集 $mysqli->set_charset('utf8') 成功返回frue,失败返回false 需要注意的是,只有保持 PHP 脚本文件、Web 服务器     返回的编码、网页的 <meta> 标记、PHP 访问 MySQL 使用的字符集都统一时,才能避免中文出现乱码问题。

三.执行SQL语句。

       在完成数据库的连接后,就可以通过 SQL 语句操作数据库了。在 MySQLi扩展中,通常使用 mysqli_query() 函数发送 SQL 语句,获取执行结果。函数的声明方式如下:

mixed mysqli_query (
mysqli $link,     //数据库连接
string $query,   //SQL语句
int$resultmode = MYSQLI_STORE_RESULT   //结果集模式
)

$link表示通过 mysqli_connect() 函数获取的数据库连接,$query 表示 SQL 语句。当函数执行 SELECT、SHOW、DESCRIBE 或EXPLAIN 查询时,返回值是查询结果集,而对于其他查询,成功返回 true,失败返回 false。在 mysqli_query() 函数中,可选参数 $resultmode 表示结果集模式,其值可以是 MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 两种常量。MYSQLI_STORE_RESULT 模式会将结果集全部读取到 PHP 端,而MYSQLI_USE_RESULT 模式仅初始化结果集检索,在处理结果集时进行数据读取。

四.处理结果集。

1.当通过 mysqli_query() 函数执行 SQL 语句后,返回的结果集并不能直接使用,需要使用函数从结果集中获取信息,保存为数组。MySQLi 扩展中常用的处理结果集的函数如表所示。

基本步骤

MySQL扩展

MySQLi扩展

连接和选择数据库 

mysql_connect()

mysqli_connect()

执行SQL语句

mysql_query()

mysqli_query()

处理结果集

mysql_fetch_array()

mysqli_fetch_array()

释放结果集 

mysql_free_result()

mysqli_free_result()

关闭连接

mysql_close()

mysqli_close()

2.在表列举函数中,mysqli_fetch_all() 和 mysqli_fetch_array() 的返回值支持关联数组和索引数组两种形式,函数第 1 个参数表示结果集,第 2 个参数是可选参数,表示返回的数组形式,其值有 MYSQLI_ASSOC、MYSQLI_NUM、MYSQLI_BOTH 三种常量,分别表示关联数组、索引数组,或两者皆有,默认值为 MYSQLI_BOTH。

3.当需要一次查询出所有的记录时,可以通过 mysqli_fetch_all() 函数来实现

$data = mysqli_fetch_all($result, MYSQLI_ASSOC);

再通过var_dump($data);打印出来。

五.预处理语句。

1.什么是预处理。

MySQLi  扩展中有一种预处理语句的机制,其原理是预先编译 SQL 语句的模板,当执行时只传输有变化的数据。下图演示了预处理语句和传统方式的区别。

图中可以看出,当 PHP 需要执行 SQL 时,传统方式是将发送的数据和 SQL 写在一起,这种方式每条 SQL 都需要经过分析、编译和优化的周期;而预处理语句只需要编译一次用户提交的 SQL 模板,在操作时,发送相关数据即可完成更新操作,这极大地提高了运行效率,而且无需考虑数据中包含特殊字符(如单引号)导致的语法问题。

2.预处理相关函数。

a.  mysqi_prepare()函数用于预处理一个待执行的 SQL 语句,函数声明如下:mysqli_stmt mysqli_prepare ( mysqli $link , string $query )参数 $link 表示数据库连接,$query 表示 SQL 语句模板。当函数执行后,成功返回预处理对象,失败返回 false。

b.  在编写SQL语句模板时,其语法是将数据部分使用“?”占位符代替。示例代码如下:

​
# SQL正常语法 UPDATE `user` SET `name`='aa' WHERE `id`=1 
# SQL模板语法 UPDATE `user` SET `name`=? WHERE `id`=?

​

从以上示例可以看出,将 SQL 语句修改为模板语法时,对于字符串内容,“?”占位符的两边无需使用单引号包裹。

 

c.  mysqli_stmt_bind_param() 函数用于将变量作为参数绑定到预处理语句中。函数的声明如下:

bool mysqli_stmt_bind_param (
       mysqli_stmt $stmt, 	//预处理对象
       string $types, 	//数据类型
       mixed &$var1, 	//绑定变量1(引用传参)
       [, mixed&$... ]        //绑定变量n...(可选参数,可绑定多个,引用传参)
)

在上述代码中,参数 $stmt 表示由 mysqli_prepare() 返回的预处理对象;$types 用于指定被绑定变量的数据类型,它是由一个或多个字符组成的字符串;后面的 $var(可以是多个参数)表示需要绑定的变量,且其个数必须与 $types 字符串的长度一致。该函数执行成功时返回 true,失败时返回 false。

 

d.  参数绑定时的数据类型字符:

字符

描述

i

描述变量的数据类型为MySQL中的integer类型

d

描述变量的数据类型为MySQL中的double类型

s

描述变量的数据类型为MySQL中的string类型

b

描述变量的数据类型为MySQL中的blob类型

e. 

//连接数据库、预处理SQL模板
$link = mysqli_connect('localhost', 'root', '123456', 'itcast');
$stmt = mysqli_prepare($link, 'UPDATE `user` SET `name`=? WHERE `id`=?');
//参数绑定(将变量$name、$id按顺序绑定到SQL语句“?”占位符上)
mysqli_stmt_bind_param($stmt, 'si', $name, $id);

在上述代码中,SQL语句中有两个“?”占位符,分别表示 name 字段和id 字段,name 字段是字符串类型,id 字段是整型,因此mysqli_stmt_bind_param() 的第二个参数为“si”。当代码执行后,变量$name 和 $id 就已经通过引用传参的方式进行了参数绑定。

 

f.在完成参数绑定后,接下来应该将数据内容发送给 MySQL 执行。mysqli_stmt_execute() 函数用于执行预处理,其声明如下。

bool mysqli_stmt_execute ( mysqli_stmt $stmt )

 在上述声明中,$stmt 参数表示由 mysqli_prepare() 函数返回的预处理对象。当函数执行成功后,返回 true,执行失败返回 false。

//连接数据库、预处理SQL模板
$link = mysqli_connect('localhost', 'root', '123456', 'itcast');
$stmt = mysqli_prepare($link, 'UPDATE `user` SET `name`=? WHERE `id`=?');
//参数绑定,并为已经绑定的变量赋值
mysqli_stmt_bind_param($stmt, 'si', $name, $id);
$name = 'aa';
$id = 1;

g.接下来通过代码演示 mysqli_stmt_execute() 函数的使用,具体如下。

//执行预处理(第一次执行)
mysqli_stmt_execute($stmt);
//为第二次执行重新赋值
$name = 'bb';
$id = 2;
//执行预处理(第二次执行)
mysqli_stmt_execute($stmt);

通过上述代码可以看出,MySQLi 扩展提供的预处理方式,实现了数据与SQL 的分离。这种方式不仅提高了执行效率,也解决了直接用字符串拼接SQL 语句带来的安全问题。

六.其他操作。

1.MySQLi  扩展还提供了许多丰富的函数方便在开发中使用。下表列举了MySQLi  扩展的其他常用函数,也可以参考 PHP 手册了解更多内容。

函数

描述

mysqli_insert_id()

获取上一次插入操作时产生的ID号

mysqli_affected_rows()

获取上一次操作时受影响的行数

mysqli_real_escape_string()

用于转义SQL语句字符串中的特殊字符

 

函数

描述

mysqli_free_result()

释放结果集

mysqli_close()

关闭先前打开的数据库连接

mysqli_error()

返回最近函数调用的错误代码

 

2.mysqli_free_result() 和 mysqli_close() 函数用于释放资源、关闭连接,由于 PHP 访问 MySQL 使用了非持久连接,因此当 PHP 脚本执行结束时会自动释放。

3.示例。

 1     //连接数据库、设置字符集
 2     $link = mysqli_connect('localhost', 'root', '123456', 'itcast');
 3     mysqli_set_charset($link, 'utf8');
 4     // ① 执行查询操作、处理结果集
 5     if(!$result = mysqli_query($link, 'SELECT * FROM `user`')){
 6	exit('执行失败。错误信息:'.mysqli_error($link));  //获取错误信息
 7     }
 8     $data = mysqli_fetch_all($result, MYSQLI_ASSOC);
 9      // ② 用完后,释放结果集
10    mysqli_free_result($result);
11    // ③ 执行插入操作,拼接SQL语句
12   //转义特殊符号
        $name = mysqli_real_escape_string($link, "单引号'测试'文本"); 
13   if(!mysqli_query($link, "INSERT INTO `user` (`name`) VALUES 
         ('".$name."')")){
14	exit('执行失败。错误信息:'.mysqli_error($link));
15    }
16    // ④ 获取最后插入的ID
17    $id = mysqli_insert_id($link);  //获取AUTO_INCREMENT字段的自增值
18     // ⑤ 执行修改操作
19   if(!mysqli_query($link, "UPDATE `user` SET `name`='aa' WHERE 
        `id`>2")){
20	exit('执行失败。错误信息:'.mysqli_error($link));
21    }
22   // ⑥ 获取受影响的行数
23 $num = mysqli_affected_rows($link);  //可获取UPDATE、
                                                                  //DELETE等操作影响的行数
24   // ⑦ 关闭连接
25   mysqli_close($link);

在上述代码中,第 4~10 行演示了 mysqli_error()、mysqli_free_result()函数的使用,第 12 行演示了 mysqli_real_escape_string() 函数的使用,第17~25行演示了 mysqli_insert_id()、mysqli_affected_rows()、mysqli_close()函数的使用。其中第 8 行 $data 保存了查询出的数据,因此在第 10 行释放了$result 结果集。第 25 行关闭 $link 连接后,$link 将不能继续使用。

以上就是今天的全部内容了,请大家多学益寿,靠着自己独特的思维去打造一个属于自己的代码世界,如果有不懂的地方可以在下方评论或者是私信我随时为您解惑。

  • 3
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值