掌握PHP PDO:数据库世界的魔法师

介绍

1.1 什么是PDO?

PDO(PHP数据对象)是PHP的一个轻量级数据库访问抽象层,允许开发者以一种统一的方式访问多种不同类型的数据库,如MySQL、PostgreSQL、SQLite等。它提供了一组类和方法,使得在PHP应用程序中执行数据库查询和操作变得更加简单和安全。PDO通过使用面向对象的方式来处理数据库操作,提供了更加灵活和可维护的代码结构。

1.2 为什么选择PDO?

选择PDO的原因有多个:

  • 跨数据库兼容性: PDO支持多种数据库,这意味着您可以使用相同的代码与不同类型的数据库交互,而无需修改您的代码。这种跨数据库兼容性使得应用程序更加灵活和可移植。

  • 面向对象的接口: PDO提供了面向对象的接口,使得数据库操作更加直观和易于理解。通过使用PDO,您可以将数据库操作抽象成对象和方法的调用,从而提高代码的可读性和可维护性。

  • 安全性: PDO支持预处理语句和参数绑定,有效地防止了SQL注入攻击。预处理语句可以在执行之前编译SQL查询,并将参数值与查询分离,从而防止恶意用户插入恶意代码。

  • 性能优化: PDO具有一些性能优化功能,如持久连接和预处理语句缓存,可以提高数据库操作的性能和效率。

1.3 PDO与传统的MySQLi的区别

PDO和传统的MySQLi都是PHP中常用的数据库访问方式,它们之间有几个主要的区别:

  • 数据库支持: PDO支持多种数据库,而MySQLi仅支持MySQL数据库。如果您的应用程序需要与多种类型的数据库交互,那么PDO是更好的选择。

  • 接口风格: PDO提供了面向对象和面向过程两种接口风格,而MySQLi主要是面向过程的。如果您更喜欢面向对象的编程风格,那么PDO可能更适合您。

  • 安全性: PDO在安全性方面更胜一筹,因为它提供了内置的预处理语句和参数绑定功能,可以有效地防止SQL注入攻击。虽然MySQLi也支持预处理语句,但它的参数绑定功能相对较弱。

  • 扩展性: PDO相对于MySQLi具有更好的扩展性,因为它支持多种类型的数据库,并且可以通过自定义驱动程序进行扩展。

基础知识

2.1 连接数据库

在PDO中,连接到数据库非常简单。您只需要提供数据库的DSN(数据源名称)、用户名和密码即可。以下是连接数据库的基本步骤:

try {$dsn = "mysql:host=localhost;dbname=mydatabase";$username = "username";$password = "password";$pdo = new PDO($dsn, $username, $password);// 设置错误模式为异常$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);echo "数据库连接成功!";
} catch (PDOException $e) {echo "连接失败: " . $e->getMessage();
}

在上面的示例中,我们使用了new PDO()函数来创建一个PDO实例,并传入数据库的DSN、用户名和密码作为参数。然后,我们设置了PDO的错误模式为异常,以便在出现错误时抛出异常。

2.2 执行查询

执行查询操作可以通过query()方法实现。这个方法会返回一个PDOStatement对象,您可以用来获取查询结果。

try {$query = $pdo->query("SELECT * FROM users");while ($row = $query->fetch(PDO::FETCH_ASSOC)) {echo "ID: " . $row['id'] . ", Name: " . $row['name'] . "<br>";}
} catch (PDOException $e) {echo "查询失败: " . $e->getMessage();
}

在上面的示例中,我们使用query()方法执行了一个SELECT查询,并通过fetch()方法逐行获取查询结果。

2.3 准备和执行语句

为了防止SQL注入攻击,我们可以使用预处理语句。预处理语句通过先将SQL查询编译好,然后再传入参数执行,可以有效地防止恶意用户插入恶意代码。

try {$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");$name = "John";$email = "john@example.com";$stmt->bindParam(':name', $name);$stmt->bindParam(':email', $email);$stmt->execute();echo "数据插入成功!";
} catch (PDOException $e) {echo "插入失败: " . $e->getMessage();
}

