Verwenden vorbereiteter Anweisungen zum Binden von Bezeichnern und Schlüsselwörtern
Problem:
Erstellen einer dynamischen Abfrage mit vorbereiteten Anweisungen, aber Versuche, Tabellennamen, Feldnamen oder Syntaxschlüsselwörter zu binden, führen zu einem leeren Ergebnis Array.
Code:
function search_db($db, $searchTerm, $searchBy, $searchTable){ try{ $stmt = $db->prepare(' SELECT * FROM ? WHERE ? LIKE ? '); $stmt->bindParam(1, $searchTable); $stmt->bindParam(2, $searchBy); $stmt->bindValue(3, '%'. $searchTerm.'%'); $stmt->execute(); } catch(Exception $e) { return array(); } return $stmt->fetchAll(PDO::FETCH_ASSOC); }
Erwartete Ergebnisse:
Ein Array von Ergebnissen aus der Datenbank.
Tatsächliche Ergebnisse:
Eine leere Array.
Ursache:
Vorbereitete Anweisungen können nur Datenliterale binden, keine Bezeichner (wie Tabellen- oder Feldnamen) oder Syntaxschlüsselwörter.
Lösung:
Um dynamische Bezeichner oder Schlüsselwörter zu verwenden, befolgen Sie diese Schritte:
Bezeichner formatieren:
Dynamische Werte auf die Whitelist setzen:
Geänderter Code:
$field = "`" . str_replace("`", "``", $field) . "`"; $table = "`" . str_replace("`", "``", $table) . "`"; $sql = "SELECT * FROM $table WHERE $field = ?";
Schlüsselwörter:
Wenn Führen Sie bei Bedarf auch dynamische Schlüsselwörter auf die Whitelist und validieren Sie sie. Wenn Sie diese Richtlinien befolgen, können Sie dynamische Bezeichner und Schlüsselwörter sicher in Ihre vorbereiteten Kontoauszüge einbinden.
Das obige ist der detaillierte Inhalt vonWie kann ich dynamische Tabellen- und Feldnamen sicher in vorbereiteten Anweisungen verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!