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 ?
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); }
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 :
Identifiants de format :
Valeurs dynamiques de la liste blanche :
Code modifié :
$field = "`" . str_replace("`", "``", $field) . "`"; $table = "`" . str_replace("`", "``", $table) . "`"; $sql = "SELECT * FROM $table WHERE $field = ?";
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!