Il n'y a pas de bonne façon de stocker un tableau dans un seul champ.
Vous devez examiner vos données relationnelles et apporter les modifications appropriées à votre schéma. Voir l'exemple ci-dessous pour une référence à cette approche.
Si vous devez enregistrer le tableau dans un seul champ, les fonctions serialize()
et unserialize()
feront l'affaire. Mais vous ne pouvez pas effectuer de requêtes sur le contenu réel.
Comme alternative à la fonction de sérialisation, il existe également json_encode()
et json_decode()
.
Considérez le tableau suivant
$a = array(
1 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
2 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
);
Pour l'enregistrer dans la base de données, vous devez créer une table comme celle-ci
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
$r = mysql_query(
'DROP TABLE IF EXISTS test');
$r = mysql_query(
'CREATE TABLE test (
id INTEGER UNSIGNED NOT NULL,
a INTEGER UNSIGNED NOT NULL,
b INTEGER UNSIGNED NOT NULL,
c INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (id)
)');
Pour travailler avec les enregistrements, vous pouvez effectuer des requêtes comme celles-ci (et oui, c'est un exemple, méfiez-vous!)
function getTest() {
$ret = array();
$c = connect();
$query = 'SELECT * FROM test';
$r = mysql_query($query,$c);
while ($o = mysql_fetch_array($r,MYSQL_ASSOC)) {
$ret[array_shift($o)] = $o;
}
mysql_close($c);
return $ret;
}
function putTest($t) {
$c = connect();
foreach ($t as $k => $v) {
$query = "INSERT INTO test (id,".
implode(',',array_keys($v)).
") VALUES ($k,".
implode(',',$v).
")";
$r = mysql_query($query,$c);
}
mysql_close($c);
}
putTest($a);
$b = getTest();
La connect()
fonction renvoie une ressource de connexion mysql
function connect() {
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
return $c;
}
Utilisez simplement la fonction de sérialisation de PHP:
Cependant, si vous utilisez des tableaux simples comme celui-ci, vous pouvez aussi bien utiliser imploser et exploser.Utilisez un tableau vide au lieu de nouveau.
la source
Sérialiser / désérialiser la baie pour le stockage dans une base de données
Visitez http://php.net/manual/en/function.serialize.php
À partir du manuel PHP:
Regardez sous "Retour" sur la page
Renvoie une chaîne contenant une représentation par flux d'octets de la valeur qui peut être stockée n'importe où.
Notez qu'il s'agit d'une chaîne binaire qui peut inclure des octets nuls, et doit être stockée et gérée comme telle. Par exemple, la sortie serialize () doit généralement être stockée dans un champ BLOB d'une base de données, plutôt que dans un champ CHAR ou TEXT.
Remarque: si vous souhaitez stocker du code HTML dans un objet blob, assurez-vous de l'encoder en base64 ou cela pourrait interrompre la fonction de sérialisation.
Exemple d'encodage:
$YourSerializedData
est maintenant prêt à être stocké dans le blob.Après avoir récupéré les données de blob, vous devez base64_decode puis désérialiser Exemple de décodage:
la source
Le meilleur moyen que je me suis trouvé est de sauvegarder le tableau sous forme de chaîne de données avec des caractères de séparation
Vous pouvez ensuite rechercher des données, stockées dans votre tableau avec une simple requête
utiliser la fonction explode () pour convertir la chaîne "array_data" en tableau
notez que cela ne fonctionne pas avec des tableaux multidimensionnels et assurez-vous que votre "array_separator" est unique et n'existait pas dans les valeurs de tableau.
Faites attention !!! si vous prenez juste des données de formulaire et les mettez dans la base de données, vous serez dans le piège, car les données du formulaire ne sont pas sécurisées pour SQL! vous devez gérer la valeur de votre formulaire avec mysql_real_escape_string ou si vous utilisez MySQLi mysqli :: real_escape_string ou si la valeur est un entier ou un booléen cast (int) (booléen) sur eux
la source
La sérialisation et la désérialisation sont assez courantes pour cela. Vous pouvez également utiliser JSON via json_encode et json_decode pour un format moins spécifique à PHP.
la source
Comme mentionné précédemment - Si vous n'avez pas besoin de rechercher des données dans le tableau, vous pouvez utiliser serialize - mais c'est "php seulement". Je recommanderais donc d'utiliser json_decode / json_encode - non seulement pour les performances, mais également pour la lisibilité et la portabilité (d'autres langages tels que javascript peuvent gérer les données json_encoded).
la source
Euh, je ne sais pas pourquoi tout le monde suggère de sérialiser le tableau.
Je dis que le meilleur moyen est de l'intégrer dans votre schéma de base de données. Je n'ai aucune idée (et vous n'avez donné aucun indice) sur la signification sémantique réelle des données de votre tableau, mais il y a généralement deux façons de stocker des séquences comme ça
De cette façon, vous stockez votre tableau sur une seule ligne.
L'inconvénient de la première méthode est, évidemment, que si vous avez de nombreux éléments dans votre tableau, travailler avec cette table ne sera pas la chose la plus élégante. Il est également peu pratique (possible, mais tout à fait inélégant - il suffit de rendre les colonnes nullables) de travailler avec des séquences de longueur variable.
Pour la deuxième méthode, vous pouvez avoir des séquences de n'importe quelle longueur, mais d'un seul type. Vous pouvez, bien sûr, faire en sorte que ce type soit varchar ou quelque chose et sérialiser les éléments de votre tableau. Ce n'est pas la meilleure chose à faire, mais certainement mieux, que de sérialiser l'ensemble de la baie, non?
Dans tous les cas, n'importe laquelle de ces méthodes a l'avantage de pouvoir accéder à un élément arbitraire de la séquence et vous n'avez pas à vous soucier de la sérialisation des tableaux et des choses laides comme ça.
Quant à le récupérer. Eh bien, obtenez la ligne / séquence de lignes appropriée avec une requête et, bien, utilisez une boucle ... non?
la source
Vous pouvez enregistrer votre tableau en tant que json.
il existe une documentation pour le type de données json: https://dev.mysql.com/doc/refman/5.7/en/json.html
Je pense que c'est la meilleure solution, et vous aidera à maintenir votre code plus lisible en évitant les fonctions folles .
J'espère que cela vous sera utile.
la source
Oui, sérialiser / désérialiser est ce que j'ai le plus vu dans de nombreux projets open source.
la source
Je suggérerais d'utiliser imploser / exploser avec un caractère dont vous savez qu'il ne sera contenu dans aucun des éléments individuels du tableau. Puis stockez-le dans SQL sous forme de chaîne.
la source
consultez la fonction implode, puisque les valeurs sont dans un tableau, vous voulez mettre les valeurs du tableau dans une requête mysql qui insère les valeurs dans une table.
Si les valeurs du tableau sont des valeurs de texte, vous devrez ajouter des guillemets
De plus, si vous ne voulez pas de valeurs en double, changez "INto" sur "IGNORE" et seules les valeurs uniques seront insérées dans la table.
la source
vous pouvez insérer un objet sérialisé (tableau) dans mysql, exemple
serialize($object)
et vous pouvez déseriser l'exemple d'objetunserialize($object)
la source
Au lieu de l'enregistrer dans la base de données, enregistrez-le dans un fichier et appelez-le plus tard.
Ce que font de nombreuses applications php (comme sugarcrm), c'est simplement utiliser var_export pour renvoyer toutes les données du tableau dans un fichier. C'est ce que j'utilise pour sauvegarder mes données de configuration:
Je pense que c'est une meilleure façon de sauvegarder vos données!
la source