Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum schließen wir das Ergebnis in Mysqli

Ihre Überprüfung, ob die Verbindung fehlgeschlagen ist, fällt auf den Code, der die Verbindung verwendet. Offensichtlich wird das nicht funktionieren, weil es keine Live-Verbindung ist. Stellen Sie sicher, dass, wenn die Verbindung fehlschlägt, Code, der davon abhängt, nicht erreicht wird. (Beachten Sie, dass ich nicht unbedingt die Verwendung von exit oder die befürworten muss. Sie können zu einer ziemlich schlechten Benutzererfahrung führen. Sie können nützlich sein, aber idealerweise sollten Sie eine bessere Nachricht ausgeben und das hässliche Fehlermaterial für Protokolle belassen [es sei denn, Sie ' re nur testen oder es ist ein Kommandozeilenskript]).

Was close() angeht (was eigentlich ein kostenloser Alias ​​ist()):

free() hebt im Grunde alle an das Ergebnis angehängten Dinge auf. Sie müssen verstehen, dass es zwei (vereinfachte, aber machbare) Möglichkeiten gibt, Zeilen abzurufen:

Gepuffert - Alles wird auf einmal geschnappt. Mit anderen Worten, zu dem Zeitpunkt, an dem Sie beginnen, die Aufzeichnungen in einer Schleife zu durchlaufen, sind sie alle bereits im Speicher. Sie werden gepuffert . Sie werden nicht jedes Mal vom Server abgerufen, wenn Sie fetch() aufrufen, sondern aus dem Speicher.

Nicht gepuffert - es kann einen kleinen Puffer geben, aber im Grunde muss PHP jedes Mal, wenn Sie fetch() aufrufen, eine neue Zeile aus der Datenbank ziehen. Am Anfang der Schleife sitzen sie nicht alle im Gedächtnis.

Interessanter Hinweis:num_rows() kann bei einer gepufferten Abfrage sehr effizient aufgerufen werden, da alle Zeilen bereits gezogen sind (obwohl Sie niemals alle Zeilen ziehen sollten, nur um sie zu zählen – dafür ist COUNT da). Nicht gepufferte Abfragen können num_rows() nicht ausführen, bis sie alle Zeilen abrufen. Das heißt, es wird entweder ein Fehler sein oder es im Wesentlichen in eine gepufferte Abfrage verwandeln.

Wie auch immer, zurück zu Ihrer eigentlichen Frage:

free() gibt alles frei, was mit dem Ergebnisobjekt verbunden ist. Im Fall einer gepufferten Abfrage sind dies alle Zeilen, die sich im Arbeitsspeicher befinden. Im Fall einer nicht gepufferten Abfrage gibt free() alle Zeilen frei, die sich möglicherweise im Speicher befinden, und bricht dann den Rest der Anforderung ab. Im Grunde ist es PHP, das MySQL sagt:"Hey, kennst du all diese Zeilen, die ich anfordere? Ich habe meine Meinung geändert. Du kannst diese Anfrage einfach fallen lassen."

Wenn Sie Ergebnisse freigeben sollten ... Nun, wenn die Variable den Gültigkeitsbereich* verlässt, wird es sowieso passieren. Es schadet jedoch nicht, dies explizit zu tun, und in Situationen, in denen eine Abfrage viel Speicher und eine weitere Abfrage danach viel Speicher verwenden kann, möchten Sie möglicherweise die Sätze freigeben, nur um die Speichernutzung niedrig zu halten .

* Oder vielleicht, wenn die Anfrage endet. Ich erinnere mich nicht aus dem Kopf.