Heim >Datenbank >MySQL-Tutorial >Wie kann ich dynamische Tabellen- und Feldnamen sicher in vorbereiteten Anweisungen verwenden?

Wie kann ich dynamische Tabellen- und Feldnamen sicher in vorbereiteten Anweisungen verwenden?

Susan Sarandon
Susan SarandonOriginal
2024-12-08 17:10:12559Durchsuche

How Can I Safely Use Dynamic Table and Field Names in Prepared Statements?

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:

  1. Bezeichner formatieren:

    • Bezeichner in Backticks einschließen: „Bezeichner“.
    • Escape-Backticks innerhalb die Kennung durch Verdoppelung: „Bezeichner“.
  2. Dynamische Werte auf die Whitelist setzen:

    • Erstellen Sie eine Liste zulässiger Bezeichner oder Schlüsselwörter.
    • Überprüfen Sie vor der Verwendung den dynamischen Wert anhand der Whitelist it.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn