Pendant le développement de PHP, nous rencontrons souvent cette situation: à l'aide de mysqli_connect () ou de l'OPD pour connecter avec succès à la base de données, mais de rencontrer des erreurs lors de l'exécution de requêtes SQL, telles que le renvoi de faux, aucun résultat et même des accidents de programme. Ce problème peut sembler un problème avec les connexions de la base de données à première vue, mais la cause peut être très compliquée en réalité. Cet article vous amènera à analyser les causes possibles de ce phénomène un par un et à fournir des solutions correspondantes.
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_error) {
die("Échec de la connexion: " . $mysqli->connect_error);
}
echo "Connexion avec succès";
Même si le code ci-dessus sortira avec succès "Connection réussie", cela ne signifie pas que vos opérations de requête ultérieures ne se tromperont certainement pas. La connexion réussie de la base de données est seulement un canal de communication est établi, mais si ce canal peut gérer normalement les opérations SQL spécifiques est affectée par de nombreux autres facteurs.
L'une des raisons les plus courantes est que SQL est mal écrit. Même si une citation est manquante et que le nom du champ est incorrectement orthographié, il entraînera l'échec de la requête.
$sql = "SELEC * FROM users"; // Mauvais mots clés SELEC
$result = $mysqli->query($sql);
if (!$result) {
echo "La requête a échoué: " . $mysqli->error;
}
Solution : Sortie $ mysqli-> Erreur pour afficher les détails d'erreur et vérifier attentivement si l'instruction SQL est correctement orthographiée.
Même si la connexion est réussie, l'utilisateur peut ne pas avoir la permission d'effectuer des opérations spécifiques, comme la lecture d'une certaine table, l'insertion de données, etc.
// Si l'utilisateur n'a pas de table SELECT Autorisation
$sql = "SELECT * FROM admin_logs";
$result = $mysqli->query($sql);
if (!$result) {
echo "Autorisation问题: " . $mysqli->error;
}
Solution : vérifiez les autorisations de l'utilisateur de la base de données et utilisez la commande suivante pour afficher:
SHOW GRANTS FOR 'user'@'localhost';
Si nécessaire, contactez le DBA pour activer l'autorisation.
Si la base de données connectée existe, mais tente d'accéder à un tableau qui n'existe pas, il entraînera également l'échec de la requête.
$sql = "SELECT * FROM nonexistent_table";
$result = $mysqli->query($sql);
Solution : Pour confirmer si le tableau existe, vous pouvez utiliser l'énoncé suivant:
SHOW TABLES LIKE 'nonexistent_table';
Les paramètres de jeux de caractères inappropriés peuvent entraîner l'insertion de caractères chinois ou spéciaux et même de demander des exceptions.
$mysqli->set_charset("utf8mb4"); // Assurez-vous d'utiliser le bon jeu de caractères
Solution : Gardez le client, la connexion et la base de données cohérentes lors du définition du jeu de caractères.
Lorsque vous utilisez des instructions de prétraitement, si les paramètres ne sont pas liés correctement, une défaillance de l'exécution se produira:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("s", $id); // Type de données incorrect ou paramètre non attribué
$id = 123;
$stmt->execute();
Solution : assurez-vous que la variable est correctement initialisée avant de lier les paramètres et que le type de données correspond.
Certaines requêtes s'exécutent trop longtemps et peuvent être automatiquement interrompues ou chronométrées par le serveur de base de données.
Solution : Optimisez les instructions SQL pour vérifier si les index sont utilisés et évitez les opérations de blocage à long terme.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Ce paramètre lance une exception lorsqu'une erreur se produit, ce qui facilite le suivi des problèmes.
file_put_contents("log.txt", $mysqli->error . "\n", FILE_APPEND);
Enregistrez chaque erreur pour faciliter l'analyse de la fréquence et des règles.
Si votre requête contient une demande d'URL, par exemple, appelez une interface distante:
$url = "https://api.m66.net/getData.php";
$data = file_get_contents($url);
Assurez-vous que l'URL est accessible, le contenu de retour est correct et non une redirection ou une erreur 403.
Bien que la connexion réussie () indique que la connexion de la base de données est normale, la "connexion normale" ne signifie pas "fonctionnement réussi". La cause profonde de la défaillance de la requête est souvent les autorisations, la syntaxe, la structure de la table, le jeu de caractères ou les problèmes de paramètres. En vérifiant systématiquement les informations d'erreur, en activant les rapports d'erreur, en optimisant la logique de requête et la configuration d'autorisation, la plupart des problèmes de défaillance de la requête peuvent être résolus efficacement.
Il est important de se rappeler: la connexion n'est que le point de départ, et la question est la clé.