没有数据库连接的 PHP SQL 查询生成器
Posted
技术标签:
【中文标题】没有数据库连接的 PHP SQL 查询生成器【英文标题】:PHP SQL query Builder without DB connection 【发布时间】:2016-09-08 14:51:17 【问题描述】:我有一个旧项目以这种愚蠢的方式获取数据:
$db = new Database($server, $name, $pass);
$where = 'country = "UK"';
if ($_GET['gender']) $where .= ' AND gender = "' . $_GET['gender'] . '"';
$sql = "SELECT * FROM users WHERE $where ORDER BY name";
$users = $db->fetchAll($sql);
我想使用 SQL 构建器来改进它(在其他项目中我使用 Zend 的 DB 表),但问题是,我需要保留 Database
类,因为它的 fetch*()
方法不仅仅是加载数据(例如调试、性能、统计等)。
我查看了Zend_Db_Table
和this post,但所有这些查询构建器都使用自己的fetch()
或execute()
方法附加到数据库连接器。但我需要一个只创建可在现有方法中使用的 SQL 查询的构建器:
$query = new mysqlQuery();
$query
->select('*')
->from('users')
->orderBy('name')
->where('country', 'UK');
if ($_GET['gender'])
$query->where('gender', $_GET['gender']);
$sql = $query->toString();
$db = new Database($server, $name, $pass);
$users = $db->fetchAll($sql);
我想简单地窃取 Zend 类并重写它们,这样它们就不需要数据库连接,但我想看看这些是否已经完成。
【问题讨论】:
你的Database
类不能继承 Zend_Db_Table 类,覆盖 fetchAll
的方法,但仍然让它调用父 fetch
(在这种情况下,Zend_Db_Table::fetch
)来检索数据? NB - 我不使用 ZendFrameworks,所以这纯粹是猜测。猜测工作,以及“手指在空中”的运气
@DaveyBoy 不幸的是,该项目的某些部分是非 OOP(SQL 查询),而其他部分则过于 OOP,因此 Database
的继承树是 Database
BaseDatabase BaseDb AbstractDb BaseObject AbstractObject 并且很难从其他东西继承。所以Database
必须保持原样,因为我没有时间完全重写它。
【参考方案1】:
我创建了修改后的Zend_Db_Select
,它不需要主动连接到数据库。
require_once 'Zend/Db/Query/Mysql.php';
$query = new Zend_Db_Query_Mysql();
$query
->from(array('a' => 'articles'))
->columns(array('id', 'text' => 'content_text'))
->joinLeft('authors',
$query->column('author', 'articles', new Zend_Db_Expr('authors.id'))
)
->where($query->column('archived', 'articles', 0))
->order(new Zend_Db_Expr($query->column('release_time', 'articles') . ' DESC'))
;
$sql = $query->assemble();
作为奖励,我添加了 column()
方法,可将列名和表名转换为其别名。
以Zend extension 或standalone library 的形式提供。
【讨论】:
【参考方案2】:这个项目似乎是你想要的:
https://github.com/nilportugues/php-sql-query-builder
唯一的遗憾是它需要 PHP 5.4 或更高版本。我面临同样的问题,除此之外,我的 PHP 需要为 5.3,这是我不使用它的唯一原因。
【讨论】:
以上是关于没有数据库连接的 PHP SQL 查询生成器的主要内容,如果未能解决你的问题,请参考以下文章