MySQL-klienten tillader dig ikke at udføre en ny forespørgsel, hvor der stadig er rækker, der skal hentes fra en igangværende forespørgsel. Se Kommandoer ude af synkronisering i MySQL-dokumentet om almindelige fejl.
Du kan bruge mysqli_store_result()
for at forhåndshente alle rækkerne fra den ydre forespørgsel. Det vil buffere dem i MySQL-klienten, så fra serverens synspunkt har din app hentet det fulde resultatsæt. Så kan du udføre flere forespørgsler, selv i en løkke med hentning af rækker fra det nu-buffrede ydre resultatsæt.
Eller du mysqli_result::fetch_all()
som returnerer det fulde resultatsæt som et PHP-array, og så kan du loope over det array.
Kaldning af lagrede procedurer er et særligt tilfælde, fordi en lagret procedure har potentialet til at returnere flere resultatsæt, som hver kan have sit eget sæt rækker. Det er derfor, svaret fra @a1ex07 nævner brugen af mysqli_multi_query()
og looping indtil mysqli_next_result()
har ikke flere resultatsæt. Dette er nødvendigt for at opfylde MySQL-protokollen, selvom din lagrede procedure i dit tilfælde har et enkelt resultatsæt.
PS:Jeg kan i øvrigt se, at du laver de indlejrede forespørgsler, fordi du har data, der repræsenterer et hierarki. Du vil måske overveje at gemme dataene anderledes, så du nemmere kan forespørge dem. Jeg lavede en præsentation om dette med titlen Modeller for hierarkiske data med SQL og PHP . Jeg dækker også dette emne i et kapitel i min bog SQL Antipatterns:Avoiding the Pitfalls of Database Programmering .
Her er, hvordan du implementerer mysqli_next_result()
i CodeIgnitor 3.0.3:
På linje 262 af system/database/drivers/mysqli/mysqli_driver.php
ændre
protected function _execute($sql)
{
return $this->conn_id->query($this->_prep_query($sql));
}
til dette
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;
}
Dette har været et problem siden 2.x. Jeg har lige opdateret til 3.x og måtte kopiere dette hack over til den nye version.