PDO连接MySql数据库

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
从 PHP 5.1 开始附带了 PDO,在 PHP 5.0 中是作为一个 PECL 扩展使用。 PDO 需要PHP 5 核心的新 OO 特性,因此不能在较早版本的 PHP 上运行。

https://www.php.net/manual/zh/book.pdo.php

快速连接MySql数据库

<?php
$config = [
    "host" => "localhost",
    "username" => "root",
    "password" => "root",
    "database" => "test",
    "charset" => "utf8"
];
​
$dsn = sprintf("mysql:host=%s;dbname=%s;charset=%s", $config["host"], $config["database"], $config["charset"]);
​
try {
    $pdo = new PDO($dsn, $config["username"], $config["password"]);
} catch (Exception $e) {
    die($e->getMessage());
}

错误与错误处理

PDO 提供了三种不同的错误处理模式,以满足不同风格的应用开发:

  • PDO::ERRMODE_SILENT
    • 此为默认模式。 PDO 将只简单地设置错误码,可使用 PDO::errorCode()PDO::errorInfo() 方法来检查语句和数据库对象。
  • PDO::ERRMODE_WARNING
    • 除设置错误码之外,PDO 还将发出一条传统的 E_WARNING 信息。
  • DO::ERRMODE_EXCEPTION
    • 除设置错误码之外,PDO 还将抛出一个 PDOException 异常类并设置它的属性来反射错误码和错误信息。
<?php
​$config = [
    "host" => "localhost",
    "username" => "root",
    "password" => "root",
    "database" => "test",
    "charset" => "utf8"
];
​
$dsn = sprintf("mysql:host=%;dbname=%s;charset=%s", $config["host"], $config["database"], $config["charset"]);
​
try {
    $pdo = new PDO($dsn, $config["username"], $config["password"]);
    // 设置错误处理模式为警告
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
} catch (Exception $e) {
    die($e->getMessage());
}

执行SQL语句

