CakePHP/mysql: select found_rows 不能 运行 循环吗?

CakePHP/mysql: select found_rows can't run in a loop?

我正在使用 CakePHP 并尝试检索 FOUND_ROWS() 用于在循环中多次 运行s 的查询(每次使用不同的 WHERE 部分)。最奇怪的事情发生了:returns 第一个查询的正确结果 - 然后是后续查询的相同结果。

这是代码:

$article = new Article();
    $query = $db->buildStatement(
        array(
        'table' => $db->fullTableName($article)
        , 'alias' => 'Article'
        , 'order' => '`Article`.`publish_date` desc'
        , 'offset' => $startIndex
        , 'joins' => array(
                        array(
                            'table' => 'articles_categories',
                            'alias' => 'ArticlesCategories',
                            'type' => 'inner',
                            'conditions' => array(
                                'ArticlesCategories.article_id = Article.id',
                            ),
                        )
                        )
        , 'limit' => $this->maxNumArticlesToLoadPerPage
        , 'conditions' => "ArticlesCategories.category_id = $categoryId and publish_date <= now()"
        , 'fields' => array('Article.id', 'Article.name', 'Article.search_engine_teaser', 'Article.image_file_name', 'Article.content_modified', 'ArticlesCategories.category_id')),
    $article
    );

    $query = str_replace('SELECT', 'SELECT SQL_CALC_FOUND_ROWS', $query);
    $articles = $article->query($query);

    // also return how many total articles are in this category
    $numArticlesInCategory = $article->query('select found_rows()')[0][0]['found_rows()'];

现在,真正好奇的是我在 mysql 数据库中使用 ET GLOBAL general_log = 'ON' 来追踪发生了什么,看来第一个查询确实是 运行 几个循环中的次数,但查询 select found_rows() 仅 运行 一次!

我也试过 运行 select SQL_NO_CACHE found_rows(),但没有用。

有人遇到过吗?

检查您的模型 $cacheQueries 属性 设置,它可能是 true,导致查询缓存在 CakePHP 端。使用第二个 query() 参数禁用每个查询的缓存:

query('sql', false)

顺便说一句,ArticlesCategories.category_id = $categoryId 看起来像是一个可能的 SQL 注入漏洞,您永远不应该以这种方式在查询中插入数据,始终 使用 key => value 条件语法,或使用准备好的语句!

此外,不应直接实例化模型 类,而应使用 ClassRegistry::init()

另见