PHP Conference Japan 2024

双重过程式和面向对象接口

mysqli 扩展具有双重接口。它支持过程式和面向对象编程范式。

从旧的 mysql 扩展迁移的用户可能更喜欢过程式接口。过程式接口类似于旧的 mysql 扩展的接口。在许多情况下,函数名称仅在前缀上有所不同。一些 mysqli 函数将连接句柄作为其第一个参数,而旧 mysql 接口中的匹配函数则将其作为可选的最后一个参数。

示例 #1 从旧的 mysql 扩展轻松迁移

<?php
$mysqli
= mysqli_connect("example.com", "user", "password", "database");
$result = mysqli_query($mysqli, "SELECT 'Please do not use the deprecated mysql extension for new development. ' AS _msg FROM DUAL");
$row = mysqli_fetch_assoc($result);
echo
$row['_msg'];

$mysql = mysql_connect("example.com", "user", "password");
mysql_select_db("test");
$result = mysql_query("SELECT 'Use the mysqli extension instead.' AS _msg FROM DUAL", $mysql);
$row = mysql_fetch_assoc($result);
echo
$row['_msg'];

以上示例将输出

Please do not use the deprecated mysql extension for new development. Use the mysqli extension instead.

面向对象接口

除了经典的过程式接口外,用户还可以选择使用面向对象接口。文档使用面向对象接口进行组织。面向对象接口显示按其用途分组的函数,使入门变得更容易。参考部分提供了两种语法变体的示例。

两种接口之间没有明显的性能差异。用户可以根据个人喜好进行选择。

示例 #2 面向对象和过程式接口

<?php

$mysqli
= mysqli_connect("example.com", "user", "password", "database");

$result = mysqli_query($mysqli, "SELECT 'A world full of ' AS _msg FROM DUAL");
$row = mysqli_fetch_assoc($result);
echo
$row['_msg'];

$mysqli = new mysqli("example.com", "user", "password", "database");

$result = $mysqli->query("SELECT 'choices to please everybody.' AS _msg FROM DUAL");
$row = $result->fetch_assoc();
echo
$row['_msg'];

以上示例将输出

A world full of choices to please everybody.

快速入门使用面向对象接口,因为参考部分就是按照这种方式组织的。

混合风格

可以随时在风格之间切换。出于代码清晰度和编码风格的原因,不建议混合两种风格。

示例 #3 不良编码风格

<?php

$mysqli
= new mysqli("example.com", "user", "password", "database");

$result = mysqli_query($mysqli, "SELECT 'Possible but bad style.' AS _msg FROM DUAL");

if (
$row = $result->fetch_assoc()) {
echo
$row['_msg'];
}

以上示例将输出

Possible but bad style.

参见

添加注释

用户贡献的注释 1 条注释

31
匿名
9 年前
只想补充一点,过程式 mysqli_connect_errno 和 mysqli_connect_error 都不接受任何参数!
https://php.net/manual/de/mysqli.connect-errno.php
https://php.net/manual/de/mysqli.connect-error.php
"int mysqli_connect_errno ( void )"
"string mysqli_connect_error ( void )"
它在那里明确说明了“void”。

添加 mysqli 实例作为参数使其看起来像是从提供的实例中提取错误号,但实际上并非如此。这可能导致连接到多个 SQL 服务器时难以检测到的错误。
而且这对初学者来说很令人困惑。
To Top