jaypha / mysqli-ext
mysqli 的便利扩展
Requires
- php: ^5.0 || ^7.0
Requires (Dev)
- phpunit/phpunit: ^6
README
由 Jason den Dulk 编写
包含扩展 mysqli 类功能的便利函数的特质。这些函数反映了非常常见的数据库相关任务,并有助于减少代码冗余。
要求
PHP v5 或更高版本。
安装
composer require jaypha/mysqli-ext
MySqliExt
作为特质
必须添加到 mysqli 的子类中。
use MySQLiExtTrait;
作为类
$conn = new Jaypha\MySQLiExt($host, $user, $password = NULL, $database = NULL)
API
q($query)
与 mysqli::query 相同,但在出错时抛出异常。
mq($query)
与 mysqli::multi_query 相同,但在出错时抛出异常。
queryValue($query)
调用 q 并返回单个值。第一行的第一个值。
如果找到值且不为空,则返回字符串,如果值为空,则返回 NULL,如果没有找到行,则返回 false。
$n = $db->queryValue("select name from sometable where id='2'");
echo "name is $n";
queryRow($query, $resultType = MYSQLI_ASSOC)
调用 q 并返回第一行。
如果找到行,则返回数组。如果结果类型为 MYSQLI_ASSOC,则它将是关联数组。如果没有找到行,则返回 false。
$row = $db->queryRow("select * from sometable where id='2'");
print_r($row);
queryData($query, $keyField = NULL, $resultType = MYSQLI_ASSOC)
调用 q 并返回整个数据集。如果设置了 $keyField,则使用此列的值作为数组键。
返回行数组。每行都是一个数组。如果结果类型为 MYSQLI_ASSOC,则它将是关联数组。
如果没有找到行,则返回空数组。
$data = $db->queryData("select * from sometable");
foreach ($data as $row) { ... }
如果键重复,则将覆盖任何现有值。
queryChunkedData($query, $limit = 1000, $resultType = MYSQLI_ASSOC)
返回 MySQLiChunkedResult 实例。
queryColumn($query)
调用 q 并返回单个列。如果 SQL 查询选择一个字段,则 queryColumn 返回包含值的数组。如果查询选择两个或更多字段,则返回一个关联数组,其中第一列的内容作为键,第二列的内容作为值。
如果没有找到行,则返回空数组。
如果键重复,则将覆盖任何现有值。
$column = $db->queryColumn("select name from sometable");
print_r($column);
$assoc = $db->queryColumn("select id,name from sometable");
print_r($assoc);
insert($tableName, $columns, $values = NULL)
插入语句的快捷方式。有三种情况
- 如果
$values为 NULL,则假定$columns是关联数组,并使用键/值对将其插入到数据库中。 - 如果
$columns是数组且$values是数组,则使用$columns和$values插入单行。 - 如果
$columns是数组且$values是数组的数组,则插入多行。$values数组中的每个元素被视为一行。
返回插入 ID 值。
// insert into sometable set id=1, name='john'
$id = $db->insert("sometable", [ "id" => 1, "name" => "john" ]);
echo "new row ID is $id";
// insert into sometable (id,name) values (1,'john')"
$db->insert("sometable", [ "id", "name"], [1, "john"]);
// insert into sometable (id,name) values (1,'john'), (2,'jane')
$db->insert("sometable", [ "id", "name"], [[1, "john"], [2, "jane"]]);
update($tableName, $values, $wheres)
更新语句的快捷方式。
// update into sometable set name='john' where id=1
$db->update("sometable", [ "name" => "john" ], [ "id" => 1 ]);
replace($tableName, $values)
替换语句的快捷方式。
// replace sometable set name='john', id=1
$db->replace("sometable", [ "name" => "john", "id" => 1 ]);
insertUpdate($tableName, $values, $wheres)
将插入或更新。如果存在匹配给定 $wheres 的行,则将其更新为新 $values。否则,使用 $values 和 $wheres 的组合插入新行。
在不希望删除现有行的情况下,请使用此代替替换。
// update into sometable set name='john' where id=1 (if exists)
// insert into sometable set name='john', id=1 (if not exists)
$db->insertUpdate("sometable", [ "name" => "john" ], [ "id" => 1 ]);
delete($tableName, $wheres = null)
删除的快捷方式。如果 $where 是整数,则将其与 id 列匹配。
如果 $wheres 为 NULL,则将截断表。
// delete from sometable where name='john'
$db->delete("sometable", [ "name" => "john" ]);
// delete from sometable where id=1
$db->delete("sometable", 1);
get($tableName, int $id)
选择列 'id' 值为 $id 的行。必须存在名为 'id' 的列。
$row = $db->get("sometable", id);
assert(is_array($row));
set($tableName, $values, int $id = 0)
更新列 'id' 值为 id 的表行。如果没有提供 id(即零值),则执行插入操作。必须存在名为 'id' 的列。
返回行的 id。
$db->set("sometable", [ "name" => "john" ], 1);
$id = $db->set("sometable", [ "name" => "jane" ]);
MySQLiChunkedResult
如果在任何情况下都不能有一个打开的查询,但又不能将整个查询结果加载到内存中,那么这个类可以作为折中方案。结果存储在临时表中,然后作为单独的查询分块读取。实现了 Iterator,因此可以与 foreach 一起使用。
使用方法
$mysql = new MySQLiExt(...);
$result = new MySQLiChunkedResult($mysql, $query, $limit);
foreach ($result as $row) { ... }
$mysql = new MySQLiExt(...);
$result = $mysql->queryChunkedData($query, $limit);
foreach ($result as $row) { ... }
许可
版权(C)2017 Jaypha。
在 Boost 软件许可证下分发,版本 1.0。
请参阅 https://boost.ac.cn/LICENSE_1_0.txt