PHP操作Mysql数据库

PHP操作MYSQL数据库

PHP 操作数据库的方式有多种如 mysqlmysqliPDO,目前主要使用的是 PDO 处理。

MySQLi或PDO扩展来操作MySQL数据库。这两个扩展提供了一组函数和方法,用于连接到数据库、执行查询、插入、更新和删除数据等操作。

PDO 提供了一个数据访问抽象层,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。

// 数据库连接配置
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$database = "your_database";

try {
    // 创建数据库连接
    $conn = new PDO("mysql:host=$servername;dbname=$database", $username, $password);

    // 设置错误模式为异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 执行查询
    $sql = "SELECT * FROM your_table";
    $stmt = $conn->query($sql);

    // 处理查询结果
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach ($result as $row) {
        echo "ID: " . $row['id'] . ", Name: " . $row['name'] . "<br>";
    }
} catch (PDOException $e) {
    echo "连接失败: " . $e->getMessage();
}

// 关闭数据库连接
$conn = null;

PDO的错误处理

错误类型说明
PDO::ERRMODE_SILENT不显示错误
PDO::ERRMODE_WARNING显示警告错误
PDO::ERRMODE_EXCEPTION抛出异常

MySQLi扩展连接到MySQL数据库,并执行查询操作:

// 数据库连接配置
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$database = "your_database";

// 创建数据库连接
$conn = new mysqli($servername, $username, $password, $database);

// 检查连接是否成功
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 执行查询
$sql = "SELECT * FROM your_table";
$result = $conn->query($sql);

// 处理查询结果
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "ID: " . $row["id"] . ", Name: " . $row["name"] . "<br>";
    }
} else {
    echo "没有结果";
}

// 关闭数据库连接
$conn->close();

常见的MySQLi错误类型:

  1. 连接错误(Connection Errors):
    • mysqli_connect_errno():返回连接错误的错误代码。
    • mysqli_connect_error():返回连接错误的错误消息。
  2. 查询错误(Query Errors):
    • mysqli_errno($conn):返回最近一次查询错误的错误代码。
    • mysqli_error($conn):返回最近一次查询错误的错误消息。
  3. 语法错误(Syntax Errors):
    • mysqli_sqlstate($conn):返回最近一次查询的SQL状态码,用于识别语法错误等。
  4. 预处理错误(Prepared Statement Errors):
    • mysqli_stmt_errno($stmt):返回预处理语句错误的错误代码。
    • mysqli_stmt_error($stmt):返回预处理语句错误的错误消息。

下面是PDO的常用函数:

连接时设置错误类型

