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()
。
另见
我正在使用 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()
。
另见