而不是硬编码像Select * from users where user_id =220202
这样的sql查询,这些查询可以像Select * from $users where $user_id = $input.
我问的原因是,当表/列名称需要更改时,我可以在一个地方更新它,而不必要求开发人员逐行查找所有更新的引用。这非常耗时。我不喜欢在代码中公开数据库内容的想法。
我主要担心的是加载时间。与动态页面一样,数据库必须获取页面内容,如果查询是动态的,首先系统必须查找引用然后执行查询,那么它是否会影响加载时间?
我正在使用codeignitor PHP。
如果可能,那么下一个问题是存储所有引用的位置?在应用程序中,在文件中,在数据库中,以及如何?
---编辑:
更好:SQL查询本身可以变为动态吗?我可以只引用$ sqlA而不是整个查询?这样,如果我必须重新编写查询,我可以更新1个文件。
答案 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数据库连接代码放在同一个文件中。