PHP wie prüfen Sie, ob eine MySQLi Abfrage geschlossen werden muss?
Habe ich eine einfache MySQLi-Klasse für ein Projekt an dem ich arbeite, um es einfacher und effizienter zu ziehen aus und drücken Sie auf die DB. (auch mehr vertraut mit OOP in PHP)
Einem problem, das ich laufen in ist, in einer Anstrengung, um es so effizient wie möglich. Ich versuchen zu schließen /kostenlos jede Abfrage /statement /ResultSet. Dabei bekomme ich folgende Fehlermeldung: es ist
Warning: mysqli_result::close(): Couldn't fetch mysqli_result
Denke ich, dass ich die oben speziell, weil es versucht, schließen Sie die Abfrage zweimal hintereinander.
Derzeit meine Klasse machen kann, vorbereiteten und unvorbereiteten Aussagen. Also versuche ich zu schließen-Abfragen /Anweisungen an 2 stellen. Ich check bei der Vorbereitung einer Anweisung, wenn ich schon bereit eine Aussage, wenn ja muss ich in der Nähe der alten ein, bevor ich ein neues machen und schließlich in den Destruktor der Klasse.
Ich merke, ich könnte Sie einfach schließen Sie die Abfrage /Anweisung, nachdem ich gezogen und gespeichert, das Ergebnis aber das scheint zu unordentlich für ein paar Gründe. Zum einen entfällt die Möglichkeit der Wiederverwendung der vorbereiteten Anweisung. Sowie das Verbot mich zu ziehen, einige Informationen über die Abfrage, nachdem es ausgeführt worden ist, wie die betroffenen Zeilen und dergleichen.
Ich weiß, ich könnte nur speichern diese Informationen für jede Abfrage und was nicht, aber es scheint nur, wie der richtige Weg zu gehen über dieses problem wäre zu schließen gratis /der Abfrage /Anweisung, wenn ich brauche, um ein anderes, und wieder am Ende des Skripts.
Ich habe versucht, auf der Suche rund um und Lesen, wie ich das richtig, diese Aufgabe zu bewältigen, aber ich war nicht in der Lage zu kommen mit etwas.
Also meine Frage ist, gibt es trotzdem, um zu testen, ob eine Abfrage oder Anweisung geschlossen werden muss, oder befreit? Oder gibt es einen besseren Weg, ich sollte versuchen, dieses Thema anzugehen?
Vielen Dank für jede Hilfe oder Einsicht jedermann anbieten können.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass, wenn es keine Zeilen gibt, Links in das Ergebnis gesetzt, sollte automatisch geschlossen werden. Also, wenn Sie Durchlaufen die gesamte ResultSet, es gibt keine Notwendigkeit, rufen Sie
mysqli_result
. Allerdings sollte man es schließen, wenn Sie Apportieren, lassen Sie uns sagen, nur die erste Zeile aus einem ResultSet mit über 100 Zeilen.var_dump
nach ausgeführt, und der andere nach Holen. Drucken Sie die gleiche Sache. Wenn Sie einenvar_dump
nach Nähe, obwohl SieProperty access is not allowed yet
so ist es offensichtlich etwas anderes zu tun. Obwohl, wenn es eine andere Effizienz weisen ist die Frage? Auch wenn ich die Grenze einer Abfrage um 1 Zeile (z.B.LIMIT 0, 1
) aufrufen $stmt->fetch() alleine nicht in der Nähe der Anweisung. Aber wenn ich einenwhile
Schleife undecho
zu bestätigen, es gibt nur eine Zeile, die es gilt zu schließen. Irgendwelche Ideen?Konnten Sie es
null
nachdem Sie schließen Sie es, und prüfen Sie die null in den Destruktor, bevor Sie es schließen es.Offensichtlich, würden Sie nur wollen, um null, eine vorbereitete Anweisung wenn Sie sicher sind, dass Sie fertig sind es zu benutzen.
Könnten Sie RAII oder eine factory-Klasse+reference counting zur Verwaltung der Aussagen. So dass Sie nicht brauchen, um explizit zu überprüfen, wenn es Zeit ist, etwas schließen. Ohne zu sehen, die details von, wie du mit deinem wrapper, ist es schwer ins detail zu gehen. In Objective-C, s-accessor-Muster kann auch von nutzen sein, die würde so Aussehen:
Würden Sie immer nur Zugriff auf die Anweisung member Bereich durch die oben genannten Funktionen, auch innerhalb der Klasse. Eigentlich sieht es eher aus wie:
Dies ist, was ich verwenden. Wenn es keine Ergebnisse in der Aussage, wusste ich, ich muss gratis das Ergebnis:
Wenn die mysqli Abfrage-Ergebnis ist schon
null
, erhalten Sie die folgende Warnung in PHP 5:Im Prinzip könnte man die Handhabung dieser Fälle mit einem benutzerdefinierten error-handler oder einfach unterdrücken der Warnungen/Fehler, d.h.
is_object($mysqliqresult) && @$mysqliqresult->free()
Nutzen Sie alternativ mysqli-
statements
über dieprepare
- Methode, sondern dann läuft ein mysqlidblink->query direkt, wie folgt:Justin's Vorschlag ist auch in Ordnung.
Sicherste Weg, die ich gefunden habe: