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_mysql
PHP数据对象模块是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教程。