在上面的示例中,我们使用了prepare()方法准备了一个INSERT语句,并使用bindParam()方法绑定了参数。最后,我们使用execute()方法执行了该语句。

2.4 绑定参数

绑定参数是一种重要的安全措施,可以防止SQL注入攻击。PDO提供了两种方法来绑定参数:bindParam()bindValue()

$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name, PDO::PARAM_STR);

在上面的示例中,我们使用了bindParam()方法绑定了参数:name。第三个参数指定了参数的数据类型,这是可选的,但推荐使用以确保安全性。

2.5 获取结果

执行查询后,您可以使用fetch()方法获取查询结果。

$stmt = $pdo->prepare("SELECT * FROM users");
$stmt->execute();$result = $stmt->fetch(PDO::FETCH_ASSOC);echo "ID: " . $result['id'] . ", Name: " . $result['name'];

在上面的示例中,我们使用了fetch()方法获取了查询结果的第一行,并将其存储在关联数组中。然后,我们可以直接访问数组中的字段来获取结果。

查询

3.1 查询单行数据

要查询单行数据,您可以使用fetch()方法。以下是一个示例:

try {$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");$stmt->bindParam(':id', $id, PDO::PARAM_INT);$id = 1;$stmt->execute();$row = $stmt->fetch(PDO::FETCH_ASSOC);if ($row) {echo "ID: " . $row['id'] . ", Name: " . $row['name'];} else {echo "未找到该用户!";}
} catch (PDOException $e) {echo "查询失败: " . $e->getMessage();
}

在上面的示例中,我们首先准备了一个SELECT语句,然后使用bindParam()方法绑定了参数:id。接着,我们执行了该语句,并使用fetch()方法获取了查询结果的第一行数据。

3.2 查询多行数据

要查询多行数据,您可以使用循环结构和fetch()方法。以下是一个示例:

try {$stmt = $pdo->prepare("SELECT * FROM users");$stmt->execute();while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {echo "ID: " . $row['id'] . ", Name: " . $row['name'] . "<br>";}
} catch (PDOException $e) {echo "查询失败: " . $e->getMessage();
}

在上面的示例中,我们准备了一个SELECT语句,并执行了该语句。然后,我们使用循环结构和fetch()方法逐行获取查询结果,并输出每行数据。

3.3 插入数据

要插入数据,您可以使用prepare()方法准备一个INSERT语句,并使用bindParam()bindValue()方法绑定参数,最后使用execute()方法执行语句。以下是一个示例:

try {$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");$stmt->bindParam(':name', $name);$stmt->bindParam(':email', $email);$name = "John";$email = "john@example.com";$stmt->execute();echo "数据插入成功!";
} catch (PDOException $e) {echo "插入失败: " . $e->getMessage();
}

在上面的示例中,我们准备了一个INSERT语句,并使用bindParam()方法绑定了参数:name:email。然后,我们为这些参数赋值,并使用execute()方法执行了该语句。

3.4 更新数据

要更新数据,您可以使用prepare()方法准备一个UPDATE语句,并使用bindParam()bindValue()方法绑定参数,最后使用execute()方法执行语句。以下是一个示例:

try {$stmt = $pdo->prepare("UPDATE users SET email = :email WHERE id = :id");$stmt->bindParam(':email', $email);$stmt->bindParam(':id', $id);$email = "new_email@example.com";$id = 1;$stmt->execute();echo "数据更新成功!";
} catch (PDOException $e) {echo "更新失败: " . $e->getMessage();
}

在上面的示例中,我们准备了一个UPDATE语句,并使用bindParam()方法绑定了参数:email:id。然后,我们为这些参数赋值,并使用execute()方法执行了该语句。

3.5 删除数据

要删除数据,您可以使用prepare()方法准备一个DELETE语句,并使用bindParam()bindValue()方法绑定参数,最后使用execute()方法执行语句。以下是一个示例:

try {$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");$stmt->bindParam(':id', $id);$id = 1;$stmt->execute();echo "数据删除成功!";
} catch (PDOException $e) {echo "删除失败: " . $e->getMessage();
}

在上面的示例中,我们准备了一个DELETE语句,并使用bindParam()方法绑定了参数:id。然后,我们为这个参数赋值,并使用execute()方法执行了该语句。

