如何解决使用foreach动态表选择
| 我使用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注入,这不是一个好主意,但是由于表列表已编码到您的程序中,因此在这种情况下,您不必担心。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。