MySQLI_STMT :: PREPEPT ist eine Methode, die in der MySQLI -Erweiterung verwendet wird, um SQL -Anweisungen vorzubereiten. Vorverarbeitungsanweisungen verringern das Risiko einer SQL -Injektion im Vergleich zur Verwendung von SQL -Abfragen direkt. Dies liegt daran, dass bei der Ausführung von SQL der Inhaltseingang des Benutzers nicht direkt in die Abfragezeichenfolge eingespannt ist, sondern als Bindungsparameter übergeben wird.
<span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$user</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$database</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->connect_error);
}
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ? AND password = ?"</span></span><span>);
</span></span>
Im obigen Code enthält die SQL -Abfrage zwei Fragenmarken ( ? ), Die Platzhalter sind, die nachfolgende gebundene Parameter akzeptieren.
Verwenden Sie in der Vorverarbeitungsanweisung die Methode BIND_PARAM () , um den Benutzereingabewert an den Platzhalter zu binden. Zu diesem Zeitpunkt wird der gebundene Parameterwert nicht direkt in die SQL -Anweisung eingefügt, sondern durch die Vorverarbeitungsanweisung weitergegeben. Die Methode Bind_param () erfordert zwei Parameter: den Spezifizierer des Datentyps und die Variable, die gebunden werden soll.
Gemeinsame Datentypspezifizierer sind:
I : Ganzzahl (int)
D : doppelte Präzision schwimmende Punkte (doppelt)
S : String (String)
B : Blob (Binärdaten)
<span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'john_doe'</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">'password123'</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">'ss'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>);
</span></span>
In diesem Beispiel bedeutet "SS" , dass beide Parameter gebundene String -Typen sind. Die Parameter $ username und $ password sind sicher an Platzhalter in der SQL -Abfrage gebunden.
Nach Abschluss der Parameterbindung wird die Ausführungs () -Methode aufgerufen, um die Vorverarbeitungsanweisung auszuführen. Wenn der gebundene Parametertyp korrekt ist, wird die Ausführungsanweisung normal ausgeführt.
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
Die methode execute () gibt einen booleschen Wert zurück, der angibt, ob die Anweisung erfolgreich ausgeführt wird. Wenn Sie die Abfrageergebnisse abrufen müssen, können Sie die Methode get_result () (für die Auswahlabfrage ) verwenden, um die Ausführungsergebnisse zu erhalten.
Für ausgewählte Anweisungen müssen Sie nach der Ausführung der Vorverarbeitungsanweisung normalerweise das Ergebnis der Abfrage erhalten. Verwenden Sie die Methode get_result () , um die Abfrageergebnisse in ein mySQLI_Result -Objekt umzuwandeln, aus dem Daten erhalten werden können.
<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">get_result</span></span><span>();
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>] . </span><span><span class="hljs-string">' - '</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'email'</span></span><span>] . </span><span><span class="hljs-string">'<br>'</span></span><span>;
}
</span></span>
In diesem Beispiel werden die Abfrageergebnisse nach Zeile extrahiert und geben den Benutzernamen und die E -Mail aus.
Obwohl Vorverarbeitungsanweisungen die SQL -Injektion verhindern können, können in der tatsächlichen Entwicklung immer noch verschiedene Fehler auftreten. Für ein effektives Debuggen können wir die Fehlermethode verwenden, um relevante Fehlerinformationen zu erhalten.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'Error preparing statement: '</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->error);
}
</span><span><span class="hljs-keyword">if</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-keyword">die</span></span><span>(</span><span><span class="hljs-string">'Execute error: '</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->error);
}
</span></span>
Hier verwenden wir CONN-> ERROR UND STMT-> Fehler zum Erfassen von Fehlerinformationen für Datenbankverbindungs- und Ausführungsanweisungen. Dies kann uns helfen, Probleme rechtzeitig zu entdecken und zu lösen.
Nachdem wir die Vorverarbeitungsanweisung verwendet haben, müssen wir die Methode close () aufrufen, um die Anweisung und die Datenbankverbindung zu schließen, um die Ressource zu befreien.
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>
Dies ist nicht nur eine gute Programmiergewohnheit, sondern vermeidet auch effektiv Ressourcenleckage.
Verwandte Tags:
mysqli_stmt