Met de MySQL-client kunt u geen nieuwe query uitvoeren als er nog rijen moeten worden opgehaald uit een lopende query. Zie Opdrachten niet synchroon in het MySQL-document over veelvoorkomende fouten.
U kunt mysqli_store_result()
gebruiken
om alle rijen van de buitenste query vooraf op te halen. Dat zal ze bufferen in de MySQL-client, dus vanuit het oogpunt van de server heeft uw app de volledige resultatenset opgehaald. Dan kunt u meer query's uitvoeren, zelfs in een lus van het ophalen van rijen uit de nu gebufferde buitenste resultatenset.
Of je mysqli_result::fetch_all()
die de volledige resultaatset retourneert als een PHP-array, en dan kun je over die array heen lopen.
Het aanroepen van opgeslagen procedures is een speciaal geval, omdat een opgeslagen procedure het potentieel heeft om meerdere resultaatsets te retourneren, die elk hun eigen set rijen kunnen hebben. Daarom vermeldt het antwoord van @a1ex07 het gebruik van mysqli_multi_query()
en herhalen tot mysqli_next_result()
heeft geen resultatensets meer. Dit is nodig om te voldoen aan het MySQL-protocol, zelfs als uw opgeslagen procedure in uw geval een enkele resultaatset heeft.
PS:Trouwens, ik zie dat je de geneste zoekopdrachten doet omdat je gegevens hebt die een hiërarchie vertegenwoordigen. U kunt overwegen de gegevens anders op te slaan, zodat u deze gemakkelijker kunt opvragen. Ik heb hierover een presentatie gegeven met de titel Modellen voor hiërarchische gegevens met SQL en PHP . Ik behandel dit onderwerp ook in een hoofdstuk van mijn boek SQL Antipatterns:Avoiding the Pitfalls of Database Programmeren .
Hier leest u hoe u mysqli_next_result()
implementeert in CodeIgnitor 3.0.3:
Op regel 262 van system/database/drivers/mysqli/mysqli_driver.php
wijzigen
protected function _execute($sql)
{
return $this->conn_id->query($this->_prep_query($sql));
}
naar dit
protected function _execute($sql)
{
$results = $this->conn_id->query($this->_prep_query($sql));
@mysqli_next_result($this->conn_id); // Fix 'command out of sync' error
return $results;
}
Dit is een probleem sinds 2.x. Ik heb zojuist geüpdatet naar 3.x en moest deze hack naar de nieuwe versie kopiëren.