Maison > base de données > tutoriel mysql > Comment puis-je utiliser en toute sécurité les noms de tables et de champs dynamiques dans les instructions préparées ?

Comment puis-je utiliser en toute sécurité les noms de tables et de champs dynamiques dans les instructions préparées ?

Susan Sarandon
Libérer: 2024-12-08 17:10:12
original
596 Les gens l'ont consulté

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

Utilisation d'instructions préparées pour lier des identifiants et des mots clés

Problème :

Création d'une requête dynamique en utilisant des instructions préparées, mais les tentatives de liaison des noms de tables, des noms de champs ou des mots-clés de syntaxe aboutissent à un résultat vide tableau.

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);
}
Copier après la connexion

Résultats attendus :
Un tableau de résultats de la base de données.

Résultats réels :
Un vide tableau.

Cause :
Les instructions préparées ne peuvent lier que des littéraux de données, pas des identifiants (tels que des noms de table ou de champ) ou des mots-clés de syntaxe.

Solution :

Pour utiliser des identifiants dynamiques ou des mots-clés, suivez ces étapes :

  1. Identifiants de format :

    • Entourez les identifiants entre guillemets : "identifiant".
    • Échapper aux guillemets à l'intérieur l'identifiant en les doublant : "identifier".
  2. Valeurs dynamiques de la liste blanche :

    • Créez une liste d'identifiants ou de mots-clés autorisés.
    • Vérifiez la valeur dynamique par rapport à la liste blanche avant d'utiliser il.

Code modifié :

$field = "`" . str_replace("`", "``", $field) . "`";
$table = "`" . str_replace("`", "``", $table) . "`";
$sql = "SELECT * FROM $table WHERE $field = ?";
Copier après la connexion

Mots clés :

Si nécessaire, ajoutez également à la liste blanche et validez les mots-clés dynamiques. En suivant ces directives, vous pouvez inclure en toute sécurité des identifiants dynamiques et des mots-clés dans vos déclarations préparées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal