Maison >développement back-end >tutoriel php >Comment créer une instruction préparée MySQLi sécurisée avec des conditions LIKE variables ?

Comment créer une instruction préparée MySQLi sécurisée avec des conditions LIKE variables ?

DDD
DDDoriginal
2024-12-04 11:39:151030parcourir

How to Build a Secure MySQLi Prepared Statement with Variable LIKE Conditions?

Création d'une requête SELECT avec des conditions LIKE variables en tant qu'instruction préparée mysqli

Lorsque vous travaillez avec une entrée utilisateur, il est essentiel de préparer des instructions pour éviter Injections SQL et garantie de l’intégrité des données. Cela devient difficile lorsque le nombre de conditions LIKE est variable.

Aperçu du problème

L'extrait de code tente de résoudre ce problème en créant dynamiquement les conditions LIKE en fonction de la saisie de l'utilisateur. . Cependant, il ne parvient pas à formater correctement les paramètres de l'instruction préparée.

Solution

La solution réside dans le placement des caractères génériques % autour des paramètres, et non des espaces réservés. Cela garantit que les paramètres sont utilisés pour filtrer la requête.

Explication détaillée

  1. Initialiser les ingrédients :

    a. Créez un tableau d'expressions de clause WHERE à l'aide d'OR.
    b. Déterminez les types de données des valeurs (dans ce cas, des chaînes).
    c. Combinez les types de données et les paramètres dans un seul tableau.

  2. Préparer les conditions :

    a. Convertissez les entrées de l'utilisateur en un tableau de valeurs uniques.
    b. Pour chaque valeur, créez une expression LIKE.
    c. Mettez à jour le tableau des paramètres pour inclure les types de données et les valeurs génériques.

  3. Préparer la requête :

    a. Commencez par une requête SELECT * de base.
    b. S'il y a des conditions, ajoutez une clause WHERE avec les expressions dynamiques.

  4. Lier les paramètres et exécuter :

    a. Liez le tableau de paramètres à l'instruction préparée à l'aide de l'opérateur splat (...).
    b. Exécutez l'instruction et récupérez les résultats le cas échéant.

Exemple de code :

$string = "Bill N_d Dave";

$conditions = [];
$parameters = [''];
foreach (array_unique(explode(' ', $string)) as $value) {
    $conditions[] = "name LIKE ?";
    $parameters[0] .= 's';
    $parameters[] = "%{$value}%";
}

$query = "SELECT * FROM info";
if ($conditions) {
    $stmt = $mysqli->prepare($query . ' WHERE ' . implode(' OR ', $conditions));
    $stmt->bind_param(...$parameters);
    $stmt->execute();
    $result = $stmt->get_result();
} else {
    $result = $conn->query($query);
}

foreach ($result as $row) {
    echo "<div>{$row['name']}</div>\n";
}

Remarques supplémentaires :

  • Si aucune condition n'est spécifiée, exécutez la requête sans WHERE clause.
  • Envisagez d'utiliser addcslashes() pour échapper aux caractères génériques dans les entrées utilisateur, si nécessaire.

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:
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