微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用foreach动态表选择

如何解决使用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 举报,一经查实,本站将立刻删除。