高级技巧

4.1 事务处理

事务是一组数据库操作,要么全部执行成功,要么全部失败回滚。在PDO中,您可以使用beginTransaction()commit()rollBack()方法来管理事务。

try {$pdo->beginTransaction();// 执行一系列数据库操作$pdo->commit();echo "事务提交成功!";
} catch (PDOException $e) {$pdo->rollBack();echo "事务回滚: " . $e->getMessage();
}

在上面的示例中,我们使用beginTransaction()方法开始一个事务,然后执行一系列数据库操作。如果所有操作成功,则使用commit()方法提交事务;如果其中任何一个操作失败,则使用rollBack()方法回滚事务。

4.2 预处理语句

预处理语句可以防止SQL注入攻击,并提高性能。在PDO中,您可以使用prepare()方法准备一个预处理语句。

$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$id = 1;
$stmt->execute();

在上面的示例中,我们准备了一个SELECT语句,并使用bindParam()方法绑定了参数:id。然后,我们为参数赋值并执行了该语句。

4.3 错误处理

PDO默认情况下将错误模式设置为静默模式,如果发生错误,您需要手动检查并处理。您可以通过将错误模式设置为异常模式来自动抛出异常。

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

在上面的示例中,我们将错误模式设置为异常模式,这样PDO将在发生错误时抛出异常,您可以通过捕获这些异常来处理错误。

4.4 PDO扩展性和可移植性

PDO支持多种类型的数据库,并且可以通过自定义驱动程序进行扩展。这使得PDO具有很好的扩展性和可移植性,您可以轻松地将应用程序迁移到不同类型的数据库上。

4.5 使用PDO进行安全编程

使用PDO进行安全编程非常重要。您应该始终使用预处理语句和参数绑定来防止SQL注入攻击。此外,还应该对输入数据进行验证和过滤,以确保数据的安全性。

$name = $_POST['name'];
$email = $_POST['email'];$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->execute();

在上面的示例中,我们首先获取用户输入的数据,并使用预处理语句和参数绑定来插入数据。这样可以有效地防止SQL注入攻击。

性能优化

5.1 使用预处理语句

预处理语句可以显著提高数据库操作的性能,特别是在执行多次相似的查询时。因为预处理语句只编译一次,然后可以多次执行,从而减少了每次执行查询时的开销。

$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$id = 1;
$stmt->execute();

在上面的示例中,我们准备了一个预处理SELECT语句,并使用bindParam()方法绑定了参数:id。然后,我们可以多次执行这个预处理语句,而不需要重新编译。

5.2 使用绑定参数

绑定参数可以防止SQL注入攻击,并提高性能。因为绑定参数可以减少查询语句的解析时间,并且可以重复使用已编译的查询计划。

$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$id = 1;
$stmt->execute();

在上面的示例中,我们使用bindParam()方法绑定了参数:id,并为其指定了整数类型。这样可以确保参数的安全性,并提高性能。

5.3 选择正确的PDO驱动

选择正确的PDO驱动也可以影响性能。不同的数据库有不同的PDO驱动程序,您应该根据您的具体需求选择合适的驱动程序。

例如,如果您的应用程序需要与MySQL数据库交互,您可以选择mysql或mysqli PDO驱动;如果您需要与PostgreSQL数据库交互,您可以选择pgsql PDO驱动。

$dsn = "mysql:host=localhost;dbname=mydatabase";
$username = "username";
$password = "password";$pdo = new PDO($dsn, $username, $password);

在上面的示例中,我们使用了MySQL的PDO驱动来连接到数据库。确保选择适合您的数据库类型的PDO驱动可以提高性能和可靠性。

安全性

6.1 防止SQL注入攻击

SQL注入是一种常见的安全漏洞,可以通过在用户输入中插入恶意SQL代码来攻击数据库。为了防止SQL注入攻击,您应该始终使用预处理语句和参数绑定来处理用户输入。

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':password', $password, PDO::PARAM_STR);
$stmt->execute();

在上面的示例中,我们使用了预处理语句和参数绑定来查询用户输入的用户名和密码,这样可以防止恶意用户插入恶意SQL代码。

