lq80 / db
PHP中的简单查询构建类
Requires
- php: ^5.3.3 || ^7.0
This package is not auto-updated.
Last update: 2024-09-29 05:33:48 UTC
README
MareiDB类是PHP中的一个简单查询构建类,旨在提高您的生产力。您无法想象,如果您使用这个类,可以节省多少时间!
特性
- 完全安全:此数据库类使用PDO预处理语句提供高级别的SQL注入攻击防护。
- 易于使用:语法非常简单,有多种方式进行相同的查询,因此您可以按照自己的喜好使用。
- 文档齐全:有关此类的所有信息都在这里,并且组织得非常好,因此您可以轻松找到。
用法
从这里下载类,将其保存到您的根目录中,然后打开它以调整数据库连接的基本配置,如主机、数据库名、数据库用户名和数据库密码。您还可以轻松地将当前开发环境定义为开发或生产。
//current development environment "env" => "development", //Localhost "development" => [ "host" => "localhost", "database" => "test", "username" => "root", "password" => "" ], //Server "production" => [ "host" => "", "database" => "", "username" => "", "password" => "" ]
要使用该类,只需将其包含到项目文件中,如下所示
include 'DB.php';
然后,您必须像这样实例化类
$db = DB::getInstance();
现在,$db对象是DB类的新实例,我们将使用此对象来处理数据库,您可以创建尽可能多的对象(无需担心连接,因为我在使用单例设计模式,因此每次您创建新对象时,它都返回相同的连接)。
向表中插入值
使用insert()方法向表中插入值,它接受两个参数:第一个参数是$table_name,第二个参数是一个关联数组$fields[],因此该数组的键是表中的列名,该数组的值是要插入该列的值。
$db->insert('mytable', [ 'first_name' => 'Marei', 'last_name' => 'Morsy', 'age' => 22 ]);
要查看已执行的SQL查询,请使用此方式使用getSQL()方法
echo $db->getSQL();
输出
INSERT INTO `mytable` (`first_name`, `last_name`, `age`) VALUES (?, ?, ?)
获取最后插入的ID
您可以使用lastId()方法获取最后插入的ID,或者您可以像这样获取insert()方法的返回值
$lastID = $db->insert('mytable', [ 'first_name' => 'Marei', 'last_name' => 'Morsy', 'age' => 22 ]); echo $lastID;
这里是如何在执行update()方法后使用lastId()
echo $db->lastId();
更新表值
要更新表,请使用update()方法,它包含3个参数:第一个参数是表名,第二个参数是要更新的表值的关联数组,第三个参数是可选的,您可以使用它来指定更新条件,例如SQL中的WHERE子句。DB类提供了多种执行相同查询的方式,例如:update()方法的第三个参数,您可以执行以下操作之一:####传递id您可以将$id作为第三个参数传递,DB类将理解表中有一个名为id的字段,您想更新其ID值为该值的记录,如下所示
$db->update('mytable', [ 'first_name' => 'Mohammed', 'last_name' => 'Gharib', 'age' => 24 ],1);
SQL查询
UPDATE `mytable` SET `first_name` = ?, `last_name` = ?, `age` = ? WHERE `mytable`.`id` = ?
但是,如果列名不是id怎么办?####传递列名和值您可以将包含两个项目的数组传递给update方法作为第三个参数:数组中的第一个项目是列名,第二个项目是列值。DB类的update()方法将理解您想更新列名等于该值的表。如下所示
$db->update('mytable', [ 'first_name' => 'Ahmed', 'last_name' => 'Hendy', 'age' => 23 ],['id',1]);
SQL查询
UPDATE `mytable` SET `first_name` = ?, `last_name` = ?, `age` = ? WHERE `mytable`.`id` = ?
您可以将包含三个元素的数组作为update()方法的第三个参数传递。数组中的第一个元素是列名(字符串),第二个元素是运算符(字符串),第三个元素是值,例如:
$db->update('mytable', [ 'first_name' => 'Zizo', 'last_name' => 'Atia', 'age' => 23 ],['age','>',22]);
SQL查询
UPDATE `mytable` SET `first_name` = ?, `last_name` = ?, `age` = ? WHERE `mytable`.`age` > ?
您也可以用数组中的两个元素执行相同的查询,如下所示:
$db->update('mytable', [ 'first_name' => 'Ahmed', 'last_name' => 'Mansour', 'age' => 27 ],['age >= ',22]);
SQL查询
UPDATE `mytable` SET `first_name` = ?, `last_name` = ?, `age` = ? WHERE age >= ?
您可以将包含数组的数组(嵌套数组)作为update()方法的第三个参数传递,每个数组包含三个元素:列名(字符串)、运算符和值。第二个和第三个元素是可选的,因此您可以只传递id作为数组,或者您也可以传递包含两个元素的数组:列名和值。以下是一些传递数组的示例:
示例 1
$db->update('mytable', [ 'first_name' => 'Omar', 'last_name' => 'Saqr', 'age' => 23 ],[ [1] ]);
SQL查询
UPDATE `mytable` SET `first_name` = ?, `last_name` = ?, `age` = ? WHERE `mytable`.`id` = ?
示例 2
$db->update('mytable', [ 'first_name' => 'Ahmed', 'last_name' => 'Helmy', 'age' => 21 ],[ ['age',18], [1] ]);
SQL查询
UPDATE `mytable` SET `first_name` = ?, `last_name` = ?, `age` = ? WHERE `mytable`.`age` = ? AND `mytable`.`id` = ?
示例 3
$db->update('mytable', [ 'first_name' => 'Ahmed', 'last_name' => 'Ashraf', 'age' => 21 ],[ ['age','>=', 18], [1] ]);
SQL查询
UPDATE `mytable` SET `first_name` = ?, `last_name` = ?, `age` = ? WHERE `mytable`.`age` >= ? AND `mytable`.`id` = ?
或者您可以这样做[ ['age >= ', 18], [1] ]以获取相同的结果。
另一种使用where()方法更新数据的方式
where()方法包含三个参数,其中第二个和第三个参数是可选的。如果您只传递了一个参数,那么where()方法会理解有一个名为id的字段,并且您想要更新表,其中id等于该参数,如下所示:
$db->update('mytable', [ 'first_name' => 'Ashraf', 'last_name' => 'Hefny', 'age' => 28 ])->where(1)->exec();
SQL查询
UPDATE `mytable` SET `first_name` = ?, `last_name` = ?, `age` = ? WHERE `mytable`.`id` = ?
我们使用exec()方法执行查询,这意味着您可以在执行之前使用getSQL()方法检查查询,而不使用exec()。您可以使用多个where()方法,就像这样:
$db->update('mytable', [ 'first_name' => 'Osama', 'last_name' => 'El-Zero', 'age' => 30 ])->where(1)->where('first_name','Ashraf')->exec();
SQL查询
UPDATE `mytable` SET `first_name` = ?, `last_name` = ?, `age` = ? WHERE `mytable`.`id` = ? AND `mytable`.`first_name` = ?
如您所见,如果您向where方法提供2个参数,它将理解您想要更新表,其中列名是第一个参数,且其值等于第二个参数的值。并且如果您注意到第二个where在查询中变成了'AND'。
$db->update('mytable', [ 'first_name' => 'Ali', 'last_name' => 'Hamdy', 'age' => 30 ])->where(1)->where('age','>',20)->exec();
SQL查询
UPDATE `mytable` SET `first_name` = ?, `last_name` = ?, `age` = ? WHERE `mytable`.`id` = ? AND `mytable`.`age` > ?
现在,如果我们想在WHERE子句中添加OR怎么办?###如何使用orWhere()方法?orWhere()与where()方法作用相同,它接受相同的参数,它就像是SQL中的'OR',您可以将这两种方法一起使用,如下所示:
$db->update('mytable', [ 'first_name' => 'Muhammad', 'last_name' => 'Mustafa', 'age' => 21 ])->where('age','<=',20)->orWhere(1)->exec();
SQL查询
UPDATE `mytable` SET `first_name` = ?, `last_name` = ?, `age` = ? WHERE `mytable`.`age` <= ? OR `mytable`.`id` = ?
您还可以将WHERE子句的数组传递给where()或orWhere()方法,如下所示:
->where([ ['first_name', 'Marei'], ['age >=', 18], [1] ])->exec();
SQL将如下所示:
WHERE `first_name` = ? AND age >= ? AND id = ?
您还可以使用where()和orWhere()方法的单个子句或一组WHERE子句。
->where([ ['first_name', 'Marei'], ['age >=', 18]])->where(1)->orWhere([ [5], ['last_name', 'Morsy'] ])->exec();
SQL将如下所示:
WHERE `first_name` = ? AND age >= ? AND `id` = ? OR `id` = ? Or `last_name` = ?
要删除表中的行,请使用delete()方法,它包含2个参数,第一个是表名,第二个是可选的,它的工作方式与update()方法中的第三个参数相同,因此您可以只传递整数id作为参数,您也可以传递包含字段名和值的数组,或者传递包含字段名、参数和值的数组,或者传递包含WHERE子句的数组的数组。以下是如何使用delete()方法的示例:
$db->delete('mytable',1);
SQL查询
DELETE FROM `mytable` WHERE `mytable`.`id` = ?
####示例 1
$db->delete('mytable', ['first_name', 'Marei']);
SQL查询
DELETE FROM `mytable` WHERE `mytable`.`first_name` = ?
####示例 2
$db->delete('mytable', ['age', '<', 18]);
SQL查询
DELETE FROM `mytable` WHERE `mytable`.`age` < ?
####示例 3
$db->delete('mytable', [ ['age', '<', 18], [1] ]);
SQL查询
DELETE FROM `mytable` WHERE `mytable`.`age` < ? AND `mytable`.`id` = ?
####使用where()与Delete():您可以像这样使用where()和orWhere()与delete():
$db->delete('mytable')->where(1)->exec();
SQL查询
DELETE FROM `mytable` WHERE `mytable`.`id` = ?
要删除表中的所有行
$db->delete('mytable')->exec();
SQL查询
DELETE FROM `mytable`
###选择使用get()方法从表中检索数据,但您必须首先使用table()方法定义表,它只接受一个参数:表名,如下所示:
$rows = $db->table('mytable')->get();
SQL查询
SELECT * FROM `mytable`
它返回一个名为“MareiCollection”的集合,你可以将其视为对象的数组,每个对象代表表格中的一行,因此你可以使用 foreach 循环遍历 $rows 数组并单独获取每一行,如下所示
foreach ($rows as $row) { echo "$row->first_name <br>"; }
输出
Marei - Morsy
Mohammed - Gharib
Ahmed - Hendy
你可以在“MareiCollection”上应用方法,如 first()、last()、toArray()、toJSON()、item() 和 toList(),如下所示
$users = $db->table("users")->get()->toArray();
以数组形式获取用户
$users = $db->table("users")->get()->toJSON(); echo $users;
以JSON格式获取用户,如果你只是输出结果,Marei DB类足够智能,能理解你想要返回JSON,因此你可以一行代码得到相同的结果,如下所示
echo $db->table("users")->get();
以JSON格式打印用户表
echo $db->table("users")->get()->first();
以JSON格式打印用户表的第一行
echo $db->table("users")->get()->last();
以JSON格式打印用户表的最后一行
echo $db->table("users")->get()->first()->first_name;
要打印第一行第一用户的姓名,你也可以这样做
$first_user = $db->table("users")->get()->first(); echo $first_user->first_name;
或者你可以这样做
$first_user = $db->table("users")->get()->first()->toArray(); echo $first_user['first_name'];
如果你想从 MareiCollection 中获取特定行,使用 item() 方法并传递项目键,如下所示
echo $db->table("users")->get()->item(0);
以JSON格式打印用户表的第一行
如果你想获取 MareiCollection 的特定列,例如如果你想要Firebase用户的令牌作为数组,使用 toList() 方法并传递列名,如下所示
print_r( $db->table("users")->get()->toList('token') );
以数组形式打印用户表中的所有令牌
Qget() 方法
Qget() 方法与 get 方法的工作方式完全相同,但没有所有 MareiCollecton 功能,例如将结果打印为JSON和其他方法如 toArray()、toJSON()、first()、last() 和 item()。如果你真的关心性能,那么你需要使用 Qget()。你可以像这样使用它
$users = $db->table("users")->Qget(); foreach ($users as $user) { echo $user->first_name; }
要打印 Qget() 的结果为JSON,只需使用 json_encode($Qget_result);,如下所示
$users = $db->table("users")->Qget(); echo json_encode($users);
select() 方法
如果你想选择特定的列,使用 select() 方法,它以字符串参数的形式持有列名,列名之间用 , 分隔,如下所示
$rows = $db->table('mytable')->select('first_name, last_name')->get();
SQL查询
SELECT `first_name`, `last_name` FROM `mytable`
limit() 方法
limit() 方法使得编写多页结果或分页变得简单,这在大型表中非常有用。返回大量记录可能会影响性能。它接受两个参数,第一个参数用于指定要返回的记录数。第二个参数是可选的,用于传递偏移量。你可以像这样使用它
$rows = $db->table('mytable')->limit(10)->get();
SQL查询
SELECT * FROM `mytable` LIMIT 10
它将返回前10条记录。
$rows = $db->table('mytable')->limit(10, 20)->get();
SQL查询
SELECT * FROM `mytable` LIMIT 10 OFFSET 20
它将只返回10条记录,从第21条记录(OFFSET 20)开始。
使用 paginate() 方法实现简单分页
现在在使用 paginate() 方法后,分页从未如此简单!你可以使用 paginate() 方法与所有选择方法(如 table() 和 select())一起使用,而不是使用 get(),它接受两个参数:第一个参数是页码,从1开始的整数;第二个参数用于指定要返回的记录数(paginate($page, $limit)),你可以像使用 get() 方法一样使用它,以下是如何使用它的示例
$rows = $db->table('mytable')->paginate(2, 5);
这意味着我们只想从第二页返回5条记录,它将只返回5条记录,从第6条记录开始到第10条记录。要了解幕后发生了什么,使用 PaginationInfo() 方法获取更多信息,如下所示
print_r( $db->paginationInfo() );
输出
Array
(
[previousPage] => 1
[currentPage] => 2
[nextPage] => 3
[lastPage] => 5
)
它将返回一个关联数组,包含你可能需要了解的有用信息,如当前页、上一页、下一页和最后一页。如果没有上一页或下一页,其值将是null。
Qpaginate() 方法
Qpaginate() 方法与 paginate() 方法完全相同,但没有所有 MareiCollecton 功能,例如将结果打印为JSON和其他方法如 toArray()、toJSON()、first()、last() 和 item()。如果你真的关心性能,那么你需要使用 Qget()。你可以像这样使用它
$rows = $db->table('mytable')->paginate(2, 5);
####使用 where() 和 orWhere() 进行选择:您可以使用 where() 或 orWhere() 方法进行选择,如下所示
$rows = $db->table('mytable')->where(1)->get();
SQL查询
SELECT * FROM `mytable` WHERE `mytable`.`id` = ?
####对结果集进行排序,可以使用 orderBy() 方法按列名对结果集进行排序,orderBy($column_name, $order) 接收两个参数,第一个参数是作为字符串的列名,第二个参数是可选的,它只接受两个值:ASC(默认值,按升序对结果集进行排序),或 DESC(按降序对结果集进行排序),如下所示
$rows = $db->table('mytable')->orderBy('id', 'DESC')->get();
按降序对结果集按 id 排序。您可以将多个 orderBy() 方法一起使用,如下所示
$rows = $db->table('mytable') ->orderBy('id', 'DESC') ->orderBy('age', 'ASC') ->get();
当然,当您使用 orderBy() 与 get() 结合时,您还可以将其与 paginate()、limit()、Qget() 和 Qpaginate() 方法一起使用。####计算选择的行数使用 getCount() 方法获取最后一个查询返回的总行数。您可以在选择之后使用它,如下所示
echo $db->getCount();
###使用原始查询:我敢打赌您想知道如果我想执行更复杂的查询怎么办?这就是为什么我创建了 query() 方法,它包含三个参数,第一个参数是作为字符串的 SQL 查询,第二个参数是可选的,用于传递给查询的值数组。以下是使用 query() 方法的示例
$sql = "SELECT * FROM mytable WHERE id = ?"; $rows = $db->query($sql, [1]);
SQL查询
SELECT * FROM mytable WHERE id = 1
如果您想要移除所有 MareiCollection 功能,只需将 true 作为第三个参数传递,如下所示
$sql = "SELECT * FROM mytable WHERE id = ?"; $rows = $db->query($sql, [1], true);