PHP mysqli

PHPmysqli教程展示了如何在带有mysqli扩展的PHP中对MySQL进行编程。

$ php -v
php -v
PHP 8.1.2 (cli) (built: Aug  8 2022 07:28:23) (NTS)
...

我们使用PHP版本8.1.2。

MySQL

MySQL是领先的开源数据库管理系统。它是一个多用户、多线程的数据库管理系统。MySQL在网络上特别流行。它是非常流行的LAMP平台的组成部分之一。Linux、Apache、MySQL和PHP。目前MySQL归Oracle所有。MySQL数据库可用于大多数重要的操作系统平台。它运行在BSDUnix、Linux、Windows或MacOS上。

PHPmysqli

MySQLi扩展(改进的MySQL)是一种关系数据库驱动程序,用于PHP脚本语言中以提供与MySQL数据库的接口。它提供面向对象和过程的API。其他与MySQL交互的方法是:PDO和ORM解决方案。

pdo_mysqlPHP数据对象模块是PHP应用程序的数据库抽象层。如果我们编写可移植数据库PHP脚本,此模块将很有用。

还有用于在PHP中使用MySQL的ORM解决方案,例如DoctrineorEloquent。

$ sudo apt install php8.1-mysql

我们安装php8.1-mysql模块。/etc/php/8.1/mods-available/mysqli.ini是在安装期间创建的,其中启用了扩展。

PHPmysqli版

在下面的例子中,我们确定MySQL数据库的版本。

<?php

$con = new mysqli("localhost", "dbuser", "passwd", "mydb");

if ($con->connect_errno) {

    printf("connection failed: %s\n", $con->connect_error());
    exit();
}

$res = $con->query("SELECT VERSION()");

if ($res) {

    $row = $res->fetch_row();
    echo $row[0];
}

$res->close();
$con->close();

该示例打印MySQL的版本。

$con = new mysqli("localhost", "dbuser", "passwd", "mydb");

与数据库的连接已创建。mysqli类将主机名、用户名、密码和数据库名称作为参数。

if ($con->connect_errno) {

    printf("connection failed: %s\n", $con->connect_error());
    exit();
}

如果连接尝试失败,connect_errno包含错误代码值。如果没有发生错误,它为零。connect_error方法返回最后一个连接错误的字符串描述。

$res = $con->query("SELECT VERSION()");

query方法对数据库执行查询。SELECTVERSION语句返回MySQL的版本。

if ($res) {

    $row = $res->fetch_row();
    echo $row[0];
}

fetch_row返回结果行作为枚举数组。我们的结果只包含一个值。

$res->close();
$con->close();

最后,我们释放资源。

$ php version.php
8.0.29-0ubuntu0.22.04.2

这是一个示例输出。

mysqli驱动程序还支持过程式编程。

<?php

$con = mysqli_connect("localhost", "dbuser", "passwd", "mydb");

