Requêtes LIKE dynamiques utilisant des instructions préparées mysqli
Cette question aborde le problème de la création d'une instruction préparée avec un nombre variable de conditions LIKE basées sur entrée de l'utilisateur. Le code PHP fourni tente de construire l'instruction, mais il y a une erreur liée au formatage des clauses LIKE.
Le problème clé réside dans l'endroit où les signes de pourcentage (%) sont placés autour des paramètres (?) dans les clauses LIKE. Au lieu d'envelopper les paramètres, les signes de pourcentage doivent entourer les espaces réservés, comme indiqué ci-dessous :
foreach ( $search_exploded as $search_each ) { $x ++; if ( $x == 1 ) { $construct .= "name LIKE %??%"; } else { $construct .= " or name LIKE %??%"; } }
Cette correction garantit que les valeurs des paramètres (par exemple, "mon nom") sont correctement liées aux clauses LIKE. .
De plus, le code utilise une chaîne concaténée ($construct) pour construire la clause WHERE. Cependant, une approche plus efficace et plus sécurisée consiste à utiliser un tableau d'espaces réservés bind_param() pour tous les paramètres, comme indiqué ci-dessous :
$where_params = []; foreach ( $search_exploded as $search_each ) { $where_params[] = "%{$search_each}%"; } $query = "SELECT * FROM info WHERE name LIKE ?"; $stmt = mysqli_prepare( $conn, $query ); mysqli_stmt_bind_param( $stmt, "s", ...$where_params );
Cette méthode gère gracieusement un certain nombre de conditions LIKE et élimine le risque d'injection SQL. vulnérabilités.
Avec ces modifications, la requête dynamique LIKE peut rechercher correctement des enregistrements en fonction de plusieurs critères définis par l'utilisateur.
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!