[PHP/Mysql] enregistrer tableau dans bdd

enregistrer tableau dans bdd [PHP/Mysql] - PHP - Programmation

Marsh Posté le 04-01-2004 à 01:49:33    

bonjour je souhaiterais enregistrer le contenu d'un tableau à 4 dimensions dans une case d'une base de données comme si l'on enregistrait une variable quelconque en fait.
 
merci d'avance


Message édité par BaDaBoOm le 04-01-2004 à 01:49:51
Reply

Marsh Posté le 04-01-2004 à 01:49:33   

Reply

Marsh Posté le 04-01-2004 à 01:59:28    

serializer le tableau puis l'insérer dans la bd suffit pas ?

Reply

Marsh Posté le 04-01-2004 à 02:07:07    

g fait un print_r($tab,true); mais ya pas plus propre ?
 
et comment je le récupère ?

Reply

Marsh Posté le 04-01-2004 à 02:13:02    

Non, je pensais plutôt à un
 

Code :
  1. $sqlTab = serialize($tab);


 
C'est d'ailleurs la méthode donnée en exemple dans la doc :)
 
//edit :
 
et ça se récupère avec unserialize :)


Message édité par naceroth le 04-01-2004 à 02:13:34
Reply

Marsh Posté le 04-01-2004 à 13:47:51    

ok merci je vais faire comme ca

Reply

Marsh Posté le 10-01-2004 à 19:43:28    

bon en fait ca marche pas il me répond :  
Notice: unserialize(): Argument is not an string in c:\compta\data_devis.inc.php on line 24
 
 
 
 

Reply

Marsh Posté le 10-01-2004 à 20:34:22    

BaDaBoOm a écrit :

bon en fait ca marche pas il me répond :  
Notice: unserialize(): Argument is not an string in c:\compta\data_devis.inc.php on line 24


 
Vu le message d'erreur, j'ai la très nette impression que lire la doc de l'instruction unserialize n'a pas été la première chose que tu as fait avant le "bon, en fait ça marche pas", je me trompe ? :D
 
Serialize s'utilise pour linéariser ton tableau en une chaine de caractères que tu pourras insérer dans la db.
Unserialize c'est l'inverse, c'est la chaine insérée dans la db que tu vas reconvertir en tableau

Reply

Marsh Posté le 11-01-2004 à 01:12:11    

j'ai bien compris mais en fait je serialize mon tableau multidimensionnelle et en suite je l'insère dans la bdd.
 
pour le sortir je reprend mon tableau et je unserialize
 
par ex : $tab=unserialize($da['tab']);
 
ensuite j'ai ce message d'erreur

Reply

Marsh Posté le 11-01-2004 à 01:18:08    

a mon avis serialize doit pas etre la bonne commande puisqu'il me met dans ma bdd : a:1:{i:1;a:1:{i:10;a:1:{s:0:"";s:0:"";}}}
 
alors qu'avec mon 1er bidouillage :

Code :
  1. print_r($tab,true);

il me met bien ce que je veux c'est à dire un truc du style :

Code :
  1. Array
  2. (
  3.     [2] => Array
  4.         (
  5.             [10] => Array
  6.                 (
  7.                     [] =>
  8.                 )
  9.         )
  10. )


Message édité par BaDaBoOm le 11-01-2004 à 01:19:33
Reply

Marsh Posté le 11-01-2004 à 02:35:17    

BaDaBoOm a écrit :

a mon avis serialize doit pas etre la bonne commande puisqu'il me met dans ma bdd : a:1:{i:1;a:1:{i:10;a:1:{s:0:"";s:0:"";}}}


 
c'est ce qu'on appelle linéariser :D
 
indice : le a est l'abréviation de array, le s de string, le i de integer, les chiffres indiquant soit la longueur soit la valeur.
 
Bref, comme je sent que tu es un grand septique, qu'il ne sert à rien que je te dise que tout le monde s'en sert depuis longtemps sans problème, je t'ai même pondu un code pour te le prouver :

