PHP数据库操作:连接、查询和更新,一步一步教你玩转数据库
发布时间: 2024-08-01 21:13:29 阅读量: 16 订阅数: 11
![PHP数据库操作:连接、查询和更新,一步一步教你玩转数据库](https://img-blog.csdnimg.cn/img_convert/94a6d264d6da5a4a63e6379f582f53d0.png)
# 1. PHP数据库操作概述**
PHP数据库操作是处理数据库中数据的核心技术,它提供了连接、查询、更新和事务处理等功能。通过PHP数据库操作,我们可以实现数据的存储、检索、修改和管理,从而构建出功能强大的Web应用。本章将概述PHP数据库操作的基本概念和功能,为后续章节的深入探讨奠定基础。
# 2. PHP数据库连接**
**2.1 PDO连接方式**
PDO(PHP Data Objects)是PHP中面向对象操作数据库的扩展,它提供了统一的接口,可以连接和操作不同的数据库管理系统(DBMS)。
**2.1.1 PDO连接参数**
建立PDO连接时,需要指定以下参数:
| 参数 | 描述 |
|---|---|
| dsn | 数据源名称,指定要连接的数据库类型和数据库名称 |
| 用户名 | 连接数据库的用户名 |
| 密码 | 连接数据库的密码 |
| 选项 | 可选参数,用于设置连接属性,如字符集、错误模式等 |
**代码块:**
```php
$dsn = 'mysql:host=localhost;dbname=test';
$username = 'root';
$password = '123456';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
try {
$pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
echo '连接失败:' . $e->getMessage();
}
```
**逻辑分析:**
* `$dsn`指定了要连接的MySQL数据库,`host`为数据库服务器地址,`dbname`为数据库名称。
* `$username`和`$password`分别为数据库用户名和密码。
* `$options`数组设置了连接属性:
* `PDO::ATTR_ERRMODE`指定错误模式为异常模式,当发生错误时抛出异常。
* `PDO::ATTR_DEFAULT_FETCH_MODE`指定默认获取模式为关联数组,查询结果以键值对的形式返回。
* `try-catch`块用于捕获连接异常,如果连接失败,则输出错误信息。
**2.1.2 PDO连接异常处理**
当PDO连接失败时,会抛出`PDOException`异常。可以使用`try-catch`块捕获异常并进行处理。
**代码块:**
```php
try {
$pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
echo '连接失败:' . $e->getMessage();
exit;
}
```
**逻辑分析:**
* 如果连接成功,则`try`块中的代码会被执行。
* 如果连接失败,则会抛出`PDOException`异常,并被`catch`块捕获。
* `exit`语句用于终止脚本执行,防止后续代码执行。
**2.2 MySQLi连接方式**
MySQLi(MySQL Improved)是PHP中另一个用于操作MySQL数据库的扩展。它提供了面向过程的接口。
**2.2.1 MySQLi连接参数**
建立MySQLi连接时,需要指定以下参数:
| 参数 | 描述 |
|---|---|
| 服务器 | 数据库服务器地址 |
| 用户名 | 连接数据库的用户名 |
| 密码 | 连接数据库的密码 |
| 数据库 | 要连接的数据库名称 |
| 端口 | 数据库服务器端口,默认为3306 |
**代码块:**
```php
$mysqli = new mysqli('localhost', 'root', '123456', 'test', 3306);
if ($mysqli->connect_error) {
echo '连接失败:' . $mysqli->connect_error;
}
```
**逻辑分析:**
* `new mysqli()`函数创建了一个MySQLi对象,并指定了连接参数。
* `if`语句检查连接是否成功,如果`connect_error`属性不为空,则表示连接失败,并输出错误信息。
**2.2.2 MySQLi连接异常处理**
当MySQLi连接失败时,`connect_error`属性会被设置为错误信息。可以使用`if`语句检查连接是否成功。
**代码块:**
```php
if ($mysqli->connect_error) {
echo '连接失败:' . $mysqli->connect_error;
exit;
}
```
**逻辑分析:**
* 如果连接成功,则`if`语句中的代码会被执行。
* 如果连接失败,则`connect_error`属性会被设置为错误信息,并输出错误信息。
* `exit`语句用于终止脚本执行,防止后续代码执行。
# 3.1 基本查询语句
#### 3.1.1 SELECT语句
SELECT语句用于从数据库表中检索数据。其基本语法如下:
```php
SELECT column1, column2, ...
FROM table_name
WHERE condition;
```
其中:
* `column1`, `column2`, ...:要检索的列名
* `table_name`:要查询的表名
* `condition`:可选的条件,用于过滤检索结果
例如,以下查询语句将检索名为`users`表中的所有`id`, `name`和`email`列:
```php
SELECT id, name, email
FROM users;
```
#### 3.1.2 WHERE语句
WHERE语句用于根据指定的条件过滤查询结果。其基本语法如下:
```php
SELECT column1, column2, ...
FROM table_name
WHERE condition;
```
其中:
* `column1`, `column2`, ...:要检索的列名
* `table_name`:要查询的表名
* `condition`:用于过滤检索结果的条件
条件可以是任何有效的SQL表达式,例如:
* `column_name = value`:检索等于指定值的列
* `column_name > value`:检索大于指定值的列
* `column_name LIKE 'pattern'`:检索与指定模式匹配的列
例如,以下查询语句将检索`users`表中`name`列包含`"John"`的记录:
```php
SELECT id, name, email
FROM users
WHERE name LIKE '%John%';
```
# 4. PHP数据库更新
### 4.1 INSERT语句
INSERT语句用于向数据库表中插入新数据。它有两种主要形式:INSERT INTO语句和INSERT IGNORE语句。
#### 4.1.1 INSERT INTO语句
INSERT INTO语句的基本语法如下:
```php
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
```
其中:
* `table_name` 是要插入数据的表名。
* `column1`, `column2`, ... 是要插入数据的列名。
* `value1`, `value2`, ... 是要插入数据的列值。
**示例:**
```php
$sql = "INSERT INTO users (username, password, email)
VALUES ('admin', '123456', 'admin@example.com')";
```
此语句将在名为 `users` 的表中插入一条新记录,其中 `username` 为 `admin`,`password` 为 `123456`,`email` 为 `admin@example.com`。
#### 4.1.2 INSERT IGNORE语句
INSERT IGNORE语句与INSERT INTO语句类似,但它会忽略重复键的插入。这意味着如果要插入的数据与表中已有的数据冲突,则该语句将不会插入该数据。
INSERT IGNORE语句的基本语法如下:
```php
INSERT IGNORE INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
```
**示例:**
```php
$sql = "INSERT IGNORE INTO users (username, password, email)
VALUES ('admin', '123456', 'admin@example.com')";
```
此语句将在名为 `users` 的表中插入一条新记录,但如果表中已存在具有相同 `username` 的记录,则该语句将不会插入该数据。
### 4.2 UPDATE语句
UPDATE语句用于更新数据库表中的现有数据。它有两种主要形式:UPDATE语句的基本语法和UPDATE语句的条件限制。
#### 4.2.1 UPDATE语句的基本语法
UPDATE语句的基本语法如下:
```php
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition
```
其中:
* `table_name` 是要更新数据的表名。
* `column1`, `column2`, ... 是要更新数据的列名。
* `value1`, `value2`, ... 是要更新数据的列值。
* `condition` 是更新数据的条件。
**示例:**
```php
$sql = "UPDATE users
SET password = 'new_password'
WHERE username = 'admin'";
```
此语句将在名为 `users` 的表中更新具有 `username` 为 `admin` 的记录,将 `password` 列更新为 `new_password`。
#### 4.2.2 UPDATE语句的条件限制
UPDATE语句可以使用WHERE子句来限制要更新的数据。WHERE子句指定要更新哪些行。
**示例:**
```php
$sql = "UPDATE users
SET password = 'new_password'
WHERE username = 'admin' AND email = 'admin@example.com'";
```
此语句将在名为 `users` 的表中更新具有 `username` 为 `admin` 且 `email` 为 `admin@example.com` 的记录,将 `password` 列更新为 `new_password`。
### 4.3 DELETE语句
DELETE语句用于从数据库表中删除数据。它有两种主要形式:DELETE语句的基本语法和DELETE语句的条件限制。
#### 4.3.1 DELETE语句的基本语法
DELETE语句的基本语法如下:
```php
DELETE FROM table_name
WHERE condition
```
其中:
* `table_name` 是要删除数据的表名。
* `condition` 是删除数据的条件。
**示例:**
```php
$sql = "DELETE FROM users
WHERE username = 'admin'";
```
此语句将在名为 `users` 的表中删除具有 `username` 为 `admin` 的记录。
#### 4.3.2 DELETE语句的条件限制
DELETE语句可以使用WHERE子句来限制要删除的数据。WHERE子句指定要删除哪些行。
**示例:**
```php
$sql = "DELETE FROM users
WHERE username = 'admin' AND email = 'admin@example.com'";
```
此语句将在名为 `users` 的表中删除具有 `username` 为 `admin` 且 `email` 为 `admin@example.com` 的记录。
# 5. PHP数据库事务处理
### 5.1 事务的概念和特性
**5.1.1 ACID特性**
事务是数据库操作中一个不可分割的执行单元,它具有ACID特性:
- **原子性(Atomicity)**:事务中的所有操作要么全部成功,要么全部失败,不会出现部分成功的情况。
- **一致性(Consistency)**:事务执行前后,数据库必须处于一致的状态,即满足所有业务规则和约束。
- **隔离性(Isolation)**:并发执行的事务之间相互隔离,不会互相影响。
- **持久性(Durability)**:一旦事务提交,其对数据库的修改将永久生效,即使系统发生故障也不会丢失。
### 5.1.2 事务隔离级别
数据库系统通常提供多种事务隔离级别,以平衡并发性和数据一致性:
| 隔离级别 | 特性 |
|---|---|
| **读未提交(Read Uncommitted)** | 事务可以读取其他事务未提交的修改。 |
| **读已提交(Read Committed)** | 事务只能读取其他事务已提交的修改。 |
| **可重复读(Repeatable Read)** | 事务在执行过程中,不会看到其他事务对同一数据的修改。 |
| **串行化(Serializable)** | 事务按照串行顺序执行,完全隔离其他事务。 |
### 5.2 PHP中的事务处理
#### 5.2.1 开启事务
使用PDO开启事务:
```php
$pdo->beginTransaction();
```
#### 5.2.2 提交事务
如果事务执行成功,则提交事务:
```php
$pdo->commit();
```
#### 5.2.3 回滚事务
如果事务执行失败,则回滚事务:
```php
$pdo->rollBack();
```
### 代码示例
考虑一个简单的银行转账场景:
```php
<?php
// 开启事务
$pdo->beginTransaction();
// 从甲账户扣除金额
$sql = "UPDATE accounts SET balance = balance - ? WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$amount, $fromId]);
// 向乙账户增加金额
$sql = "UPDATE accounts SET balance = balance + ? WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$amount, $toId]);
// 提交事务
$pdo->commit();
```
**逻辑分析:**
- 开启事务,确保转账操作作为一个整体执行。
- 使用预处理语句防止SQL注入攻击。
- 扣除甲账户金额和增加乙账户金额的操作在同一事务中执行,保证原子性和一致性。
- 如果任何操作失败,事务将回滚,保证数据的完整性。
# 6. PHP数据库操作实践
### 6.1 用户管理系统
#### 6.1.1 创建数据库表
```php
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
```
#### 6.1.2 用户注册和登录
```php
// 用户注册
$stmt = $pdo->prepare("INSERT INTO users (username, password, email) VALUES (?, ?, ?)");
$stmt->execute([$username, $password, $email]);
// 用户登录
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
$user = $stmt->fetch();
```
#### 6.1.3 用户信息修改
```php
// 更新用户信息
$stmt = $pdo->prepare("UPDATE users SET username = ?, email = ? WHERE id = ?");
$stmt->execute([$newUsername, $newEmail, $id]);
// 删除用户
$stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
$stmt->execute([$id]);
```
### 6.2 博客系统
#### 6.2.1 创建数据库表
```php
CREATE TABLE posts (
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
author_id INT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
FOREIGN KEY (author_id) REFERENCES users (id)
);
CREATE TABLE comments (
id INT NOT NULL AUTO_INCREMENT,
post_id INT NOT NULL,
content TEXT NOT NULL,
author_id INT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
FOREIGN KEY (post_id) REFERENCES posts (id),
FOREIGN KEY (author_id) REFERENCES users (id)
);
```
#### 6.2.2 文章发布和管理
```php
// 发布文章
$stmt = $pdo->prepare("INSERT INTO posts (title, content, author_id) VALUES (?, ?, ?)");
$stmt->execute([$title, $content, $authorId]);
// 获取所有文章
$stmt = $pdo->prepare("SELECT * FROM posts");
$stmt->execute();
$posts = $stmt->fetchAll();
// 获取指定文章
$stmt = $pdo->prepare("SELECT * FROM posts WHERE id = ?");
$stmt->execute([$postId]);
$post = $stmt->fetch();
```
#### 6.2.3 评论管理
```php
// 添加评论
$stmt = $pdo->prepare("INSERT INTO comments (post_id, content, author_id) VALUES (?, ?, ?)");
$stmt->execute([$postId, $content, $authorId]);
// 获取所有评论
$stmt = $pdo->prepare("SELECT * FROM comments WHERE post_id = ?");
$stmt->execute([$postId]);
$comments = $stmt->fetchAll();
// 删除评论
$stmt = $pdo->prepare("DELETE FROM comments WHERE id = ?");
$stmt->execute([$commentId]);
```
0
0