IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Simili base de données mais en mémoire


Sujet :

Langage PHP

  1. #1
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut Simili base de données mais en mémoire
    J'ai pour un projet perso, besoin de créer une partie dite "bac à sable". Elle fonctionne avec toutes les fonctionnalités de base excepté que son accès à la base de données est interdit MAIS le module (ici une page) doit croire qu'il accède à la base de données.

    Ma solution puisque dans ce cas précis, la DB se limite à une seule table, est de représenter cette table en mémoire et comme les actions sur cette table se font en AJAX, je pense donc que seule la session est valable.

    En gros
    Module <-> API AJAX <-> functions PHP <-> database
    et là, je voudrais un truc comme
    Module <-> API AJAX <-> functions PHP <-> array

    Maintenant, est-ce que l'array est l'objet le plus adapté? Puis-je espérer pouvoir éditer une des lignes de l'array sans trop de bidouillage (meme si je me doute qu'une boucle sera necessaire) et aussi, peut on supprimer une "ligne" d'un array, ou dois-je me contenter d'une valeur égale à '' (chaine vide)?

  2. #2
    Membre averti Avatar de nicocsgamer
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 321
    Points : 342
    Points
    342
    Par défaut
    Sinon sous forme de fichiers:
    • fichiers csv, ou chaque ligne est un enregistrement comme dans une base
    • fichier xml.
    Avec le nombre de fonctions dispo sur les tableaux en php, je ne pense pas que tu est de probleme de manipulation.

    Bien sur que tu peux mettre une chaine vide.

    Pour ton utilisation des tableaux, une bonne solution est d'utiliser des clés dans tes tableaux. Tu peux associer une clé à un tableau par exemple. On peut imaginer qu'une clé du tableau est un id unique, comme dans une base réelle.

  3. #3
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut
    En fait ce seront des données gardées en mémoire le temps de tester le module donc j'aimerai éviter les fichiers plats car je suis pas sûr que j'y gagne vraiment à tout écrire pour tout relire puis parser pour trouver ma donnée

    supposons que ma table est normalement composée d'une PK disons id et de 6 champs string
    le code suivant est-il correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $id = $_POST['id']; // le nombre que je controle et passe via ajax
    $champ1 = $_POST['champ1'];
    ....
     
    $array = {id => $id, champ1 => $champ1 } 
    $donnees ={ $id => $array };
    et je peux récupérer ma ligne grace à cette clé, c'est bien cela?

    ma question est alors, la deuxième ligne, ajoute-elle la clé (et son tableau), ou réinitialise le tableau avec uniquement cette "ligne"?

  4. #4
    Membre averti Avatar de nicocsgamer
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 321
    Points : 342
    Points
    342
    Par défaut
    Réinitialise.

    De tete pour ajouter tu peux faire $donnees[] = ($id=>$array);

    Sinon pourquoi tu met ton $id dans $array ?

  5. #5
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut
    pourquoi? mais j'en sais rien :p

    par contre, si je connais l'id, je peux extraire le tableau et ne travailler que sur ce tableau 'inférieur' sans avoir rien à faire de la clé du tableau supérieur. ainsi je peux passer ce tableau en parametre à une fonction et toujours avoir l'id à porter de main, surtout si un jour je me décidé à "sérialiser" le tableau en xml pour le transmettre à ma couche AJAX.
    bon bah je vais essayer tout cela. merci bcp

  6. #6
    Membre averti Avatar de nicocsgamer
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 321
    Points : 342
    Points
    342
    Par défaut
    Je te pose cette question pour savoir si tu en as vraiment besoin et ne pas faire de duplication de données.

    Mais de rien :p

  7. #7
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut
    ouah la galère pour obtenir ce que je voulais. j'ai pas trop compris comment marche les tableaux en php, c'est jamais de la même facon et les exemples de php.net marchent pas chez moi :/
    je suis donc resté sur des array simples sans clés, accroché à une clé et cette clé est un integer.

    Maintenant voilà comment j'insere

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $cnt = count($table)+1;
    $table[$cnt] = array($cnt,$modid, $id, $login,$field1,$field2,$field3,$field4,$field5,$field6);
    ca incrémente et je sais où retrouver mon enregistrement.

    Bref, tout va bien jusqu'à ce que j'attaque la suppression de "ligne"
    imaginons que j'ai des tableaux dans chaque cellule de 1 à 10.
    j'aimerai supprimer $table[5];
    j'ai vu sur le net que null c'est mal et unset, c'est bien
    donc je fais unset($table[5]); et là...c'est le drame

    ca vide ma ligne mais donc mon count du début ne marche plus puisqu'il compte un enregistrement de moins.
    je me suis dit, tente à avec sizeof($table)
    et bien bizarrement ca me sort la même chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo sizeof($table);
           unset($table[$cnt-1]);
           echo sizeof($table);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo count($table);
           unset($table[$cnt-1]);
           echo count($table);
    ne marchent donc pas.

    je cherche un moyen d'avoir la "clé" maximum si vous préférez mais le plus simplement possible. me trompe-je quelque part?

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Pour information tu peux empiler/dépiler tes éléments : array_shift/array_unshift (en début) et array_push/array_pop (à la fin).

    Ta variable $cnt ne doit pas être à jour donc autant s'en passer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unset($table[sizeof($table) - 1]);
    Ce qui revient finalement à la fonction array_pop.

    C'était bien la question


    Note : sizeof est un alias de la fonction count.

  9. #9
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut
    en fait, je pense pas que pop ou push m'aident car si j'insère à la fin j'ai quand meme besoin de savoir cette position car je retourne cette position à ma couche AJAX. donc insérer à la fin ne suffit pas.

    tout marche à merveille sauf si je fais un unset d'un des éléments car à ce moment là, les méthodes retournent le nombre d'éléments et moi je veux la longueur du truc. disons que je m'attendais à avoir
    $table[0] => plein
    ....
    $table[5] => vide
    $table[6] => plein
    $table[9] ==> plein

    mais donc une longueur toujours égale à 10. J'ai pas envie de boucler sur mon tableau et incrémenter un compteur dès que l'élément est différent de null. y a sûrement plus propre

  10. #10
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 327
    Points : 15 670
    Points
    15 670
    Par défaut
    Citation Envoyé par Louis-Guillaume Morand
    En fait ce seront des données gardées en mémoire le temps de tester le module donc j'aimerai éviter les fichiers plats car je suis pas sûr que j'y gagne vraiment à tout écrire pour tout relire puis parser pour trouver ma donnée
    si tu utilises des sessions, les données de session sont stockées dans un fichier plat

    en ce qui concerne l'histoire de la clé primaire, je sais que MySQL garde dans les informations de la table, un variable "prochaine clé primaire". Et donc il ne relis pas toute la table au moment de faire un "INSERT"

  11. #11
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut
    oui c'est les sessions mais je n'ai pas besoin de gérer les fichiers. là quand j'appelle mon script php, je charge la variable de session, je fais mes modifs et pouf je la refous dedans, avant de retourner des données à ma couche ajax

    pour ta deuxieme phrase, c'est la commande inserted_id() (un truc du genre) mais là je veux me passer totalement de base de données. je veux une sandbox avec juste un tableau de tableaux mais c'est plus compliqué que prévu (quoi que, puisqu'a part la suppression, le reste marche à merveille)

  12. #12
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 327
    Points : 15 670
    Points
    15 670
    Par défaut
    Citation Envoyé par Louis-Guillaume Morand
    oui c'est les sessions mais je n'ai pas besoin de gérer les fichiers. là quand j'appelle mon script php, je charge la variable de session, je fais mes modifs et pouf je la refous dedans, avant de retourner des données à ma couche ajax
    d'accord je pensais que tu voulais éviter ça pour des problèmes de performance
    tu as raison d'utiliser directement les sessions, tout est automatisé

    Citation Envoyé par Louis-Guillaume Morand
    mais là je veux me passer totalement de base de données.
    je disais ça pour simuler la base de données. il suffit que tu ajoutes une variable de session avec la prochaine clé à utiliser

  13. #13
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 253
    Points
    28 253
    Par défaut
    Citation Envoyé par mathieu
    je disais ça pour simuler la base de données. il suffit que tu ajoutes une variable de session avec la prochaine clé à utiliser
    mouais. j'y avais pensé et je trouvais pas ca fiable mais en fait, vu que ca l'est plus que mon count ou mon sizeof. je m'en vais tester

    merci


    edit: bon bah ca marche parfaitement et c'est extrêmement rapide par rapport à une DB (bon ok y a moins de données ) bon ça m'a pris 60lignes et le portail marche comme s'il avait une DB à disposition

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/08/2012, 10h36
  2. copier base de donnée mais pb de compatibilité
    Par jeyweb2 dans le forum MySQL
    Réponses: 1
    Dernier message: 17/12/2010, 23h16
  3. Réponses: 10
    Dernier message: 28/01/2010, 12h01
  4. réutilisation d'une base de donnée mais plantage
    Par cvivi60 dans le forum Modélisation
    Réponses: 18
    Dernier message: 25/09/2009, 16h51
  5. Base de données en mode mémoire
    Par Lebas dans le forum JDBC
    Réponses: 5
    Dernier message: 08/02/2007, 13h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo