没有数据库连接的 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 查询生成器的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有连接的情况下为 postgres (Redshift) 生成 SQL 查询?

php使用mysql怎么查询数据库已经有多少条数据

mysql只能取出一条记录为啥不显示

PHP如何将SQL查询结果转为多维数组,并按查询行输出

php -> sql 缺少前导零

powerdesigner 生成sql脚本