if (mysqli_connect_errno()) {

    printf("connection failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SELECT VERSION()";

$res = mysqli_query($con, $query);

if ($res) {

    $row = mysqli_fetch_row($res);
    echo $row[0];
}

mysqli_free_result($res);
mysqli_close($con);

该示例返回具有过程函数的MySQL版本。

PHPmysqli创建表

以下示例创建一个新的数据库表。使用CREATETABLE语句创建一个表。使用INSERTINTO语句将行添加到表中。

<?php

$host = "localhost";
$user = "dbuser";
$passwd = "passwd";
$db = "mydb";

function execute_query($query, $con)
{
    $res = $con->query($query);

    if (!$res) {

        echo "failed to execute query: $query\n";
    } else {
        echo "Query: $query executed\n";
    }

    if (is_object($res)) {

        $res->close();
    }
}

$con = new mysqli($host, $user, $passwd, $db);

if ($con->connect_errno) {

    printf("connection failed: %s\n", $con->connect_error());
    exit();
}

$query = "DROP TABLE IF EXISTS cars";
execute_query($query, $con);

$query = "CREATE TABLE cars(id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255), price INT)";
execute_query($query, $con);

$query = "INSERT INTO cars(name, price) VALUES('Audi', 52642)";
execute_query($query, $con);

$query = "INSERT INTO cars(name, price) VALUES('Mercedes', 57127)";
execute_query($query, $con);

$query = "INSERT INTO cars(name, price) VALUES('Skoda', 9000)";
execute_query($query, $con);

$query = "INSERT INTO cars(name, price) VALUES('Volvo', 29000)";
execute_query($query, $con);

$query = "INSERT INTO cars(name, price) VALUES('Bentley', 350000)";
execute_query($query, $con);

$query = "INSERT INTO cars(name, price) VALUES('Citroen', 21000)";
execute_query($query, $con);

$query = "INSERT INTO cars(name, price) VALUES('Hummer', 41400)";
execute_query($query, $con);

$query = "INSERT INTO cars(name, price) VALUES('Volkswagen', 21600)";
execute_query($query, $con);

$con->close();

该示例创建了包含八行的cars表。

PHPmysqli预处理语句

当我们编写准备好的语句时,我们使用占位符而不是直接将值写入语句。准备好的语句提高了安全性和性能。在mysqli中,prepare函数准备执行SQL语句。

<?php

$host = "localhost";
$user = "dbuser";
$passwd = "passwd";
$db = "mydb";

$con = new mysqli($host, $user, $passwd, $db);

if ($con->connect_errno) {

    printf("connection failed: %s\n", $con->connect_error());
    exit();
}

$id = 3;

$query = "SELECT id, name, price FROM cars WHERE id = ?";

if ($stmt = $con->prepare($query)) {

    $stmt->bind_param('i', $id);

    $stmt->execute();
    $stmt->bind_result($row_id, $name, $price);
    $stmt->fetch();

    echo "$row_id $name $price\n";

    $stmt->close();
} else {

    echo "failed to fetch data\n";
}

$con->close();

该示例从表中选择特定行。它使用准备语句。

$query = "SELECT id, name, price FROM cars WHERE id = ?";

当我们编写准备好的语句时,我们使用占位符而不是直接将值写入语句。准备好的语句速度更快,可以防止SQL注入攻击。?是占位符,后面会补上。在我们的例子中,我们有一个值:一个整数ID。

$stmt->bind_param('i', $id);

$id变量的值通过bind_param方法绑定到占位符。第一个参数指定变量类型;在我们的例子中它是整数。

$stmt->execute();

语句被执行。

$stmt->bind_result($row_id, $name, $price);

bind_result将返回值绑定到指定的变量。

echo "$row_id $name $price\n";

我们将变量打印到终端。

$con->close();

我们关闭声明。

$ php prepared_statement.php
3 Skoda 9000

这是输出。

PHPmysqlifetch_row

fetch_row方法从结果集中获取一行数据并将其作为枚举数组返回。每列都存储在一个从0开始的数组偏移量中。对该函数的每次后续调用都将返回结果集中的下一行,如果没有更多行,则返回NULL

<?php

$host = "localhost";
$user = "dbuser";
$passwd = "passwd";
$db = "mydb";

$con = new mysqli($host, $user, $passwd, $db);

if ($con->connect_errno) {

    printf("connection failed: %s\n", $con->connect_error());
    exit();
}

$query = "SELECT * FROM cars";

if ($res = $con->query($query)) {

    printf("Select query returned %d rows.\n", $res->num_rows);

    while ($row = $res->fetch_row())
    {
        printf("%s %s %s\n", $row[0], $row[1], $row[2]);
    }

    $res->close();
} else {

    echo "failed to fetch data\n";
}

$con->close();

该示例返回cars表中的所有行。

$query = "SELECT * FROM cars";

此SELECT查询从表中选择所有行。

if ($res = $con->query($query)) {

我们使用query方法执行SELECT查询。

printf("Select query returned %d rows.\n", $res->num_rows);

返回的行数存储在num_rows属性中。

while ($row = $res->fetch_row())
{
    printf("%s %s %s\n", $row[0], $row[1], $row[2]);
}

在while循环中使用fetch_row,我们从表中获取所有行。

$ php fetch_rows.php
Select query returned 8 rows.
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000
6 Citroen 21000
7 Hummer 41400
8 Volkswagen 21600

这是输出。

PHPmysqlifetch_assoc

fetch_assoc返回一个字符串的关联数组,表示结果集中获取的行。数组中的每个键代表结果集的其中一个列的名称,如果结果集中没有更多行,则为NULL

<?php

$host = "localhost";
$user = "dbuser";
$passwd = "passwd";
$db = "mydb";

$con = new mysqli($host, $user, $passwd, $db);

if ($con->connect_errno) {

    printf("connection failed: %s\n", $con->connect_error());
    exit();
}

$query = "SELECT * FROM cars";

if ($res = $con->query($query)) {

    printf("Select query returned %d rows.\n", $res->num_rows);

    while ($row = $res->fetch_assoc())
    {
        printf("%s %s %s\n", $row['id'], $row['name'], $row['price']);
    }

    $res->close();
} else {

    echo "failed to fetch data\n";
}

$con->close();

该示例返回cars表中的所有行。

while ($row = $res->fetch_assoc())
{
    printf("%s %s %s\n", $row['id'], $row['name'], $row['price']);
}

当我们使用fetch_assoc时,我们通过数组表示法引用列。

PHPmysqlifetch_object

fetch_object返回一个对象,该对象具有与获取的行对应的字符串属性,如果结果集中没有更多行,则返回NULL

<?php

$host = "localhost";
$user = "dbuser";
$passwd = "passwd";
$db = "mydb";

$con = new mysqli($host, $user, $passwd, $db);

if ($con->connect_errno) {

    printf("connection failed: %s\n", $con->connect_error());
    exit();
}

$query = "SELECT * FROM cars";

if ($res = $con->query($query)) {

    printf("Select query returned %d rows.\n", $res->num_rows);

    while ($row = $res->fetch_object())
    {
        printf("%s %s %s\n", $row->id, $row->name, $row->price);
    }

    $res->close();
} else {

    echo "failed to fetch data\n";
}

$con->close();

该示例返回cars表中的所有行。

while ($row = $res->fetch_object())
{
    printf("%s %s %s\n", $row->id, $row->name, $row->price);
}

当我们使用fetch_object时,我们通过对象访问符号引用列。

PHPmysqli列名

下一个示例使用数据库表中的数据打印列名称。我们将列名称为元数据。

<?php

$host = "localhost";
$user = "dbuser";
$passwd = "passwd";
$db = "mydb";

$con = new mysqli($host, $user, $passwd, $db);

if ($con->connect_errno) {

    printf("connection failed: %s\n", $con->connect_error());
    exit();
}

$query = "SELECT * FROM cars";

if ($res = $con->query($query)) {

    $num_rows = $res->num_rows;
    $num_fields = $res->field_count;

    printf("Select query returned %d rows.\n", $num_rows);
    printf("Select query returned %d columns.\n", $num_fields);

    $fields = $res->fetch_fields();

    while ($row = $res->fetch_row()) {

        for ($i = 0; $i < $num_fields; $i++) {

            echo $fields[$i]->name . ": " . $row[$i] . "\n";
        }

        echo "*******************************\n";
    }

    $res->close();
} else {

    echo "failed to fetch data\n";
}

$con->close();

该示例打印带有列标题的cars表的所有行。

$num_rows = $res->num_rows;
$num_fields = $res->field_count;

num_rows属性返回结果中的行数。field_count返回结果中的字段数。

$fields = $res->fetch_fields();

fetch_fields方法返回一个对象数组,表示结果集中的字段。这些是列名称。

while ($row = $res->fetch_row()) {

    for ($i = 0; $i < $num_fields; $i++) {

        echo $fields[$i]->name . ": " . $row[$i] . "\n";
    }

    echo "*******************************\n";
}

我们显示列名和数据。

$ php column_names.php
Select query returned 8 rows.
Select query returned 3 columns.
id: 1
name: Audi
price: 52642
*******************************
id: 2
name: Mercedes
price: 57127
*******************************
id: 3
name: Skoda
price: 9000
*******************************
...

这是输出。

这是PHPmysqli教程。

列出所有PHP教程。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