6.2 数据验证和过滤

除了防止SQL注入攻击之外,您还应该对用户输入的数据进行验证和过滤,以确保数据的安全性。您可以使用PHP的过滤器函数来过滤用户输入的数据。

$username = $_POST['username'];
$email = $_POST['email'];if (filter_var($email, FILTER_VALIDATE_EMAIL)) {// 邮箱地址有效,执行操作
} else {// 邮箱地址无效,给出错误提示
}

在上面的示例中,我们使用了FILTER_VALIDATE_EMAIL过滤器来验证用户输入的邮箱地址是否有效。如果邮箱地址有效,则可以执行相应的操作;否则,应该给出错误提示。

6.3 使用PDO实现权限控制

为了确保数据的安全性,您应该使用PDO实现权限控制。这意味着只给予应用程序需要的最低权限来执行数据库操作。

GRANT SELECT, INSERT, UPDATE, DELETE ON database.* TO 'username'@'localhost' IDENTIFIED BY 'password';

在上面的示例中,我们给予了一个用户对数据库的SELECT、INSERT、UPDATE和DELETE权限。这样可以确保用户只能执行必要的数据库操作,从而减少了安全风险。

综上所述,通过防止SQL注入攻击、对用户输入进行验证和过滤,以及实现权限控制,您可以确保应用程序的数据安全性。

常见问题与解决方案

7.1 连接数据库的最佳实践

连接数据库时,有一些最佳实践可以帮助您确保连接的安全性和性能:

  • 使用DSN字符串: 使用DSN(数据源名称)字符串来指定数据库连接信息,包括数据库类型、主机地址、数据库名称等。
  • 使用长连接: 对于频繁连接数据库的应用程序,考虑使用长连接(Persistent Connections),可以减少连接和断开连接的开销。
  • 设置错误模式: 将PDO的错误模式设置为异常模式,以便在出现错误时抛出异常,方便调试和错误处理。
  • 安全认证信息: 避免在代码中明文存储数据库的用户名和密码,可以将认证信息存储在安全的位置,并使用配置文件或环境变量进行引用。

7.2 如何处理大量数据

处理大量数据时,您可以采取一些策略来优化性能和内存使用:

  • 分批处理: 将大量数据分成多个较小的批次进行处理,以减少内存使用和提高性能。
  • 使用游标: 使用PDO的游标功能(例如PDO::ATTR_CURSOR)可以在数据库中遍历大量数据,而不需要一次性将所有数据加载到内存中。
  • 优化查询: 编写高效的SQL查询语句,并确保数据库的索引和优化配置合理。

7.3 如何处理二进制数据

处理二进制数据时,您应该注意以下几点:

  • 使用BLOB类型: 在数据库中存储二进制数据时,应该使用BLOB(Binary Large Object)类型的字段。
  • 使用参数绑定: 当插入或更新二进制数据时,使用参数绑定功能来确保数据的安全性和正确性。
  • 编码和解码: 在将二进制数据存储到数据库中或从数据库中检索时,确保正确地进行编码和解码,以避免数据损坏或丢失。

通过采取适当的策略和措施,您可以有效地处理大量数据和二进制数据,并确保应用程序的性能和安全性。

简单案例

8.1 构建简单的CRUD应用程序

在这个案例研究中,我们将构建一个简单的CRUD(Create, Read, Update, Delete)应用程序,用于管理用户信息。我们将使用PDO来连接数据库并执行相关操作。

步骤一:数据库准备

首先,我们需要创建一个名为users的表,用于存储用户信息,包括idusernameemail字段。

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL
);
步骤二:连接数据库

接下来,我们将使用PDO来连接到数据库。

$dsn = "mysql:host=localhost;dbname=mydatabase";
$username = "username";
$password = "password";$pdo = new PDO($dsn, $username, $password);
步骤三:创建用户
$username = "john";
$email = "john@example.com";$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (:username, :email)");
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->execute();echo "用户创建成功!";
步骤四:读取用户信息
$stmt = $pdo->query("SELECT * FROM users");while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {echo "ID: " . $row['id'] . ", Username: " . $row['username'] . ", Email: " . $row['email'] . "<br>";
}
步骤五:更新用户信息
$newUsername = "jane";
$id = 1;$stmt = $pdo->prepare("UPDATE users SET username = :username WHERE id = :id");
$stmt->bindParam(':username', $newUsername, PDO::PARAM_STR);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();echo "用户信息更新成功!";
步骤六:删除用户
$id = 1;$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();echo "用户删除成功!";

