lq80/db

此包的最新版本(dev-master)没有可用的许可证信息。

PHP中的简单查询构建类

维护者

详细信息

github.com/LQ80/DB

源代码

dev-master 2018-09-13 17:55 UTC

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);