Met bijgaand script probeer ik een json object te maken
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once("php/datacon.php");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sql="SELECT * FROM FEIHorse ORDER BY current_name";
$result=mysqli_query($dblink,$sql);
$data = array();
while($row = $result->fetch_assoc()){
$data[] = $row;
}
echo json_encode($data);
mysqli_close($dblink);
?>
maar krijg deze foutmelding
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 49 bytes) in /home/harry-arends.nl/public_html/event_2018/horse.php on line 17
Het zou kunnen dat je op iets raars stuit doordat je procedureel en OO met elkaar zit te mengen. Dat is nooit aan te bevelen. Gebruik óf het ene, óf het andere.
Het zou ook nog kunnen dat de code die je toont niet de code is die je gebruikt, maar dat je ergens een oneindige lus hebt zitten.
Het zou kunnen dat je op iets raars stuit doordat je procedureel en OO met elkaar zit te mengen. Dat is nooit aan te bevelen.
Als je de PHP-source bestudeert, zul je zien dat de procedurele variant niets meer is dan een mapping naar het object. Het mixen van de stijlen is voornamelijk 'not done' vanwege de duidelijkheid van je code, maar technisch gezien maakt het geen verschil. Hooguit kost het een paar microseconden per aanroep extra.
Ik gok dat de query gewoon meer dan zo'n 32 MB aan data teruggeeft. Zet dat in een array, converteer die array naar JSON, en je zit al snel boven de -blijkbaar- ingestelde limiet van 64 MB. Kwestie van de PHP_INI-variabele memory_limit verhogen naar 128M (wat tegenwoordig de default-instelling is, trouwens). Dat zou -als ik het me goed herinner- gewoon met ini_set moeten kunnen, dus daarvoor hoef je niet per se je configfile aan te passen.
Is 128 MB ook niet voldoende, dan heb je óf een erg grote dataset (blob-velden?), óf er is inderdaad iets anders in je code dat erg veel geheugen slurpt. Sowieso zou ik een select * niet aanraden, zelfs niet als je inderdaad alle velden wilt selecteren. Gewoon alle velden afzonderlijk benoemen, dat maakt je code een stuk eenvoudiger te begrijpen als je over een half jaar nog eens iets wilt wijzigen. En de kans dat je code onvoorspelbare dingen gaat doen als je een keer een veld invoegt of verwijdert is een stuk kleiner. En als je niet alle velden gebruikt, scheelt dat weer runtime-geheugen.