Code :
  1. $data = array(2 => array(10 => array()));
  2. //Insertion dans la db
  3. mysql_connect('localhost','...','...');
  4. mysql_select_db('...');
  5. mysql_query("insert into ... values('".serialize($data)."')" );
  6. //Destruction de la variable $data
  7. unset($data);
  8. //Lecture du contenu de la db
  9. $res = mysql_query('select serial from ...');
  10. $element = mysql_fetch_array($res);
  11. $data = unserialize($element['serial']);
  12. //Affichage du résultat
  13. print_r($data);


 
comme tu le vois, je crée une variable telle que celle que tu me donnes, je l'insère dans une db, je détruis la variable (on est jamais assez sûr :D), je la récupère et l'affiche. Je te laisse vérifier que le contenu de $data à la fin est bien le même qu'au début.
 
Une petite remarque quand même, on sait jamais : la fonction serialize renvoit une chaine de caractère, donc pense à la protéger avant de l'envoyer dans un mysql_query si elle comprend des caractères à risque

Reply

Marsh Posté le 11-01-2004 à 02:35:17   

Reply

Marsh Posté le 11-01-2004 à 12:32:51    

lol désolé pour le dérangement en fait ca marche parfaitement, c'est juste qu'il ne regardait pas a la bonne case du tableau.
 
Il me reste donc tjrs un prob :  
pour avoir la dernière valeur autoincrement du tableau je faisais ca :
 
$iddevis=mysql_insert_id()
 
il me renvoi tjrs 0
 
le dernier enregistrement est effectué sur la page precedente


Message édité par BaDaBoOm le 11-01-2004 à 12:33:58
Reply

Marsh Posté le 11-01-2004 à 12:43:24    

voici le code ke j'utilise :

Code :
  1. include("connect.inc.php" );
  2. $iddevis=mysql_insert_id();
  3. mysql_close();

Reply

Marsh Posté le 11-01-2004 à 16:20:51    

Citation :

mysql_insert_id() retourne le dernier identifiant généré par un champ de type AUTO_INCREMENT, sur la connexion MySQL courante, ou bien sûr la connexion spécifiée par link_identifier. Si link_identifier est omis, la dernière connexion ouverte est utilisée.


 
! ! ! Il faut utiliser la même connexion que celle utilisée pour l'insert ! ! !


Message édité par Mara's dad le 11-01-2004 à 16:21:50

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 11-01-2004 à 17:00:11    

Dire que je me suis fais ch... à construire à la main une fonction équivalente à serialize, car je ne savais pas qu'elle existait... Elle est mal foutue la doc aussi  :o , j'ai cherché du côté des fonctions traitant des tableaux, et aucun lien pointant vers serialize.


Message édité par Evolvox le 11-01-2004 à 17:00:32

---------------
gaymer's est la personne la plus formidable jamais rencontrée dans toute ma vie, je lui achèterais un makato et au moins les 4 news pourries quotidiennes qui vont avec
Reply

Marsh Posté le 14-01-2004 à 09:50:57    

Evolvox a écrit :

Dire que je me suis fais ch... à construire à la main une fonction équivalente à serialize, car je ne savais pas qu'elle existait... Elle est mal foutue la doc aussi  :o , j'ai cherché du côté des fonctions traitant des tableaux, et aucun lien pointant vers serialize.


1- Y fait quoi içi ton post ? Heu, j'ai rien dit :whistle:  
2- Serialize n'est pas limité aux tableaux. Ca marche aussi avec les dates, les instances d'objets, bref tout :D


Message édité par Mara's dad le 14-01-2004 à 09:51:26

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 17-01-2004 à 15:52:54    

ok je savais pas qu'il fallait utiliser la même connection, ya t'il une autre méthode(ou fonction) pour récupérer le dernier increment d'une table sans utiliser forcement la meme connection ?

Reply

Marsh Posté le 17-01-2004 à 16:01:23    

select max(id) from...
 
