问题描述
|
我使用kohana,并且我使用此模型使用PDO从数据库检索搜索结果:
class Model_Crud extends Model_Database {
private $tables=array(\'articles\',\'comments\',\'pages\');
public function get_search_results()
{
$query = DB::query(Database::SELECT,\'SELECT * FROM :table WHERE ( title LIKE :search OR body LIKE :search OR tag LIKE :search)\');
$query->param(\':search\',$_POST[\'search\'] );
$query->bind(\':table\',$table );
foreach($this->tables as $table)
{
//echo $query;
$result[] = $query->execute();
}
return $result;
}
}
这将无法正常工作,因为sql语句的最终形式如下:
SELECT * FROM \'articles\' WHERE ( title LIKE \'a random string\' OR body LIKE \'a random string\' OR tag LIKE \'a random string\')
而且自然会失败,因为商品应在ѭ2之内
这样可以做吗?
还是我需要写3个不同的查询,每个表一个?
解决方法
看一下Database_Query类,似乎无需为每个表创建单独的查询就可以完成您要执行的操作。
您可以使用转换为
:table
的set_table
方法扩展Database_Query类。
更好的是,您可以稍微抽象一下概念,并添加新的方法来翻译不需要清理的参数。看一下Database_Query :: compile可以了解它是如何完成的。 (一点也不难。)
, 是的,只需将表名直接放入字符串中即可,而不是作为参数:
class Model_Crud extends Model_Database {
private $tables=array(\'articles\',\'comments\',\'pages\');
public function get_search_results()
{
foreach($this->tables as $table)
{
$query = DB::query(Database::SELECT,\'SELECT * FROM \' . $table . \' WHERE ( title LIKE :search OR body LIKE :search OR tag LIKE :search)\');
$query->param(\':search\',$_POST[\'search\'] );
//echo $query;
$result[] = $query->execute();
}
return $result;
}
}
通常由于SQL注入,这不是一个好主意,但是由于表列表已编码到您的程序中,因此在这种情况下,您不必担心。