silverslice / easydb
易于使用的mysqli包装器
Requires
- php: >=5.4
Requires (Dev)
- phpunit/phpunit: ~4.4
- satooshi/php-coveralls: ~0.6
- squizlabs/php_codesniffer: ~2.3
This package is auto-updated.
Last update: 2024-09-18 17:27:36 UTC
README
EasyDb 是一个简单的 myslqi 扩展包装器。
这个库为你提供了什么?
- 使用不同类型的数据占位符安全地传递数据到查询中。
- 只需一个方法即可选择单个单元格或所有行。
- 通过传递列-值数组来插入和更新行。
- 仅用一个方法使用事务。
- 执行多个查询来加载你的 SQL 备份。
- 在不写大量代码的情况下执行多个插入和
insert... on duplicate update
查询。
安装
使用 composer 安装库。
composer require silverslice/easydb
连接到数据库
use Silverslice\EasyDb\Database; // connect options $options = [ 'host' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'testdb', 'charset' => 'utf8' ]; // mysql options (not required) $mysqlOptions = [MYSQLI_INIT_COMMAND => 'SET AUTOCOMMIT = 0']; $db = new Database($options, $mysqlOptions);
数据占位符
EasyDb 使用数据占位符在查询中放置数据。
占位符类型
?
- 智能型
在大多数情况下,您可以使用此占位符。它会自动检测您的值并正确格式化。
- 整数值将被原样插入。
- NULL 值将被插入为 NULL 关键字。
- 数据库表达式将被原样插入。
- 在其他情况下,值将作为字符串插入。
?i
- 整数
值将被 cast 到 int 类型,使用 intval 函数。
?s
- 字符串
值将被 mysqli 内部转义函数转义,并用单引号括起来。
?f
- 浮点数
值将被 cast 到 float 类型,使用 floatval 函数。
?a
- 数组
此占位符期望数组,正确转义和引号其值,并用逗号分隔。它适用于如 SELECT * FROM table WHERE id IN (1, 2, 3)
的查询。
$db->getAll('SELECT * FROM table WHERE id IN (?a)', [1, 2, 3]); // generated sql: SELECT * FROM table WHERE id IN (1, 2, 3)
?u
- 集合
此占位符期望列-值数组并生成 SET 子句的代码。
$db->query('UPDATE products SET ?u', ['key' => 'foo', 'value' => 1]); // generated sql: UPDATE products SET `key` = 'foo', `value` = 1
?e
- 转义
值将被 mysqli 内部转义函数转义。
?p
- 部分
值将被原样插入。使用此占位符插入已准备好的 SQL 查询部分。
动态构建查询
如果您的查询依赖于某些条件,您可以使用 prepare
方法将所有占位符替换为传递的参数。此字符串可以安全地插入查询中。
$pricePart = ''; if ($price) { $pricePart = $db->prepare(' AND price < ?', $price); } $db->getAll('SELECT * FROM products WHERE category_id = ? ?p', $categoryId, $pricePart);
异常
EasyDb 将所有数据库错误转换为 \Silverslice\EasyDb\Exception
。使用 getQuery
方法获取导致错误的查询。
示例
try { $this->db->query("SELECTT 1"); } catch (Exception $e) { // get error code $code = $e->getCode(); // get query with error $query = $e->getQuery(); // get error message: code, error and query $message = $e->getMessage(); }
选择行
getOne
执行查询并从第一条结果行的第一个单元格中获取数据
参数
- string $query - SQL 查询
- mixed $param1 - 第一个占位符的参数
- mixed $param2 - 第二个占位符的参数
- ...
getOne($query, $param1, $param2...)
返回
- string|null
getAssoc
执行查询并将第一条结果行作为关联数组获取
getAssoc($query, $param1, $param2...)
返回
- array|null
getAll
执行查询并将所有结果行作为关联数组获取
getAll($query, $param1, $param2...)
返回
- array
getColumn
执行查询并将结果集中的单个列作为枚举数组获取
getColumn($query, $param1, $param2...)
返回
- array
getPairs
执行查询并将结果集中的键值对获取
getPairs($query, $param1, $param2...)
返回
- array
getAllKeyed
执行查询并将结果集中的键值对获取
getAllKeyed($query, $param1, $param2...)
返回
- array|bool
修改行
insert
将行插入到表中
insert($table, $params, $ignore = false)
参数
- string $table - 表名
- array $params - 列-值对
- bool $ignore - 使用或不使用 IGNORE 关键字
返回
- mixed - 插入的行 ID 或如果没有自增字段则为 true
update
更新表行
update($table, $params, $where = array())
参数
- string $table - 表名
- array $params - 列-值对
- array $where - UPDATE WHERE 子句。多个条件将使用 AND 关键字连接
返回
- int - 受影响的行数
insertUpdate
使用 INSERT... ON DUPLICATE KEY UPDATE 子句插入或更新表行
insertUpdate($table, $insert, $update = array())
参数
- string $table - 表名
- array $insert - 要插入的列值对
- array $update - 如果键已在表中存在,则更新的列值对
返回
- int - 受影响的行数:如果行被插入,则为 1;如果行被更新,则为 2
multiInsert
向表中插入多行
multiInsert($table, $fields, $data, $ignore = false)
参数
- string $table - 表名
- array $fields - 字段名
- array $data - 要插入的数据的二维数组
- bool $ignore - 使用或不使用 IGNORE 关键字
返回
- int - 受影响的行数
delete
删除表行
delete($table, $where = array())
参数
- string $table - 表名
- array $where - UPDATE WHERE 子句。多个条件将使用 AND 关键字连接
返回
- int - 受影响的行数
使用事务
beginTransaction
开始一个事务
beginTransaction()
commit
提交当前事务
commit()
rollback
回滚当前事务
rollback()
transaction
在事务中运行代码
transaction($process)
参数
- callable $process - 处理回调
返回
- bool - 如果事务成功提交,则为 true,否则为 false
抛出异常
- \Silverslice\EasyDb\Exception
示例
$this->db->transaction(function () { $this->db->query("INSERT INTO test (id, code, price) VALUES (3003, '1', 1)"); $this->db->query("INSERT INTO test (id, code, price) VALUES (3004, '1', 1)"); });
高级
表达式
在 SQL 查询中,列有时是表达式,而不是简单的表列名。您可以使用类型为 Expression 的对象将表达式插入到 SQL 中。
$this->db->insert('test', [ 'time' => new Expression('NOW()') ]); // or use expression alias $this->db->insert('test', [ 'time' => $this->db->expression('NOW()') ]);
多查询
使用 multiQuery
方法执行多个查询,这些查询由分号连接,例如从文件中加载 SQL 转储。
multiQuery
执行一个或多个由分号连接的查询
multiQuery($queries)
参数
- string $queries
返回
- bool
抛出异常
- \Silverslice\EasyDb\Exception
示例
$this->db->multiQuery(" DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `code` char(15) NOT NULL, `name` varchar(200) NOT NULL, `price` decimal(10,2) unsigned DEFAULT NULL, `order` int(11) unsigned DEFAULT 0, PRIMARY KEY (`id`), KEY `code` (`code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO test (id, code, name, price) VALUES (1, '001', 'Cup', 20.00), (2, '002', 'Plate', 30.50) ");