Din kontrol, om forbindelsen mislykkedes, falder igennem til koden, der bruger forbindelsen. Det vil naturligvis ikke fungere, fordi det ikke er en direkte forbindelse. Sørg for, at hvis forbindelsen mislykkes, nås den kode, der afhænger af den, ikke. (Bemærk, at det ikke er nødvendigt, at jeg går ind for brug af exit eller die. De kan give en ret dårlig brugeroplevelse. De kan være nyttige, men ideelt set bør du udsende en bedre besked og lade de grimme fejl-ting stå i logfiler [medmindre du' re kun test, eller det er et kommandolinjescript]).
Hvad angår close() (som faktisk er et alias for free()):
free() tildeler stort set alle de ting, der er knyttet til resultatet. Du skal forstå, at der er to (forenkling, men gå med det) måder at hente rækker på:
Bufret - Alt snuppes på én gang. Med andre ord, når du begynder at gå gennem posterne, er de alle faktisk allerede i hukommelsen. De er buffrede . De trækkes ikke fra serveren hver gang du kalder fetch(), men trækkes snarere fra hukommelsen.
Ikke bufferet - der kan være en lille buffer, men i det væsentlige hver gang du kalder fetch(), skal PHP trække en ny række fra databasen. I begyndelsen af loopet sidder de ikke alle sammen i hukommelsen.
Interessant note:num_rows() kan kaldes på en bufferforespørgsel meget effektivt, da alle rækkerne allerede er trukket (selvom du aldrig bør trække alle rækkerne bare for at tælle dem -- det er det, COUNT er for). Forespørgsler uden buffer kan ikke udføre num_rows(), før de trækker alle rækkerne. Det betyder, at det enten vil være en fejl, eller i det væsentlige vil gøre det til en bufferforespørgsel.
Anyway, tilbage til dit egentlige spørgsmål:
free() frigiver alt forbundet med resultatobjektet. I tilfælde af en bufferforespørgsel er dette alle rækker, der sidder i hukommelsen. I tilfælde af en forespørgsel uden buffer, frigiver free() hvilke rækker der måtte sidde i hukommelsen og annullerer derefter resten af anmodningen. Grundlæggende siger dens PHP til MySQL:"Hey kender du alle de rækker, jeg anmoder om? Har ændret mening. Du kan bare droppe den anmodning."
Med hensyn til, om du skulle frigøre resultater... Nå, når variablen går uden for scope*, sker det alligevel. Der er dog ingen skade i eksplicit at gøre det, og i situationer, hvor en forespørgsel kan bruge meget hukommelse og derefter en anden forespørgsel efter den kan bruge meget hukommelse, kan du ønske at frigøre sættene bare for at holde hukommelsesforbruget lavt .
* Eller måske når anmodningen slutter. Jeg kan ikke huske det fra toppen af mit hoved.