<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Dieser Teil des Inhalts hat nichts mit dem Thema des Artikels zu tun</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Willkommen bei meinemPHPStudiennotizen!\n"</span></span><span>;
</span><span><span class="hljs-variable">$today</span></span><span> = </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Das heutige Datum ist: <span class="hljs-subst">$today</span></span></span><span>\n";
</span></span>
Die Leistungsoptimierung wird häufig übersehen, wenn PHP für Datenbankvorgänge verwendet werden, insbesondere bei der Verwendung von MySQLI -Erweiterungen für vorbereitete Aussagen. In diesem Artikel wird vorgestellt, wie Sie mySQLI_STMT :: $ field_count und mySQLI_STMT :: BIND_RESULT kombinieren, um die Effizienz der Abfrage zu verbessern und gleichzeitig die Wartbarkeit und Sicherheit des Codes sicherzustellen.
Die Eigenschaft $ field_count wird verwendet, um die Anzahl der Felder im Ergebnis der aktuellen Vorverarbeitungsanweisung zurückzugeben. Diese Eigenschaft ist sehr nützlich für Szenarien, in denen SQL -Abfragen dynamisch generiert werden oder in denen unbestimmte Felder erforderlich sind. Verwenden Sie es, um die Ergebnisvariable dynamisch zu binden, ohne den Feldnamen im Voraus zu kennen.
Beispiel:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, email FROM users WHERE status = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$status</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// Holen Sie sich die Anzahl der Felder</span></span><span>
</span><span><span class="hljs-variable">$fieldCount</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>->field_count;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Es gibt insgesamt diese Frage <span class="hljs-subst">$fieldCount</span></span></span><span> Felder。";
</span></span>
Mit $ field_count können wir das Ergebnissatz dynamisch verarbeiten, ohne den Feldnamen zu kennen, wodurch die Universalität des Codes verbessert wird.
Normalerweise binden wir jedes Feld manuell mit Bind_Result :
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_result</span></span><span>(</span><span><span class="hljs-variable">$id</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$email</span></span><span>);
</span></span>
Wenn die Anzahl der Felder groß ist oder sich die Felder ändern können, ist diese Methode ineffizient und fehleranfällig. In Kombination mit $ field_count können wir dynamische Bindung implementieren:
<span><span><span class="hljs-comment">// Holen Sie sich die Ergebnismetadaten</span></span><span>
</span><span><span class="hljs-variable">$meta</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">result_metadata</span></span><span>();
</span><span><span class="hljs-variable">$fields</span></span><span> = [];
</span><span><span class="hljs-variable">$bindVars</span></span><span> = [];
</span><span><span class="hljs-comment">// Generieren Sie dynamisch Variablen basierend auf der Anzahl der Felder</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$field</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_field</span></span><span>()) {
</span><span><span class="hljs-variable">$fields</span></span><span>[] = </span><span><span class="hljs-variable">$field</span></span><span>->name;
</span><span><span class="hljs-variable">$bindVars</span></span><span>[] = &${</span><span><span class="hljs-variable">$field</span></span><span>->name}; </span><span><span class="hljs-comment">// Achten Sie auf Zitate</span></span><span>
}
</span><span><span class="hljs-comment">// Dynamische Bindungsergebnisse</span></span><span>
</span><span><span class="hljs-title function_ invoke__">call_user_func_array</span></span><span>([</span><span><span class="hljs-variable">$stmt</span></span><span>, </span><span><span class="hljs-string">'bind_result'</span></span><span>], </span><span><span class="hljs-variable">$bindVars</span></span><span>);
</span><span><span class="hljs-comment">// Daten abrufen</span></span><span>
</span><span><span class="hljs-variable">$results</span></span><span> = [];
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>()) {
</span><span><span class="hljs-variable">$row</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$fields</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$field</span></span><span>) {
</span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-variable">$field</span></span><span>] = ${</span><span><span class="hljs-variable">$field</span></span><span>};
}
</span><span><span class="hljs-variable">$results</span></span><span>[] = </span><span><span class="hljs-variable">$row</span></span><span>;
}
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$results</span></span><span>);
</span></span>
Unabhängig davon, wie viele Felder die Abfragerenditen zurückgeben, können die Ergebnisse im Array effizient gespeichert werden, um eine manuelle Änderung des Bindungscode zu vermeiden und die Wartung und Leistung zu verbessern.
Reduzieren Sie den doppelten Code : Für jede Abfrage müssen Sie Bind_Result nicht manuell schreiben, insbesondere für Szenarien, in denen sich Felder häufig ändern.
Effizienz verbessern : Vermeiden Sie den wiederholten Gebrauch von assoziativen Arrays und Fetch_assoc () und erhalten Sie direkt Daten über Bindungsvariablen.
Sehr universell : Es kann verwendet werden, um SQL -Abfragen dynamisch zu generieren oder automatisch Feldnamen aus Datenbanktabellen zu erhalten.
Bei Verwendung der dynamischen Bindung müssen Sie auf variable Referenzen ( & ) achten, da der Wert nicht korrekt erhalten werden kann.
Für große Datenabfragen speichert Bind_result mehr Speicher als Fetch_assoc , da es Daten direkt an Variablen bindet, anstatt ein vollständiges Array zu generieren.
Wenn Sie nur eine kleine Anzahl von Feldern abfragen, hat manuelle Bind_Result keine offensichtlichen Leistungsunterschiede, aber die dynamische Bindung hat offensichtliche Vorteile in Szenarien, in denen Felder ungewiss sind oder sich häufig abfragen.
Das Kombinieren von MySQLI_STMT :: $ field_count und MySQLI_STMT :: BIND_RESULT kann effiziente, allgemeine und wartbare Vorverarbeitungsanweisungen abfragen Lösungen realisieren. Es reduziert nicht nur die Codemenge, sondern verbessert auch die Leistung in großem Datenvolumen und dynamischen Abfrageszenarien. Es ist eine Fähigkeit, die es wert ist, die PHP -Entwicklung zu beherrschen.