Position actuelle: Accueil> Derniers articles> Exemples d'écriture en mode sûr à l'aide de next_result ()

Exemples d'écriture en mode sûr à l'aide de next_result ()

gitbox 2025-05-02

Lorsque vous utilisez PHP pour les opérations de la base de données, la fonction Next_Result () est souvent utilisée pour gérer les ensembles multi-résults, en particulier lors de l'exécution de procédures stockées ou de requêtes SQL par lots. Cependant, lors de l'activation du mode sûr ou d'avoir des exigences plus élevées pour la sécurité des interactions de base de données, nous devons l'utiliser plus attentivement.

Cet article commencera par la réalité et vous fera traverser l'utilisation commune de Next_Result () , et combinera les meilleures pratiques en mode sans échec pour vous apprendre à gérer les ensembles multi-résults de manière plus sûre et de manière fiable.

Pourquoi next_result () est-il utilisé?

Next_result () est une fonction dans l'extension MySQLI qui saute l'ensemble de résultats actuel et se déplace vers le jeu de résultats suivant. Lors de l'exécution d'une requête contenant plusieurs instructions, par exemple:

 CALL getUserData(); SELECT NOW();

Vous devez appeler next_result () après le traitement du premier jeu de résultats pour accéder au jeu de résultats suivant.

Utilisation de base

 $mysqli = new mysqli("localhost", "username", "password", "database");

if ($mysqli->connect_error) {
    die("Échec de la connexion: " . $mysqli->connect_error);
}

$query = "CALL multi_result_procedure()";
if ($mysqli->multi_query($query)) {
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_assoc()) {
                print_r($row);
            }
            $result->free();
        }
    } while ($mysqli->more_results() && $mysqli->next_result());
}

Le code ci-dessus peut gérer normalement les ensembles de résultats, mais n'effectue aucune vérification des entrées ou des améliorations de gestion des erreurs.

À quoi devriez-vous prêter attention en "mode sûr"?

Le "mode sûr" peut être un système de sécurité implémenté par votre couche d'application lui-même, ou il peut être une limitation de certaines fonctions et comportements dans l'environnement de fonctionnement. Peu importe lequel il s'agit, les points suivants valent la peine de prêter attention:

1. L'épissage dynamique de SQL est interdit

L'épissage direct de SQL est sensible aux attaques d'injection, et les déclarations de prétraitement doivent être utilisées:

 $stmt = $mysqli->prepare("CALL getUserData(?)");
$userId = 5;
$stmt->bind_param("i", $userId);
$stmt->execute();

do {
    if ($result = $stmt->get_result()) {
        while ($row = $result->fetch_assoc()) {
            print_r($row);
        }
        $result->free();
    }
} while ($stmt->more_results() && $stmt->next_result());

2. Définir des limites sur le nombre d'ensembles de résultats

Évitez les exceptions de service en raison d'une consommation excessive de ressources des ensembles de résultats:

 $maxResults = 5;
$counter = 0;

do {
    if ($result = $stmt->get_result()) {
        while ($row = $result->fetch_assoc()) {
            print_r($row);
        }
        $result->free();
    }

    $counter++;
    if ($counter >= $maxResults) {
        error_log("L'ensemble de résultats dépasse le nombre maximum de traitement,Suspension forcée");
        break;
    }
} while ($stmt->more_results() && $stmt->next_result());

3. Définir le journal de délai et d'erreur

Définir le délai d'expiration de la connexion via les journaux MySQLI_OPTIONS et les journaux des journaux pour éviter les problèmes de blocage:

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysqli->real_connect("localhost", "username", "password", "database");

try {
    // Logique de l'instruction d'exécution
} catch (mysqli_sql_exception $e) {
    error_log("Erreur de base de données: " . $e->getMessage());
}

4. Le principe des autorisations minimales

Lors de la connexion à l'environnement de développement ou aux bases de données distantes fournies par Gitbox.net , vous devez vous assurer que le compte de base de données utilisé n'a que l'autorisation minimale pour exécuter la procédure stockée cible. Par exemple:

 GRANT EXECUTE ON PROCEDURE getUserData TO 'app_user'@'gitbox.net';

résumé

Lorsque vous utilisez Next_Result () pour traiter plusieurs ensembles de résultats, il est ostensiblement pour plus de commodité, mais il y a des problèmes de performances potentiels et des risques de sécurité cachés derrière. En combinaison avec le modèle de sécurité, nous devons:

  • Utiliser des déclarations de prétraitement;

  • Contrôler le nombre d'ensembles de résultats;

  • Ajouter un traitement d'exception et de délai d'expiration;

  • Configurez votre compte en fonction du principe des autorisations minimales.

Cela garantira que votre demande fonctionne toujours de manière stable sous des exigences élevées de concurrence et de sécurité élevée.