Position actuelle: Accueil> Derniers articles> Que se passe-t-il si vous oubliez d'appeler préparez () après avoir utilisé STMT_INIT?

Que se passe-t-il si vous oubliez d'appeler préparez () après avoir utilisé STMT_INIT?

M66 2025-05-29

Les instructions de prétraitement sont une pratique courante et sûre lors de l'utilisation de l'extension MySQLI de PHP pour les opérations de base de données. Les développeurs utilisent généralement MySQLI :: STMT_INIT () pour initialiser un objet d'instruction, puis préparer des instructions SQL via la méthode Pread () . Cependant, si vous oubliez d'exécuter Préparer () après avoir appelé stmt_init () , cela entraînera des problèmes implicites. Cet article analysera et donnera des exemples.

1. Utilisation de base de stmt_init () et prépare ()

Habituellement, notre structure de code est comme ceci:

 $mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->stmt_init();
$stmt->prepare("SELECT * FROM users WHERE id = ?");

dans:

  • stmt_init () initialise un objet mysqli_stmt ;

  • Prépare () prépare une instruction SQL et la lie à l'objet.

2. Que se passe-t-il si vous oubliez d'appeler préparez () ?

Si vous appelez uniquement STMT_INIT () et ne préparez pas () , les types de problèmes suivants se produiront lorsque le programme utilise l'objet de déclaration dans l'utilisation ultérieure de l'énoncé suivant:

1. Erreur d'appel de la méthode

Les méthodes d'appel telles que bind_param () , exécuter () directement sans appeler prépare () entraîneront des avertissements à lancer ou même des erreurs mortelles:

 $mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->stmt_init();
// Oublié d'appeler prepare()

$stmt->bind_param("i", $userId); // Une erreur sera signalée ici
$stmt->execute();                // Il échouera ici aussi

Le message d'erreur peut être:

 Fatal error: Uncaught Error: Call to a member function bind_param() on bool

ou:

 Warning: mysqli_stmt::bind_param(): invalid object or not initialized

2. Impossible de trouver des erreurs de syntaxe

Si vous avez simplement initialisé l'objet de déclaration mais que vous n'avez pas de préparation () , alors les erreurs SQL qui auraient pu être trouvées dans l'étape Pread () seront masquées et ne peuvent pas conduire à des erreurs peu claires avant l'exécution. Cela augmente les coûts de débogage.

3. Risques de sécurité

J'ai oublié d'utiliser PREPET () signifie que vous pouvez épisser directement les instructions SQL, ce qui contournera le mécanisme de liaison des paramètres, augmentant ainsi le risque d'injection SQL. Par exemple:

 // Exemple d'erreur(Non prepare)
$userId = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $userId";
$result = $mysqli->query($query);

Si Prépare () et la liaison des paramètres ne sont pas disponibles, l'entrée de l'utilisateur sera directement intégrée dans SQL et l'attaquant peut construire l'URL suivante:

 https://m66.net/get_user.php?id=1 OR 1=1

Provoquera des violations de données.

3. La bonne façon de le faire

Associez toujours à l'aide de stmt_init () et préparez-vous comme suit:

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

$stmt = $mysqli->stmt_init();
if ($stmt->prepare("SELECT * FROM users WHERE id = ?")) {
    $stmt->bind_param("i", $userId);
    $stmt->execute();
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        echo $row['username'] . "<br>";
    }
    $stmt->close();
} else {
    echo "SQL prepare erreur: " . $mysqli->error;
}

4. Résumé

Oublié d'appeler prépare () causera les problèmes suivants:

  • Une erreur s'est produite lors de l'appel d'autres méthodes de déclaration;

  • Les erreurs SQL ne peuvent pas être capturées à l'avance;

  • Augmenter les risques de sécurité tels que l'injection SQL.

Il est recommandé d'appeler Prepare () immédiatement après avoir utilisé STMT_INIT () et juger sa valeur de retour pour assurer la stabilité et la sécurité du programme.