Mais tu ne pouras jamais être certain que c'est bien TON enreg et pas celui d'un autre arrivé juste arpès le tiens.
 
Ce qu'il faut faire, c'est récupérer l'ID juste après l'insertion et le transmettre à ce qui en a besoin.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 17-01-2004 à 16:04:03    

ok merci pour le truc, tu as raison je vais plutot le stocker dans une $var de session, qui, si elle existe sera alors utilisée.
 
encore merci pour ton aide rapide  
a+

Reply

Marsh Posté le 17-01-2004 à 16:51:03    

mara's dad a écrit :

select max(id) from...


 
Jamais cette solution là, elle ne fonctionne que parce que mysql incrémente bien les id, mais quid du jour où il les gèrera n'importe comment (à la manière d'access par exemple :D).
 
Il y a une solution plus simple :
 
La fonction propre à php : mysql_insert_id qui te retourne l'auto incrément du dernier insert effectué par la connexion courante
Elle se sert de la fonction propre à mysql (oui ça existe aussi :)) last_insert_id() et est propre à chaque connexion (pas modifiable par un autre client donc)

Reply

Marsh Posté le 17-01-2004 à 18:26:13    

naceroth : Déjà dit tout çà...
Mais last_insert_id() ne fonctionne pas dans son cas :D


Message édité par Mara's dad le 17-01-2004 à 18:26:56

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 17-01-2004 à 18:55:18    

La tienne non plus hein, tu expliques même pourquoi :D

Reply

Marsh Posté le 18-01-2004 à 01:36:22    

naceroth a écrit :

La tienne non plus hein, tu expliques même pourquoi :D


Hein ?
C'est quoi çà :

Citation :

Mais tu ne pouras jamais être certain que c'est bien TON enreg et pas celui d'un autre arrivé juste après le tiens.


 
Et cette solution fonctionne. C'est même quasiement la seule utilisable dans par une suite de traitements Batch à condition d'être certain d'être le seul utilisateur. Ce qui est le cas en général quand on lance des batchs.
 
Rmp : AUTO_INCREMENT, çà veux dire quoi à ton avis ?
Tu pense vraiement qu'un jour un fou va décider que çà veux dire aléatoire !
Y'a que chez Kro$oft qu'on voit des trucs pareil :lol:
 
Bon, de toute façon, BaDaBoOm à trouvé la solution.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 18-01-2004 à 02:46:29    

Ca me scie ça, tu dis toi même qu'il ne peut être certain que ce soit bien son enregistrement, et tu vois toujours pas pourquoi le max() est pas sûr ?
 
remarque à ta remarque : imaginons un sgbd plus poussé que mysql qui se dit un beau matin qu'il pourrait être intelligent de ne pas avoir un passage d'un id de 1 à 3 parce qu'on a supprimé le 2...Donc, j'ajoute un enregistrement, et hop id=2 pour combler le trou. Utopique, folie ou krosofterie ? Oui peut être mais par définition toute probabilité non nulle arrivera un jour :)
 
//j'édite juste pour signaler que certains sgbd n'ont pas d'auto incrément, le système est un peu caduque :D (voir interbase et oracle si ma mémoire est bonne)


Message édité par naceroth le 18-01-2004 à 02:48:20
Reply

Marsh Posté le 25-02-2004 à 11:52:01    

Bonjour,
Je n'arrive pas a faire marcher AUTO_INCREMENT sur interbase et je crois avoir la bonne syntaxe, quelqu'un pourrait m'éclairer sur ce point svp?

Reply

Marsh Posté le 25-02-2004 à 19:27:13    

Y a pas d'auto incrément sous interbase pour autant (au temps|OTAN) que je m'en souvienne :)

Reply

Marsh Posté le 26-02-2004 à 22:38:41    

Oui, donc, après vérif (à moins que sur les nouvelles versions, mais j'y crois pas), il n'y a pas de type autoincrément, identifiant automatique ou autre pour interbase.
 
Il faut passer par des generator et les triggers :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed