Lorsque vous utilisez PHP pour le développement de la base de données, Pdostatement :: fetchObject () est une méthode très pratique. Il peut dire directement les résultats de la requête dans un objet pour un traitement ultérieur facile. Cependant, nous rencontrons parfois la situation où FetchObject () renvoie un objet faux ou vide. Cet article analysera en détail les causes courantes de ce problème et les solutions correspondantes.
Si l'instruction SQL exécutée ne correspond à aucun enregistrement, alors naturel fetchObject () renvoie false . C'est l'une des raisons les plus courantes et les plus faciles à ignorer.
Exemple de code:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT * FROM users WHERE id = 999'); // Hypothèses ID 999 N'existe pas
$obj = $stmt->fetchObject();
if (!$obj) {
echo "Données introuvables";
}
?>
Solution:
Pour confirmer si la requête SQL peut renvoyer correctement les données, vous pouvez ajouter des journaux au programme ou tester directement l'instruction de requête avec un client de base de données (comme PhpMyAdmin ).
Si l'instruction de requête elle-même a des erreurs de syntaxe ou des exceptions de base de données, Query () peut retourner faux et les appels fetchObject () ultérieurs ne réussiront naturellement pas.
Exemple de code:
<?php
$stmt = $pdo->query('SELECT FROM users'); // Champs manquants,SQLerreur
if ($stmt === false) {
echo "SQLL'exécution a échoué";
}
?>
Solution:
Vérifiez toujours la valeur de retour après query () ou préparez () et utilisez PDO :: errorInfo () pour afficher des informations d'erreur spécifiques.
Si le nom de la colonne de la requête est mal écrit, bien que SQL puisse s'exécuter normalement, les données récupérées sont incorrectes, ce qui entraîne le fait que FetchObject () ne remplit pas l'objet.
Exemple de code:
<?php
$stmt = $pdo->query('SELECT id, username FROM users');
$obj = $stmt->fetchObject();
echo $obj->email; // Avis:email字段N'existe pas
?>
Solution:
Assurez-vous que l'instruction de requête contient tous les champs dont vous avez besoin et que les noms de champ sont corrects.
fetchObject () mappe les données de ligne dans un objet STDClass par défaut. Si votre code ou votre logique nécessite une carte de classe spécifique et oublie de spécifier le nom de classe, l'objet récupéré sera inutilisable.
Exemple de code:
<?php
class User {
public $id;
public $username;
}
$stmt = $pdo->query('SELECT id, username FROM users');
$obj = $stmt->fetchObject('User');
?>
Si la classe utilisateur n'existe pas ou si le constructeur a des exigences de paramètres complexes, FetchObject () peut également échouer.
Solution:
Assurez-vous que la classe spécifiée existe.
Si la classe a des paramètres de constructeur, vous pouvez transmettre le tableau de paramètres à FetchObject .
Gardez le constructeur de la classe aussi simple que possible, ou implémentez un constructeur sans paramètre.
Chaque fois que FetchObject () est appelé, le pointeur interne déplacera une ligne vers l'avant. Si vous l'appelez accidentellement plusieurs fois, il est susceptible de revenir vide après la deuxième fois.
Exemple de code:
<?php
$obj1 = $stmt->fetchObject();
$obj2 = $stmt->fetchObject(); // S'il n'y a qu'une seule rangée de données,C'est false
?>
Solution:
Utilisez des boucles pour traiter plusieurs lignes de données.
Ne l'appelez plus accidentellement après l'avoir appelé une fois.
Avant d'interroger, assurez-vous que SQL est correct et que le nom du champ est exact.
Après la requête, vérifiez si $ stmt est faux .
Après avoir appelé fetchObject () , déterminez si la valeur de retour est fausse .
Si vous souhaitez cartographier une classe personnalisée, assurez-vous que la structure des classes répond aux exigences.
Les données multi-rangs sont traitées à l'aide de la boucle while ($ obj = $ stmt-> fetchObject ()) .
Grâce aux étapes d'inspection ci-dessus, vous pouvez rapidement localiser la vraie raison pour laquelle FetchObject () revient vide, en évitant le temps perdu par enquête aveugle.