enregistrer tableau dans bdd [PHP/Mysql] - PHP - Programmation
Marsh Posté le 04-01-2004 à 01:59:28
serializer le tableau puis l'insérer dans la bd suffit pas ?
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 ?
Marsh Posté le 04-01-2004 à 02:13:02
Non, je pensais plutôt à un
Code :
|
C'est d'ailleurs la méthode donnée en exemple dans la doc
//edit :
et ça se récupère avec unserialize
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
Marsh Posté le 10-01-2004 à 20:34:22
BaDaBoOm a écrit : bon en fait ca marche pas il me répond : |
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 ?
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
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
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 :
|
il me met bien ce que je veux c'est à dire un truc du style :
Code :
|
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
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 :
|
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 ), 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
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
Marsh Posté le 11-01-2004 à 12:43:24
voici le code ke j'utilise :
Code :
|
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 ! ! !
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 , j'ai cherché du côté des fonctions traitant des tableaux, et aucun lien pointant vers serialize.
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 , 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
2- Serialize n'est pas limité aux tableaux. Ca marche aussi avec les dates, les instances d'objets, bref tout
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 ?
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.
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+
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 ).
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)
Marsh Posté le 17-01-2004 à 18:26:13
naceroth : Déjà dit tout çà...
Mais last_insert_id() ne fonctionne pas dans son cas
Marsh Posté le 18-01-2004 à 01:36:22
naceroth a écrit : La tienne non plus hein, tu expliques même pourquoi |
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
Bon, de toute façon, BaDaBoOm à trouvé la solution.
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 (voir interbase et oracle si ma mémoire est bonne)
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?
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
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
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