代码中的动态SQL查询可能吗?

时间:2011-01-16 05:47:17

标签: php sql codeigniter

而不是硬编码像Select * from users where user_id =220202这样的sql查询,这些查询可以像Select * from $users where $user_id = $input.

一样动态化

我问的原因是,当表/列名称需要更改时,我可以在一个地方更新它,而不必要求开发人员逐行查找所有更新的引用。这非常耗时。我不喜欢在代码中公开数据库内容的想法。

我主要担心的是加载时间。与动态页面一样,数据库必须获取页面内容,如果查询是动态的,首先系统必须查找引用然后执行查询,那么它是否会影响加载时间?

我正在使用codeignitor PHP。

如果可能,那么下一个问题是存储所有引用的位置?在应用程序中,在文件中,在数据库中,以及如何?

---编辑:
更好:SQL查询本身可以变为动态吗?我可以只引用$ sqlA而不是整个查询?这样,如果我必须重新编写查询,我可以更新1个文件。

4 个答案:

答案 0 :(得分:2)

因为您使用的是 Codeigniter ,所以我建议您使用Active Record Class来完成您的目标。

活动记录类使您​​能够以步骤动态构建查询,从而允许您在逻辑上构建它们。所以使用活动记录来举例...

这可以用更少的代码完成,我只是想说明Active Record

$this->db->select('*');

$this->db->from($table);

$this->db->where($user_id, $input);

所以为了表明我在逻辑上构建查询的意思,你可以在查询构建过程中构建你想要的任何逻辑。假设您想要限制获得的结果数量,则可以设置$ limit变量。但如果未设置(或NULL),则不想设置限制条款。

if ( $isset($limit) ) {
    $this->db->limit($limit);
}

现在执行你的查询已经构建了

$query = $this->db->get();

然后只需使用database class处理$query,就像处理任何其他CodeIgniter查询对象一样。

答案 1 :(得分:1)

当然,你可以,如果那是你想要的。我宁愿建议您花更多的时间来设计数据库,但从长远来看,架构的变化是不可避免的。

我认为加载时间不会成为问题,因为这个应用程序的瓶颈通常在数据库中。

最后我建议只需将列名称声明为php变量

即可将其保存在文件中

答案 2 :(得分:0)

这取决于您使用的数据库驱动程序。旧的PHP数据库驱动程序不支持占位符(PHP 3.x)。现代(PDO)的那些。您使用问号编写SQL:

SELECT * FROM Users WHERE User_ID = ?

然后在执行查询时提供用户ID的值。

但是,您不能像这样提供列名 - 仅限值。但您可以从字符串中准备语句,例如:

SELECT * FROM Users WHERE $user_id = ?

然后在执行时提供值。

答案 3 :(得分:0)

mysql_query()接受一个字符串,它不需要是一个常量字符串,它可以是一个变量。

$SQL = "SELECT foo FROM bar b";
SQLSet = mysql_query($SQL);

你可以看到,你可以使用普通的字符串操作来构建整个SQL查询。

$SQL="SELECT * FROM MyTable";
$BuzID = 5;
$Filter = "Buz=".$BuzID;
if (is_numeric($BuzID)) SQL .= " WHERE ".$Filter;
SQLSet = mysql_query($SQL);

如果"SELECT * FROM MyTable WHERE Buz=5"设置为任意数字,则会扩展为$BuzID。 如果不是,该陈述将只是"SELECT * FROM MyTable"

如您所见,您可以动态构建非常复杂的SQL语句,而无需SQL服务器中的变量支持。

如果你想要数据库名称,用户登录等常量,你可以将它们放在公共目录之外的单独包含中。

SecretStuff.inc.php
$__DatabaseName = "localhost";
$__UserName = "DatabaseAccess";
$__Password = "E19A4F72B4AA091C6D2";

或者将整个PHP数据库连接代码放在同一个文件中。