sql >> Database teknologi >  >> RDS >> Mysql

Hvorfor giver mysqli en Kommandoer ude af synkroniseringsfejl?

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.



  1. Hvordan kan jeg se alle de tilladte specialtegn i et varchar- eller char-felt i SQL Server?

  2. De fandens store genstande

  3. Fejl:ORA-01704:streng for lang

  4. Hvordan eksporterer man alle data fra tabel til et indsætteligt sql-format?