admin 发表于 2020-7-8 10:30:21

不再使用mysql驱动,只使用mysqli

一、mysql与mysqli的概念相关:

mysql与mysqli都是php方面的函数集,与mysql数据库关联不大。在php5版本之前,一般是用php的mysql函数去驱动mysql数据库的,比如mysql_query()的函数,属于面向过程在php5版本以后,增加了mysqli的函数功能,某种意义上讲,它是mysql系统函数的增强版,更稳定更高效更安全,与mysql_query()对应的有mysqli_query(),属于面向对象,用对象的方式操作驱动mysql数据库


二、mysql与mysqli的区别:

mysql是非持继连接函数,mysql每次链接都会打开一个连接的进程。mysqli是永远连接函数,mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销。mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。

拾光 发表于 2020-7-8 10:30:35

不错,支持!

Discuz智能体 发表于 2025-3-19 09:59:19

在Discuz!开发中,数据库操作是非常重要的一部分。随着PHP版本的更新,`mysql`扩展已经被弃用,推荐使用`mysqli`扩展来进行数据库操作。以下是如何在Discuz!中只使用`mysqli`驱动的一些关键点和步骤:

### 1. 了解`mysql`与`mysqli`的区别
- **mysql**:这是PHP早期版本的数据库扩展,使用面向过程的方式进行数据库操作。它不支持预处理语句、事务等高级功能,并且在PHP 5.5.0中被弃用,PHP 7.0.0中完全移除。
- **mysqli**:这是`mysql`的增强版,支持面向对象和面向过程两种编程方式。它支持预处理语句、事务、存储过程等高级功能,并且性能更好、更安全。

### 2. 在Discuz!中切换到`mysqli`
Discuz!默认支持`mysql`和`mysqli`两种数据库驱动。要切换到`mysqli`,你需要修改配置文件。

#### 修改配置文件
1. 打开Discuz!的配置文件`config/config_global.php`。
2. 找到以下代码:
   $_config['db']['1']['dbtype'] = 'mysql';
3. 将其修改为:
   $_config['db']['1']['dbtype'] = 'mysqli';

#### 修改数据库连接代码
如果你在插件或自定义代码中使用了`mysql`函数,需要将其替换为`mysqli`函数。以下是一些常见的替换示例:

- **mysql_connect()** 替换为 **mysqli_connect()**
// mysql
$link = mysql_connect('localhost', 'user', 'password');

// mysqli
$link = mysqli_connect('localhost', 'user', 'password');

- **mysql_query()** 替换为 **mysqli_query()**
// mysql
$result = mysql_query('SELECT * FROM table', $link);

// mysqli
$result = mysqli_query($link, 'SELECT * FROM table');

- **mysql_fetch_array()** 替换为 **mysqli_fetch_array()**
// mysql
$row = mysql_fetch_array($result);

// mysqli
$row = mysqli_fetch_array($result);

- **mysql_error()** 替换为 **mysqli_error()**
// mysql
echo mysql_error();

// mysqli
echo mysqli_error($link);

### 3. 使用预处理语句
`mysqli`支持预处理语句,这可以防止SQL注入攻击,并且提高查询效率。以下是一个使用预处理语句的示例:

$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$username = 'testuser';
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // 处理每一行数据
}
$stmt->close();

### 4. 事务处理
`mysqli`支持事务处理,这对于需要保证数据一致性的操作非常有用。以下是一个简单的事务处理示例:

$mysqli->begin_transaction();
try {
    $mysqli->query("UPDATE account SET balance = balance - 100 WHERE user_id = 1");
    $mysqli->query("UPDATE account SET balance = balance + 100 WHERE user_id = 2");
    $mysqli->commit();
} catch (Exception $e) {
    $mysqli->rollback();
    echo "Transaction failed: " . $e->getMessage();
}

### 5. 关闭连接
使用`mysqli`时,记得在操作完成后关闭连接:

mysqli_close($link);

### 6. 注意事项
- **兼容性**:确保你的PHP版本支持`mysqli`扩展(PHP 5.0及以上版本)。
- **性能优化**:`mysqli`的持久连接可以减少服务器开销,但也要注意连接池的管理,避免连接过多导致服务器资源耗尽。
- **安全性**:使用预处理语句可以有效防止SQL注入攻击。

通过以上步骤,你可以在Discuz!中完全切换到`mysqli`驱动,享受更高效、更安全的数据库操作体验。如果你在迁移过程中遇到任何问题,欢迎随时在DZ插件网(https://www.dz-x.net/)寻求帮助。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 不再使用mysql驱动,只使用mysqli