zyxus/db

MySQL PDO 的 PHP 封装器

dev-master 2020-05-15 17:28 UTC

This package is auto-updated.

Last update: 2024-09-16 04:13:28 UTC


README

这是一个PDO的简单封装类。它最初是为内部用途开发的,目的是为了简化PDO的使用。查询构建器扩展了PDO的使用功能。

安装

通过 Composer 安装。

$ composer require zyxus/db

目录

使用

DB::query()

如果查询执行成功返回 true,如果没有返回任何结果返回 false。如果发生错误,将抛出异常,并输出脚本和错误行以及错误描述。

bool DB::query($query);

rowCount()

返回被查询处理行的数量

$count = DB::query($query)->rowCount();

fetch()

返回查询结果的一行

$count = DB::query($query)->fetch();

fetchAll()

返回查询结果的全部行

$count = DB::query($query)->fetch();

lastInsertId()

返回由查询插入的最后一条记录的ID

$count = DB::instance()->lastInsertId();

准备好的语句(prepared statements)

使用准备好的语句可以增强对SQL注入的保护。

准备好的语句是一个预先编译的SQL表达式,可以通过发送不同的数据集到服务器多次执行。另一个优点是,无法通过占位符的数据进行SQL注入。

无名称占位符(?)

$query = "SELECT `field1`, `field2` FROM `table` WHERE `id` = ? AND `field3` = ?";
$params = [100, 'Y'];
$data = DB::query($query, params)->fetch();

命名占位符(:placeholder_name)

$query = "SELECT `field1`, `field2` FROM `table` WHERE `id` = :id AND `field3` = :field3";
$params = [
    ':id' => 100,
    ':field3' => 'Y',
];
$data = DB::query($query, params)->fetch();

查询结果的选择 SELECT

选择一行 fetch()

$query = "SELECT `field` FROM `table` WHERE `id` = :id";
$articul = DB::query($query, [':id' => 2797])->fetch(); // если не указан PDO::FETCH_NUM то вернется ассоциативный массив

返回

[
    [id] => 1234
    [name] => Название поля
]
// или если в fetch(PDO::FETCH_NUM) то вернется нумерованный массив
[
    [0] => 1234
    [1] => Название поля
]

选择查询的所有结果 fetchAll()

$data = DB::query($query)->fetchAll();

选择返回索引的FETCH_STYLE

选择关联数组数据

$data = DB::query($query)->fetchAll(PDO::FETCH_ASSOC);

返回

[
    [0] => Array
        (
            [id] => 1234
            [name] => Название поля 1
        )
    [1] => Array
        (
            [id] => 1235
            [name] => Название поля 2
        )
    [2] => Array
        (
            [id] => 1236
            [name] => Название поля 3
        )
]

选择编号数组数据

$data = DB::query($query)->fetchAll(PDO::FETCH_NUM);

返回

[
    [0] => Array
        (
            [0] => 1234
            [1] => Название поля 1
        )
    [1] => Array
        (
            [0] => 1235
            [1] => Название поля 2
        )
    [2] => Array
        (
            [0] => 1236
            [1] => Название поля 3
        )
]

检查查询结果

$query = "SELECT `id`, `name` FROM `table` WHERE `id` = ?";
if (!$array = DB::query($query, [$id])->fetchAll()) {
    echo "Нет записей";
}
$query = "SELECT `name` FROM `table` WHERE `id` = ?";
$result = DB::query($query, [$articul]);

if ($result->rowCount() > 0) {

    $row = $result->fetch();
    echo $row['name'];

} else {

    echo "Empty results";
}

将行插入到表中 INSERT

$query = "
    INSERT INTO `table` (
        `id`,
        `title`
    ) VALUES (
        NULL,
        :title
    );
";
$params = array(
    ':title' => $title,
);
DB::query($query, $params);

INSERT ON DUPLICATE KEY UPDATE 语法

INSERT INTO 
    `table` 
SET 
    `field1` = :field1, 
    `field2` = :field2 
ON DUPLICATE KEY UPDATE 
    `field2` = VALUES(`field2`)

查询构建器

示例

$menu = DB::table('table')
    ->fields('table.id, table.name, table_parent.name as parent')
    ->limit(2, 2)
    ->order('table.id');

$menu->join('table', 'table_parent.id', 'table.parent_id', null, 'table_parent');
$menu->where('table.articul', '', '<>');
$products = $menu->exec();

table($table)

设置表

$query = DB::table('table');

fields($fields)

指定表字段

$query->fields('table.field1, table.field2');

join($table, $field1, $field2, $condition = ' = ', $alias = '')

$query->join('table', 'table.id', 'table.parent_id', null, 'table_alias');

innerJoin($table, $field1, $field2, $condition = ' = ', $alias = '')

join 相同。

where($field, $value, $condition = ' = ', $combine_condition = 'AND')

$query->where('table.title', '', '<>');

whereRaw($where)

$query->whereRaw('id = :id');

order($field, $direction = 'ASC')

根据字段 $field 进行排序,排序方向为 $direction

$query->order('id');

limit($limit, $from = '0')

$from 开始选择 $limit 条记录

$query->limit(10);

exec()

执行预编译的查询

$products = $query->exec();