8.2 使用PDO进行用户身份验证

在这个案例研究中,我们将使用PDO来实现基本的用户身份验证功能,包括注册、登录和退出。

步骤一:注册用户
$username = "john";
$email = "john@example.com";
$password = password_hash("password123", PASSWORD_DEFAULT);$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (:username, :email, :password)");
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->bindParam(':password', $password, PDO::PARAM_STR);
$stmt->execute();echo "用户注册成功!";
步骤二:用户登录
$username = "john";
$password = "password123";$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->execute();$user = $stmt->fetch(PDO::FETCH_ASSOC);if ($user && password_verify($password, $user['password'])) {echo "登录成功!";
} else {echo "用户名或密码错误!";
}
步骤三:用户退出

用户退出时,只需销毁会话数据即可。

session_start();
session_destroy();echo "用户退出成功!";

以上是一个简单的用户身份验证示例,通过使用PDO和密码哈希来确保用户的安全性。

总结

PHP PDO是一个强大而灵活的工具,可以帮助开发者更轻松地与数据库进行交互,并构建安全、高效的Web应用程序。通过掌握PDO的各种功能和技巧,开发者可以提高自己的编程能力,并开发出更加稳健和可靠的应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EndNote】EndNote进行文献管理可能遇到的问题和解决方案

一、安装GB/T7714-2015(numberic)文献style windows&#xff1a;https://blog.csdn.net/qq_36235935/article/details/115629694 mac os&#xff1a;Mac版Endnote 20导入中文参考格式Chinese Std GBT7714 (numeric)-CSDN博客 安装完之后需要调整Author Name格式&#xff1a;…

Python文件与面向对象知识点

目录 文件的基本概念 文件的读取 文件的追加 文件的写入 with语句 知识总结 面向对象的基本概念 类和实例 对象的属性和方法 类属性与方法 面向对象的三大特性 知识总结 文件的基本概念 文件的读取 文件的追加 文件的写入 with语句 知识总结 面向对象的基本概念 …

docker拉取镜像一直在加载中,且会提示error pulling image configuration

1、增加国内镜像配置 #查看文件内容 sudo vim /etc/docker/daemon.json如果没有该文件&#xff0c;则需要在/etc/docker中创建一个daemon.json 文件 创建文件 vim daemon.json#文件中添加以下json {"registry-mirrors":["https://docker.mirrors.ustc.edu.cn/…

第六十六天打卡 | 卡码网101 孤岛的总面积、卡码网102 沉没孤岛、卡码网103 水流问题、卡码网104 建造最大岛屿

卡码网101 孤岛的总面积 这一题在昨天的基础上&#xff0c;将比较得出最大孤岛面积的逻辑改为统计所有孤岛面积之和的逻辑即可。 最近做项目的时候也发现&#xff0c;很多时候代码逻辑能够复用最好就不要再自己写&#xff0c;防止出错&#xff0c;当然刷代码题的时候不…

webpack总结16--webpack入门学习

总结 通过前面的内容我们学会了 Webpack 基本使用&#xff0c;掌握了以下功能&#xff1a; 1.两种开发模式 开发模式&#xff1a;代码能编译自动化运行生产模式&#xff1a;代码编译优化输出 2.Webpack 基本功能 开发模式&#xff1a;可以编译 ES Module 语法生产模式&#…

V4L2读取摄像头资源

1.V4L2 它是Linux内核中标准的关于视频驱动程序&#xff0c;Video for Linux 2&#xff0c;简称V4L2。 它为Linux下的视频驱动提供了统一的接口&#xff0c;使得应用程序可以使用统一的API操作不同的视频设备。 V4L2支持三类设备&#xff1a;视频输入输出设备、VBI设备和rad…

MongoDB的Go语言操作示例总结

