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と単語を読み取る方法はありますか?
アップデート
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行が影響を受けました。
ありがとう!