En PHP, la fonction sérialisée est un moyen courant de convertir les variables PHP en chaînes, en particulier pour stocker des données complexes (telles que des tableaux, des objets) en bases de données ou en fichiers. Cependant, s'il n'est pas prêté attention pendant le stockage ou la récupération, la corruption des données ou l'incohérence peuvent en résulter. Cet article expliquera comment utiliser la fonction de sérialisation de PHP pour stocker correctement les données dans la base de données et éviter d'éventuels problèmes de corruption.
La fonction sérialisée convertit les variables PHP en formats de chaîne qui peuvent être stockés et transférés. Lorsque vous devez stocker un tableau ou un objet dans une base de données, la fonction de sérialisation de PHP est très utile car elle peut convertir ces données complexes en chaînes simples. Vous pouvez enregistrer cette chaîne dans un champ dans la base de données, puis utiliser la fonction Unserialize pour la restaurer sur le tableau ou l'objet d'origine plus tard.
Par exemple, supposons que vous ayez un tableau:
$data = array("name" => "Alice", "age" => 30, "city" => "New York");
Utilisez la fonction Serialize pour la convertir en une chaîne:
$serializedData = serialize($data);
echo $serializedData;
La sortie sera une représentation de chaîne, similaire à:
a:3:{s:4:"name";s:5:"Alice";s:3:"age";i:30;s:4:"city";s:8:"New York";}
Après avoir utilisé la fonction Serialize pour convertir les données en une chaîne, vous pouvez la stocker dans la base de données. Supposons que vous ayez une table de base de données simple appelée utilisateurs qui contient un champ de préférences pour stocker les préférences des utilisateurs. Vous pouvez utiliser la fonction Serialize pour convertir les données du tableau en chaînes et les insérer dans la base de données.
// Supposons que vous vous soyez connecté à la base de données
$data = array("theme" => "dark", "language" => "en");
$serializedData = serialize($data);
// Insérer des données à l'aide de la requête de base de données
$sql = "INSERT INTO users (preferences) VALUES (:preferences)";
$stmt = $pdo->prepare($sql);
$stmt->execute(['preferences' => $serializedData]);
Dans cet exemple, les préférences de l'utilisateur sont stockées dans le champ Préférences de la base de données en tant que chaîne sérialisée.
Lorsque vous récupérez des données sérialisées stockées à partir de la base de données, utilisez la fonction non sérialisée pour la restaurer au type de données PHP d'origine. Supposons que vous souhaitiez obtenir les préférences de l'utilisateur et la restaurer dans un tableau:
// Récupérer les chaînes sérialisées de la base de données
$sql = "SELECT preferences FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute(['id' => 1]);
$row = $stmt->fetch();
// utiliser unserialize Restaurer les données
$preferences = unserialize($row['preferences']);
print_r($preferences);
Pour le moment, $ Préférences sera un tableau associatif:
Array
(
[theme] => dark
[language] => en
)
Lorsque vous utilisez des fonctions de sérialisation et de non-série , vous devez faire particulièrement attention aux risques potentiels, en particulier lorsque les données sont récupérées de la base de données:
Assurez-vous que les jeux de caractères des bases de données et des tables sont correctement définis, et les jeux de caractères UTF-8 sont généralement utilisés pour éviter les problèmes d'encodage de caractères. Sinon, la chaîne sérialisée peut entraîner une corruption des données en raison d'un codage de caractères incohérent.
Lorsque vous effectuez des opérations de base de données, n'intégrez jamais directement les données saisies par l'utilisateur dans les requêtes SQL. Utilisez toujours des instructions préparées pour éviter les attaques d'injection SQL.
Lorsque vous utilisez la fonction non sérialisée , vous pouvez rencontrer une défaillance de désérialisation. Pour le moment, vous pouvez utiliser l'opérateur @ pour supprimer les erreurs et vérifier si le résultat de désérialisation est faux et prendre les mesures de traitement des erreurs appropriées.
$preferences = @unserialize($row['preferences']);
if ($preferences === false) {
// La désérialisation a échoué,Gestion des erreurs
echo "Failed to unserialize data.";
}
Bien que la fonction sérialize soit très puissante, dans certains cas, vous pouvez également envisager d'utiliser les fonctions JSON_ENCODOCE et JSON_DECODE . Le format JSON est généralement plus facile à interagir avec d'autres langues et plates-formes et ne s'appuie pas sur des mécanismes de sérialisation spécifiques au PHP lorsqu'il est traité.
// utiliser json_encode et json_decode
$data = array("theme" => "dark", "language" => "en");
$jsonData = json_encode($data);
// Stocker à la base de données
$sql = "INSERT INTO users (preferences) VALUES (:preferences)";
$stmt = $pdo->prepare($sql);
$stmt->execute(['preferences' => $jsonData]);
// Récupérer et restaurer à partir de la base de données
$sql = "SELECT preferences FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute(['id' => 1]);
$row = $stmt->fetch();
$preferences = json_decode($row['preferences'], true);
print_r($preferences);
JSON a une compatibilité plus large que le sérialisation , en particulier lorsque l'échange de données avec des systèmes externes est nécessaire.
Résumer
L'utilisation de la fonction de sérialisation de PHP peut facilement stocker des données complexes dans une base de données, mais lorsque vous fonctionnez réellement, vous devez toujours faire attention pour empêcher la corruption des données. Assurez-vous l'exactitude du jeu de caractères, utilisez des instructions de prétraitement pour empêcher l'injection SQL et gérez les erreurs de désérialisation. Envisagez également d'utiliser JSON_ENCODE et JSON_DECODE comme alternatives à la sérialisation, en particulier lorsque vous interagissez avec d'autres langages ou plates-formes.