我有一个非常简单的应用程序,有 1 个表,每行包含一个单词、它的定义和一个示例。
定义和示例字段是 varchars(5000)。
在每一页上,我都有一个显示单词列表的侧边栏。经过一定数量的单词后,我开始收到以下错误:
Error: Allowed memory size of 33554432 bytes exhausted
控制器中设置元素中使用的变量的代码:
$this->set('allWords', $this->Word->find('all', array('order' => array('Word.text ASC'))));
我怀疑 find 方法读取了所有行数据,包括定义和示例,我现在真的不需要,这会导致错误。
有没有办法只读取 id 和 word,而不是每行的定义和示例值?
更新
在我的 Element 中,我循环遍历 $allWords 数组以打印出每个单词以及一个链接:
echo '<h3>Words ('.count($allWords).')</h3>';
echo $this->Html->link('Add new', array('controller' => 'words', 'action' => 'add'));
echo '<br/><br/>';
foreach($allWords as $thisWord)
{
echo $this->Html->link($thisWord['Word']['text'], array('controller' => 'words', 'action' => 'edit', $thisWord['Word']['id']));
if( ($thisWord['Word']['example'] == '') || ($thisWord['Word']['definition'] == '') )
{
echo ' ' . $this->Html->image('warning.png');
}
echo '<br \>';
}
看来,如果我注释掉 foreach 循环的内部部分,我不会收到内存错误。
本例中的 SQL 输出为:
SELECT `Word`.`id` FROM `idioms`.`words` AS `Word` WHERE 1 = 1 ORDER BY `Word`.`text` ASC`
受影响的行数为 339 行。
谢谢!