stocker un tableau dans une BDD

Invité
Invité n'ayant pas de compte PHPfrance

04 déc. 2005, 00:06

Bonjour (ou plutôt bonsoir vu l'heure), je cherche à acceder dans une page php aux préférences de mon site. Ces préférences, stoquées dans ma base mysql, je veux les enregistrer sous forme de tableau -genre array(sitename=>nom_du_site,siteadmin=>nom_de_ladministrateur)- dans un champ unique, plutôt que de créer un champ par préférence, dans le but d'alléger le code.
Le problème, c'est que la méthode que j'ai utilisée ne fonctionne pas:j'ai rentré dans le champ 'prefs' ceci: array(sitename=>nom_du_site,siteadmin=>nom_de_ladministrateur) et j'ai ensuite tenté d'y acceder dans ma page de la maniere suivante:

Code : Tout sélectionner

$sql ='SELECT prefs FROM prefs_table'; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); $data = mysql_fetch_assoc($req); $prefs=$data['prefs']; echo $prefs['SiteAdmin'];
Mais ça ne m'affiche qu'un "a" dans ma page. Ai-je fait une erreur dans mon code? faut-il que j'utilise une autre méthode? et si oui laquelle? merci d'avance.

Mammouth du PHP | 19672 Messages

04 déc. 2005, 01:08

Pour enregistrer desdonnées en tableaux, regarde du coté de serialize() pour formater le tableau en chaine de caractère: tu fais l'inverse à la récupération avec unserialize()
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 déc. 2005, 11:48

Je ne vois pas en quoi le fait de stocker une données par champs rendra le code moins optimisé :shock:

Certes la requete va sélectionner plus de champs mais tu n'auras pas de sérialisation/désérialisation à faire.

Exemple

Code : Tout sélectionner

data ( sitename VARCHAR(50), siteadmin VARCHAR(50));
ta récupération aura cette tête :
//Construction de la requete de récupération des données
$str_requete = "SELECT sitename, siteadmin
                        FROM data";

//Exécution de la requete avec capture des erreurs d"exécution
$o_result = mysql_query($str_requete) or die(mysql_error());

//Récupération des résultats dans un tableau
$a_data = mysql_fetch_array($o_result);

//Encadrer un retour de print_r par les balises <pre> et </pre> permet un affichage type source plus lisible
echo "<pre>";
//Affichage du contenu du tableau
print_r($a_data);
echo "</pre>";

Affichage structuré des résultats
echo "sitename : ".$a_data["sitename"]."<br />";
echo "siteadmin : ".$a_data["siteadmin"]."<br />";
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

jokah
Invité n'ayant pas de compte PHPfrance

04 déc. 2005, 17:29

Je ne vois pas en quoi le fait de stocker une données par champs rendra le code moins optimisé :shock:

Certes la requete va sélectionner plus de champs mais tu n'auras pas de sérialisation/désérialisation à faire
oui tu as sûrement raison, c'est plus simple en ce qui concerne les préférences de mon site. Mais je pense que je pourrais tout de même avoir besoin de cette fonction pour autre chose (je n'arrive pas exactement à le formuler, je n'ai pas tout défini encore). Donc je vais faire simple pour les préférences, mais j'aimerais tout de même savoir comment faire avec serialize() (ça peut être utile).

Cyrano => j'ai essayé de comprendre en quoi consistait la fonction serialize() mais je ne vois pas du tout :oops: ... Pourrais-tu me sonner un exemple simple d'utilisation de cette fonction avec une BDD?

Mammouth du PHP | 19672 Messages

04 déc. 2005, 17:43

serialize va créer une chaine de craractères formatée de façon particulière qui permettra avec l'opération inverse de recréer un tableau. Exemple:
<?php
$tableau = array("valeur 1", "valeur 2", "valeur 3", "valeur 4", "valeur 5");
$chaine = serialize($tableau);
echo("<p>". $chaine ."</p>");
?>
Le tableau aura la structure suivante:

Code : Tout sélectionner

array(5) { [0]=> string(8) "valeur 1" [1]=> string(8) "valeur 2" [2]=> string(8) "valeur 3" [3]=> string(8) "valeur 4" [4]=> string(8) "valeur 5" }
serialize va créer une chaine comme ceci:
a:5:{i:0;s:8:"valeur 1";i:1;s:8:"valeur 2";i:2;s:8:"valeur 3";i:3;s:8:"valeur 4";i:4;s:8:"valeur 5";}
Tu insères ensuite cette valeur dans un champ texte de ta base de données. Lorsque tu la récupères, tu recrées le tableau indexé avec unserialize().
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 1 Messages

04 déc. 2005, 18:06

Ah d'accord!!! lol ok merci les gars j'ai compris maintenant. J'ai testé, ça marche comme je veux, c'est génial. :D Bon bah encore merci, ça fait vraiement plaisir d'avoir une réponse claire aussi rapidement. Pour fêter ça je me suis inscrit à PHPfrance lol (oui je sens que j'aurais un nouveau problème d'ici peu, je me connaît vous savez...). Puisse-je un jour moi aussi avoir les capacités d'aider un jeune noob en détresse :P !!! Allez bonne fin de journée tout le monde.