gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:44:59 25 4
gpt4 key购买 nike

我正在使用 CakePHP 并尝试检索 FOUND_ROWS() 以获取在循环中运行多次的查询(每次都使用不同的 WHERE 部分)。最奇怪的事情正在发生:它为第一个查询返回正确的结果 - 然后为后续查询返回相同的精确结果。

这是代码:

$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' 来追踪发生的情况,并且看起来第一个查询确实运行了多次在循环中,但查询 selectfound_rows() 仅运行一次!

我还尝试运行select SQL_NO_CACHEfound_rows(),但这没有帮助。

有人遇到过这种情况吗?

最佳答案

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

query('sql', false)

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

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

另请参阅

关于php - CakePHP/mysql : select found_rows can't run in a loop?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44759242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com