MySQLi 是 PHP 中用于与 MySQL 数据库交互的一个扩展库,它提供了面向过程和面向对象两种编程方式。以下是关于 MySQLi 的一些基本信息和使用方法:
MySQLi 的特点
MySQLi 是 PHP 中用于访问 MySQL 数据库的改进版本,支持 MySQL 4.1.3 或更高版本。
它提供了更丰富的功能和更好的性能,与旧版的 mysql
扩展相比,MySQLi 提供了更多的安全特性,如预处理语句和绑定参数,有助于防止 SQL 注入攻击。
安装和配置
要使用 MySQLi,需要在编译 PHP 时加入 MySQLi 扩展的支持。
配置时可以使用 --with-mysqli
选项来指定 MySQL 配置文件的路径。
连接数据库
使用 mysqli_connect()
函数或 new mysqli()
对象来建立与数据库的连接。
连接参数包括主机名、用户名、密码和数据库名。
执行 SQL 语句
使用 mysqli_query()
方法执行 SQL 语句。
对于查询语句,mysqli_query()
返回一个 mysqli_result
对象,可以通过 fetch_array()
、fetch_assoc()
等方法获取结果集。
预处理语句
MySQLi 支持预处理语句,通过 prepare()
、bind_param()
和 execute()
方法可以安全地执行带有参数的 SQL 语句。
多语句执行
使用 multi_query()
方法可以同时执行多条 SQL 语句。
通过 use_result()
或 store_result()
方法获取每个语句的执行结果。
错误处理
PHP7版本使用 mysqli_connect_error 和 mysqli_connect_errno 属性获取连接错误信息。前者返回完整错误信息(可通过配置修改返回异常),后者返回错误代码(如用户名或密码错误代码为:1045).
PHP8使用getMessage()来返回具体异常而非一长串的异常.
使用 error 和 errno 属性获取最近执行的 SQL 语句的错误信息。
MySQLi 是一个功能强大且灵活的扩展库,适用于需要高性能和安全的数据库交互的应用程序。
面向过程连接数据库
1.首先定义了三个变量,分别是服务名,用户名和密码,他们对应了创建数据库连接时需要用到的三个数据
2.如何创建连接: 使用函数mysqli_connnect()函数,该函数用来连接mysql数据库,里面有6个参数,分别是($hostname)服务器ip,数据库登陆的用户名($username)和密码($password),以及($database)数据库名,($port)端口号和($socket)很少用到.
<?php
//面向过程
$servername = "localhost";
$username = "123";
$password = "1234";
//创建连接
$conn = mysqli_connect($servername,$username,$password);
//检测连接
if(!$conn){
die("连接失败: ". mysqli_connect_error());//判断(!$conn)条件是否成立,如果条件成立,则说明未连接上,使用die返回一个错误信息.mysqli_connect_error()函数可以返回失败原因.
}
echo "连接成功";
//关闭
mysqli_close($conn); //使用mysqli_close()来关闭数据库,一般数据库连接完成后会自动关闭.手动关闭可以节约服务器开支.
?>
捕获异常并返回给前端
在PHP8,未处理捕获异常时,会返回如下一长串结果给前端,这样的做法不安全且不美观,因此,需要想办法让系统只返回具体的错误原因给前端.
这就用到了try和catch关键字来进行异常处理.
在PHP中,try
关键字用于异常处理,它允许开发者标记一段可能会产生异常的代码区域。如果在try
代码块中发生异常,程序会立即跳转到catch
代码块,并执行其中的逻辑用于处理异常或提供错误提示。
基本语法
php
try {
// 可能会抛出异常的代码
} catch (Exception $ e) {
// 异常处理代码
}
在catch
块中,可以指定要捕获的异常类型,也可以使用通用的Exception
作为捕获所有异常的类型。通过使用try...catch
块,可以精确地捕获特定类型的异常,并针对性地处理这些异常。
getMessage()
是一个方法,通常与异常处理相关。当在PHP程序中抛出异常时,可以使用 Exception $e->getMessage()
方法来获取异常的具体消息内容。这个消息通常包含关于错误的具体描述,有助于开发者理解和解决问题。
多层try-catch嵌套
如果项目存在多个分层的代码块,每个代码块都可能会发生异常,可以使用多个try-catch
块来处理异常。
php
try {
// 第一层try代码块
try {
// 第二层try代码块
} catch (ExceptionOne $ e) {
// 第二层catch代码块
}
} catch (Exception $ e) {
// 第一层catch代码块
}
finally代码块
在捕获异常后,还可以使用finally
代码块来执行一段一定会执行的代码。不管异常是否发生,finally
代码块都会被执行。
php
try {
// 代码块
} catch (Exception $ e) {
// 异常处理代码
} finally {
// 一定会执行的代码
}
完整代码:
$servername = "localhost";
$username = "root123";
$password = "1234";
//创建连接
try{
$conn = mysqli_connect($servername,$username,$password);//可能需要处理异常的片段,这里需要处理的是连接数据库可能存在的异常,比如连接不成功的话,就会跳转到catch()代码块
} catch(Exception $e){
//
die("连接失败". $e->getMessage());//这里getMessage()是php内置函数
}
//检测连接
//if(!$conn){
// die("连接失败: ". mysqli_connect_error());//判断!$conn条件是否成立,如果条件成立,则说明未连接上,使用die返回一个错误信息.mysqli_connect_error()函数可以返回失败原因.
//}
echo "连接成功";
//关闭
mysqli_close($conn); //使用mysqli_close()来关闭数据库,一般数据库连接完成后会自动关闭.手动关闭可以节约服务器开支.
?>
面向对象
面向对象方式创建数据库连接和面向过程的方式类似,
- 面向对象:$conn = new mysqli($servername,$username,$password);
- 面向过程:$conn = mysqli_connect($servername,$username,$password);
<?php
//面向对象
$servername = "localhost";
$username = "root";
$password = "1234";
//创建连接
$conn = new mysqli($servername,$username,$password);//定义了一个变量$conn,然后new一个对象mysqli().
//检测连接
if($conn->connect_error) {
die("连接失败".$conn->connect_error);
}
echo "连接成功";
//关闭连接
$conn->close();//调用$conn里面的close()方法.
异常处理
在面向对象的数据库连接使用connect_error方法也是返回一长串异常的结果的.因此也需要进行异常处理.
也是使用try和catch来进行捕获和处理.
使用$e->getMessage()方法来获取错误信息.
使用$e->getCode()或mysqli_connect_errno()方法来获取错误代码.
<?php
//面向对象
$servername = "localhost";
$username = "root8";
$password = "1234";
//创建连接
try {
$conn = new mysqli($servername,$username,$password);//定义了一个变量$conn,然后new一个对象mysqli().
}catch(Exception $e){
die("连接失败".$e->getMessage().$e->getCode());
// die("连接失败".var_dump($e));
}
//检测连接
if($conn->connect_error) {
die("连接失败".$conn->connect_error);
}
echo "连接成功";
//关闭连接
$conn->close();//调用$conn里面的close()方法.