使用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注入,这不是一个好主意,但是由于表列表已编码到您的程序中,因此在这种情况下,您不必担心。