$pdo =  new PDO($dns, $config['user'], $config['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

使用 setAttribute 方法设置错误处理方式

$pdo =  new PDO($dns, $config['user'], $config['password']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

exec执行SQL

$pdo->exec("INSERT INTO news (title) VALUES('php_project')");
echo "自增主键:".$pdo->lastInsertId();

$affectedRows = $pdo->exec("DELETE FROM news WHERE id>3");
echo "受影响的条数:".$affectedRows;

fetchAll 一次获取所有结果

...
$query = $pdo->query("select * from goods");
$rows = $query->fetchAll();
print_r($rows);
...

fetch 每次获取结果中的一条数据

...
$pdo =  new PDO($dns, $config['user'], $config['password']);
$query = $pdo->query("select * from goods");
while ($field = $query->fetch(PDO::FETCH_ASSOC)) {
	echo sprintf("编号:%s\t名称:%s<br/>", $field['id'], $field['title']);
}

SQL 注入

$query = $pdo->query("SELECT * FROM news WHERE id={$_GET['id']}");

如果 GET 参数如下将产生 SQL 注入

http://ss-s.cc/test/1.php?id=1 or id>1

使用预准备

下面使用参数绑定来执行预准备的查询操作

$sql = "SELECT * FROM news WHERE id=:id";
$sth = $pdo->prepare($sql);
$sth->execute(['id' => $_GET['id']]);
$rows = $sth->fetchAll(PDO::FETCH_ASSOC);
print_r($rows);

下面使用参数绑定形式的预准备操作执行添加操作

$sql = "INSERT INTO news (title) VALUES(:title)";
$sth = $pdo->prepare($sql);
$sth->execute(['title'=>'ss-s.cc']);
echo $pdo->lastInsertId();

占位符

使用问号占位符是另一种使用预准备的方式

$sth = $pdo->prepare("SELECT * FROM news WHERE id>?");
$sth->execute([3]);
print_r($sth->fetchAll());

使用占位符来执行添加操作

$sql = "INSERT INTO news (title) VALUES(?)";
$sth = $pdo->prepare($sql);
$sth->execute(['ss-s.cc']);
echo $pdo->lastInsertId();

以下是封装好链式调用的一个类:

class QueryBuilder
{
    protected $pdo;
    protected $table;
    protected $select = '*';
    protected $where = '';
    protected $groupBy = '';
    protected $orderBy = '';

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public function table($table)
    {
        $this->table = $table;
        return $this;
    }

    public function select($columns)
    {
        $this->select = $columns;
        return $this;
    }

    public function where($condition)
    {
        $this->where = "WHERE $condition";
        return $this;
    }

    public function groupBy($column)
    {
        $this->groupBy = "GROUP BY $column";
        return $this;
    }

    public function orderBy($column, $direction = 'ASC')
    {
        $this->orderBy = "ORDER BY $column $direction";
        return $this;
    }

    public function get()
    {
        $sql = "SELECT {$this->select} FROM {$this->table} {$this->where} {$this->groupBy} {$this->orderBy}";

        $stmt = $this->pdo->query($sql);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        return $result;
    }
}

// 使用示例
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$database = "your_database";

try {
    $pdo = new PDO("mysql:host=$servername;dbname=$database", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $query = new QueryBuilder($pdo);

    $result = $query->table('your_table')
                    ->select('id, name, email')
                    ->where('age > 18')
                    ->groupBy('gender')
                    ->orderBy('name', 'ASC')
                    ->get();

    foreach ($result as $row) {
        echo "ID: " . $row['id'] . ", Name: " . $row['name'] . ", Email: " . $row['email'] . "<br>";
    }

} catch (PDOException $e) {
    echo "错误: " . $e->getMessage();
}

请点赞,收藏,关注!感谢!

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
【完整课件如下】 MySQL从入门到精通 第01章 初始MySQL(共19页).ppt MySQL从入门到精通 第02章 MySQL的安装与配置(共14页).ppt MySQL从入门到精通 第03章 数据库的基本操作(共11页).ppt MySQL从入门到精通 第04章 数据表的基本操作(共26页).ppt MySQL从入门到精通 第05章 数据类型和运算符(共17页).ppt MySQL从入门到精通 第06章 MySQL函数(共76页).ppt MySQL从入门到精通 第07章 查询数据(共48页).ppt MySQL从入门到精通 第08章 插入、更新与删除数据(共10页).ppt MySQL从入门到精通 第09章 索引(共11页).ppt MySQL从入门到精通 第10章 存储过程和函数(共19页).ppt MySQL从入门到精通 第11章 视图(共20页).ppt MySQL从入门到精通 第12章 触发器(共11页).ppt MySQL从入门到精通 第13章 用户管理(共25页).ppt MySQL从入门到精通 第14章 数据备份与还原(共21页).ppt MySQL从入门到精通 第15章 MySQL日志(共22页).ppt MySQL从入门到精通 第16章 性能优化(共18页).ppt MySQL从入门到精通 第17章 MySQL Workbench5.2 的使用(共15页).ppt MySQL从入门到精通 第18章 MySQL Replication(共27页).ppt MySQL从入门到精通 第19章 MySQL Cluster(共49页).ppt MySQL从入门到精通 第20章 PHP操作MySQL数据库(共7页).ppt MySQL从入门到精通 第21章 MySQL实战-新闻发布系统数据库设计(共6页).ppt MySQL从入门到精通 第22章 MySQL实战-论坛管理系统数据库设计(共6页).ppt

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码炼金术

何以解忧,唯有打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值