Ding ding ding!
Při připojování k MySQL PHP rád používá bufferované dotazy . To platí bez ohledu na to, jakou metodu připojení používáte. Při použití dotazů s vyrovnávací pamětí je celá sada výsledků načtena okamžitě namísto toho, aby byla načtena, když se zeptáte. Toto je obvykle dobré pro výkon, protože je méně zpátečních cest.
Ale jako všechno v PHP, i tady to má svůj háček. Jak je uvedeno na stránce ukládání do vyrovnávací paměti:
Používáte PHP 5.3, což znamená, že je velká šance, že používáte mysqlnd.
Zde budete chtít vypnout dotazy s vyrovnávací pamětí. V každém rozhraní PHP k MySQL se to dělá jinak:
- Pro PDO budete muset nastavit
PDO::MYSQL_ATTR_USE_BUFFERED_QUERYatribut nafalse. - Pro mysqli musíte předat
MYSQLI_USE_RESULTkonstantní kquerymetoda. - Pro mysql musíte zavolat
mysql_unbuffered_querymístomysql_query.
Úplné podrobnosti a příklady jsou na stránce.
Velký tlustý dotaz bez vyrovnávací paměti dostal!
Musíte správně zavřete popisovač příkazu a uvolněte sadu výsledků před zadáním dalšího dotazu:
- V PDO to znamená volání
closeCursorna popisovači příkazů. - V mysqli to znamená volání
free_resultna popisovači příkazu nebofreena rukojeti výsledku, v závislosti na tom, s čím pracujete. - V mysql to znamená volání
mysql_free_result
Pokud tak neučiníte, dojde k chybě.