PDO::exec

  • (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
  • PDO::exec — 执行一条 SQL 语句,并返回受影响的行数
PDO::exec ( string $statement ) : int

PDO::exec() 在一个单独的函数调用中执行一条 SQL 语句,返回受此语句影响的行数。 PDO::exec() 不会从一条 SELECT 语句中返回结果。对于在程序中只需要发出一次的 SELECT 语句,可以考虑使用 PDO::query()。对于需要发出多次的语句,可用 PDO::prepare() 来准备一个 PDOStatement 对象并用 PDOStatement::execute() 发出语句。

<?php
​$config = [
    "host" => "localhost",
    "username" => "root",
    "password" => "root",
    "database" => "test",
    "charset" => "utf8"
];
​
$dsn = sprintf("mysql:host=%;dbname=%s;charset=%s", $config["host"], $config["database"], $config["charset"]);
​
try {
    $pdo = new PDO($dsn, $config["username"], $config["password"]);
    // 删除 user 数据表中满足条件的行,并返回受影响的行数。
   echo $pdo->exec("DELETE FROM user WHERE id = 1");
} catch (Exception $e) {
    die($e->getMessage());
}

PDO::lastInsertId

  • (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
  • PDO::lastInsertId — 返回最后插入行的ID或序列值
PDO::lastInsertId ([ string $name = NULL ] ) : string

返回最后插入行的ID,或者是一个序列对象最后的值,取决于底层的驱动。比如,PDO_PGSQL() 要求为 name 参数指定序列对象的名称。

<?php
​$config = [
    "host" => "localhost",
    "username" => "root",
    "password" => "root",
    "database" => "test",
    "charset" => "utf8"
];
​
$dsn = sprintf("mysql:host=%;dbname=%s;charset=%s", $config["host"], $config["database"], $config["charset"]);
​
try {
    $pdo = new PDO($dsn, $config["username"], $config["password"]);
    // 插入数据到 user 数据表,并返回受影响的行数。
    echo $pdo->exec("INSERT INTO user (name,sex,age)VALUES ('admin','男',18)");
    // 返回最后插入行的ID
    echo $pdo->lastInsertId();
} catch (Exception $e) {
    die($e->getMessage());
}

PDO::query

  • (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.2.0)
  • PDO::query — 执行 SQL 语句,以 PDOStatement 对象形式返回结果集
public PDO::query ( string $statement ) : PDOStatement
public PDO::query ( string $statement , int $PDO::FETCH_COLUMN , int $colno ) : PDOStatement
public PDO::query ( string $statement , int $PDO::FETCH_CLASS , string $classname , array $ctorargs ) : PDOStatement
public PDO::query ( string $statement , int $PDO::FETCH_INTO , object $object ) : PDOStatement
  • PDO::query() 在单次函数调用内执行 SQL 语句,以 PDOStatement 对象形式返回结果集(如果有数据的话)。
  • 如果反复调用同一个查询,用 PDO::prepare() 准备 PDOStatement 对象,并用 PDOStatement::execute() 执行语句,将具有更好的性能。
  • 如果没有完整获取结果集内的数据,就调用下一个 PDO::query(),将可能调用失败。 应当在执行下一个 PDO::query() 前,先用 PDOStatement::closeCursor() 释放数据库 PDOStatement 关联的资源。
<?php
​$config = [
    "host" => "localhost",
    "username" => "root",
    "password" => "root",
    "database" => "test",
    "charset" => "utf8"
];
​
$dsn = sprintf("mysql:host=%;dbname=%s;charset=%s", $config["host"], $config["database"], $config["charset"]);
​
try {
    $pdo = new PDO($dsn, $config["username"], $config["password"]);
    $sql = 'SELECT name, sex, age FROM user ORDER BY name';
    // query() 输出数据方式有两种
    
    // 第一种
    foreach ($pdo->query($sql) as $row) {
        print $row['name'] . "\t";
        print $row['sex'] . "\t";
        print $row['age'] . "\n";
    }
    
    // 第二种
    $query  = $pdo->query($sql);
    print_r($query->fetchAll());
} catch (Exception $e) {
    die($e->getMessage());
}

预准备解析SQL语句

PDO::prepare

  • (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
  • PDO::prepare — 准备要执行的语句,并返回语句对象
public PDO::prepare ( string $statement [, array $driver_options = array() ] ) : PDOStatement
  • PDOStatement::execute() 方法准备待执行的 SQL 语句。 SQL 语句可以包含零个或多个参数占位标记,格式是命名(:name)或问号(?)的形式,当它执行时将用真实数据取代。 在同一个 SQL 语句里,命名形式和问号形式不能同时使用;只能选择其中一种参数形式。 请用参数形式绑定用户输入的数据,不要直接字符串拼接到查询里。
  • 调用 PDOStatement::execute() 时,每一个值的参数占位标记,名称必须唯一。 除非启用模拟(emulation)模式,同一个语句里无法使用重名的参数。
<?php
$config = [
    "host" => "localhost",
    "username" => "root",
    "password" => "root",
    "database" => "test",
    "charset" => "utf8"
];

$dsn = sprintf("mysql:host=%;dbname=%s;charset=%s", $config["host"], $config["database"], $config["charset"]);

try {
    $pdo = new PDO($dsn, $config["username"], $config["password"]);
    $sql = 'SELECT name, sex, age FROM user ORDER BY name';
    // execute() 预准备解析SQL语句两种
    
    // 第一种 用命名参数形式准备 SQL 语句参数
    /* 传入数组的值,并执行准备好的语句 */
    $sql = 'SELECT name, sex, age FROM user WHERE age < :age AND id = :id';
    $sth = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
    $sth->execute(array(':age' => 15, ':id' => 10));
    $red = $sth->fetchAll();
    $sth->execute(array(':age' => 17, ':id' => 1));
    $yellow = $sth->fetchAll();
    
    // 第二种 用问号形式准备 SQL 语句参数
    /* 传入数组的值,并执行准备好的语句 */
    $sql = 'SELECT name, sex, age FROM user WHERE age < ? AND id = ?';
    $sth = $pdo->prepare($sql);
    $sth->execute(array(15, 10));
    $red = $sth->fetchAll();
    $sth->execute(array(17, 1));
    $yellow = $sth->fetchAll();

} catch (Exception $e) {
    die($e->getMessage());
}