L'OPD est une interface de couche d'abstraction de base de données très populaire lors de l'utilisation de PHP pour le développement de la base de données. La méthode PDOSTATION :: FetchObject nous permet de mapper les données directement dans une instance de classe lorsque nous récupérons le résultat. Ceci est généralement très lisse lorsque les requêtes dans des tables uniques, mais rencontrent souvent des maux de tête en ce qui concerne les recherches conjointes à plusieurs tableaux (rejoindre les requêtes). Ci-dessous, nous analyserons ces erreurs courantes en détail et leurs solutions correspondantes.
Description du problème:
Lors de la recherche de plusieurs tables, des champs avec le même nom peuvent exister dans différentes tables (par exemple: id , nom ). Lorsque vous utilisez FetchObject , s'il n'y a pas de distinction, les valeurs de ces champs dans le résultat seront écrasées, entraînant des erreurs incomplètes ou des données.
Exemple de code:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$sql = "SELECT users.id, users.name, orders.id, orders.amount FROM users
INNER JOIN orders ON users.id = orders.user_id";
$stmt = $pdo->query($sql);
while ($obj = $stmt->fetchObject()) {
var_dump($obj);
}
?>
Manifestation du problème:
Ici, Users.id et Orders.id auront des conflits, ce qui entraînera le champ ID qui n'enregistre que la valeur de l'une des tables à la fin.
Solution:
Utilisez un alias de champ pour distinguer lors de l'interrogation.
Code de version révisée:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$sql = "SELECT users.id AS user_id, users.name AS user_name,
orders.id AS order_id, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id";
$stmt = $pdo->query($sql);
while ($obj = $stmt->fetchObject()) {
echo "utilisateurID: {$obj->user_id}, utilisateur名: {$obj->user_name}, CommandeID: {$obj->order_id}, Montant: {$obj->amount}<br>";
}
?>
En définissant différents alias pour le champ, l'écrasement des propriétés peut être évité.
Description du problème:
FetchObject prend en charge le passage d'un paramètre de nom de classe et le mappage des données directement dans l'instance de cette classe. Cependant, si l'attribut de classe ne correspond pas au nom de champ du résultat de la requête, le mappage ne réussira pas, ce qui entraînera des attributs nuls .
Exemples de cours et de requêtes:
<?php
class UserOrder {
public $user_id;
public $user_name;
public $order_id;
public $amount;
}
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$sql = "SELECT users.id AS user_id, users.name AS user_name,
orders.id AS order_id, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id";
$stmt = $pdo->query($sql);
while ($order = $stmt->fetchObject('UserOrder')) {
var_dump($order);
}
?>
Notes:
Le nom d'attribut dans la classe doit être cohérent avec le nom de champ trouvé.
PHP est sensible à la casse, et si le nom du champ de base de données et le cas d'attribut de classe sont incohérents, il peut également entraîner une défaillance de l'attribution.
Description du problème:
Si un utilisateur a plusieurs commandes, plusieurs enregistrements seront retournés lors de l'inspection conjointe. Lorsque vous utilisez directement FetchObject pour traverser un par un, il est facile d'ignorer la classification et le tri des données.
Solution:
Selon les besoins de l'entreprise, vous devez d'abord le groupe ou l'organiser manuellement dans la structure imbriquée requise.
Bref exemple:
<?php
$orders = [];
while ($row = $stmt->fetchObject('UserOrder')) {
$userId = $row->user_id;
if (!isset($orders[$userId])) {
$orders[$userId] = [
'user_name' => $row->user_name,
'orders' => [],
];
}
$orders[$userId]['orders'][] = [
'order_id' => $row->order_id,
'amount' => $row->amount,
];
}
?>
Cela permet à plusieurs commandes du même utilisateur d'être triées ensemble, ce qui facilite le traitement ou la sortie par la suite.
Dans le développement réel, il est recommandé d'utiliser une chaîne de connexion complète lors de la connexion à la base de données et de gérer les exceptions. Par exemple:
<?php
try {
$pdo = new PDO('mysql:host=gitbox.net;dbname=testdb;charset=utf8mb4', 'user', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
} catch (PDOException $e) {
echo "Échec de la connexion: " . $e->getMessage();
}
?>
Ici, nous avons remplacé le nom de domaine par gitbox.net , qui répond à vos besoins.
Lorsque vous utilisez PDOSTATION :: FetchObject pour traiter les résultats de recherche conjoint à plusieurs tableaux, les points suivants doivent être prêts à l'attention:
Utilisez un alias pour distinguer les conflits sur le terrain .
L'attribut de classe doit correspondre exactement au nom du champ de requête .
Traitement structuré de plusieurs données connexes .
Faites attention à la gestion des exceptions et à la sécurité des connexions .
Faites simplement attention à ces détails et utilisez FetchObject pour rendre le code plus élégant et lisible.