数据库

PDO 是一个数据库连接抽象类库 — 自 5.1.0 版本起内置于 PHP 当中 — 它提供了一个通用的接口来与不同的数据库进行交互。

Lime 的 \Lime\Pdo 数据库类只是简单地对 PDO 包装起来, 方便使用而已。

创建一个 \Lime\Pdo 对象

$pdo = new \Lime\Pdo([
    'dsn'        => 'mysql:host=127.0.0.1;dbname=demo',
    'username'   => 'root',
    'password'   => '123456',
    'charset'    => 'utf8',
    'prefix'     => 'blog_',
]);

预处理语句

预处理语句并返回一个 PDOStatement 对象。

使用预处理语句的另外一个好处是,如果你在同一会话中多次执行相同的语句, 只被解析和编译一次,提高了速度。

$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';

$sth = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();

执行语句 exec()

执行一条 SQL 语句,并返回受影响的行数

/*  删除 FRUIT 数据表中满足条件的所有行 */
$count = $pdo->exec("DELETE FROM fruit WHERE colour = 'red'");

执行语句 query()

执行 SQL 语句并并返回一个 PDOStatement 对象

$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';

$sth = $pdo->query($sql, [':calories' => 150, ':colour' => 'red']);

while($row = $sth->fetch()) {
    // ...
}

设置字符集

$pdo->setCharset('utf8');

转义

$pdo->quote("it's a apple.");

添加表前缀

如果创建 \Lime\Pdo 对象时,设置了 prefix 选项,Lime 会自动帮你添加表前缀。

例如,'prefix' => 'wp_'

$pdo->query("SELECT * FROM {{post}}");
// 相当于
$pdo->query("SELECT * FROM wp_post");

还可以直接返回:

$table = $pdo->tableName('post'); // wp_post

最后插入行的ID或序列值

$pdo->lastInsertId();

返回处理后的 SQL 语句

此方法主要用于调试使用

$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';

echo $pdo->SQL($sql, [':calories' => 150, ':colour' => 'red']);

打印输出:

SELECT name, colour, calories FROM fruit WHERE calories < 150 AND colour = 'red'

事务

$pdo->beginTransaction(); // 开始一个事务

try {
    $sth = $pdo->exec("DROP TABLE fruit");
    $sth = $pdo->exec("UPDATE dessert
        SET name = 'hamburger'");
} catch(Exception $e) {
    $pdo->rollBack(); // 出错了,回滚事务
    exit();
}

$pdo->commit(); // 提交事务

如果只是执行一条 SQL 语句,可以这样:

$pdo->transaction('UPDATE dessert SET name = :name', ['name' => 'hamburger']);