目录 前提条件 连接到MongoDB 简单示例 插入文档 查询文档 查询单个文档 查询多个文档 更新文档 更新单个文档 更新多个文档 删除文档 删除单个文档 删除多个文档 聚合管道 常见聚合操作符 $match $group $project $sort $limit $skip $lookup $unwind …

LeetCode---402周赛

题目列表 3184. 构成整天的下标对数目 I 3185. 构成整天的下标对数目 II 3186. 施咒的最大总伤害 3187. 数组中的峰值 一、构成整天的下标对数目 I & II 可以直接二重for循环暴力遍历出所有的下标对&#xff0c;然后统计符合条件的下标对数目返回。代码如下 class So…

概率论与数理统计期末复习

概率论常考知识点汇总 总括 1. 基础概率论 概率定义&#xff1a;理解概率是事件发生的可能性度量&#xff0c;范围从0&#xff08;不可能&#xff09;到1&#xff08;必然发生&#xff09;。概率公理&#xff1a;掌握概率的三大公理&#xff0c;即非负性、规范性和可加性。条…

深入理解 Nginx 的正向代理和反向代理

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

专利的黑白图片处理:

1&#xff0c;本来是彩色图片&#xff0c;首先就是使用滤镜处理成黑白的 2&#xff0c;插入word中的时候&#xff0c;直接讲图片的背景色设置成和word一样的颜色 如何在word文档里插入图片&#xff0c;让插入图片的背景颜色变成和word文档背景相同的白色&#xff1f;...急求啊…

HTML静态网页成品作业(HTML+CSS)——美食火锅介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

微信对话生成器2.0版本

微信对话生成器2.0版&#xff0c;这是一款革命性的通讯辅助工具&#xff0c;在数字通信领域带来了新的创新浪潮。这一升级版的生成器不仅囊括了从基本的文字编辑、格式调整到语音转换的多种功能&#xff0c;更重要的是&#xff0c;它提供了模拟真实对话的能力&#xff0c;使得用…

使用 git 遇到权限错误,重新生成SSH密钥

如果在执行 git 相关的命令的时候遇到权限错误&#xff0c;可能是因为你之前使用了不同的用户名在本地生成了SSH密钥。你可以尝试以下步骤来解决这个问题&#xff1a; 打开终端&#xff0c;并执行以下命令来删除旧的SSH密钥文件&#xff1a; rm ~/.ssh/id_rsa rm ~/.ssh/id_rsa…

容器之对齐构件

代码&#xff1a; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_ne…

C++ 72 之 友元和类模版

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <string>// 写法2&#xff1a; // template<class T1, class T2> // class Students12;// 要提前用到Students12&#xff0c;需要在前面先让编译器见过Students12才可…

汇聚荣做拼多多运营口碑怎么样?

拼多多作为国内领先的电商平台&#xff0c;其运营口碑一直是业界和消费者关注的焦点。汇聚荣作为拼多多的运营服务商&#xff0c;其服务质量直接影响到拼多多平台的用户体验和品牌形象。那么&#xff0c;汇聚荣做拼多多运营口碑怎么样呢? 一、服务响应速度 汇聚荣在服务响应速…

树莓派4B学习笔记11:PC端网线SSH连接树莓派_网线连接请求超时问题解决

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 今日学习使用网线连接树莓派&#xff0c;网线可以提供更…

vos3000外呼系统通话会话超时中断详解

在VOS3000中&#xff0c;通话会话超时中断可能由多种因素引起。这些因素包括网络问题、配置错误、硬件资源不足等。以下是一些可能导致通话会话超时中断的详细解释&#xff1a; 网络问题&#xff1a; 网络延迟和丢包&#xff1a;网络延迟或丢包会导致数据包在传输过程中被丢弃或…

邮件推送服务商有哪些核心功能?怎么选择?

邮件推送服务商支持哪些营销工具&#xff1f;推送性能如何评估&#xff1f; 邮件推送服务商的核心功能可以帮助企业更高效地管理和优化其电子邮件营销活动&#xff0c;从而提升客户参与度和转化率。AokSend将详细介绍邮件推送服务商的一些核心功能。 邮件推送服务商&#xff…