Forums Développement Multimédia

Aller au contenu

Blobs

CODE PHP MySQL

11 réponses à ce sujet

#1 Waldos

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 69 messages

Posté 25 January 2013 - 19:50 PM

Bonjour,
Une petite question, désolé par avance si elle a déjà été posée.
Je veux faire un petit jeu en flash et stocker les "highscores" de chaque joueur (oui il en a de plusieurs types dans chaque niveau) dans un champ de la BDD en "serializant" un tableau du genre :

level---highscoretype1---highscoretype2---highscoretype3
1---45---64---78
2---46---74---32
3---65---185---7569
etc, etc… la taille de ce tableau augmentera à mesure que des niveaux seront rajoutés.

Bref, j'en arrive à ma question. Si j'utilise un champ de type "LONGBLOB" (208 octets me dit MySQL) dans ma BDD pour stocker la valeur binaire du tableau serialisé, à partir de quelle taille (approximative) mon tableau risque t'il de dépasser 208o et d'être tronqué ?

Voilà j'espère que ma question n'est pas trop vague.

Merci d'avance.

#2 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 25 January 2013 - 23:27 PM

Ça va dépendre de la valeur maximum de ton score.
Par exemple, une valeur max de 65 025 utilise 2 octets (255*255), tu pourrais donc stocker 104 valeurs…
… si tu as 3 valeurs par highscore, Ça fait 34 niveaux

65025 c'est sans doute pas assez…
Mais a chaque fois que tu vas augmenter cette valeur d'un octet (255), tu vas diminuer d'autant le nombre de niveaux…

16 581 375 ? 69 valeurs -> 23 niveaux

4 228 250 625 ? 52 valeurs -> 17 niveaux

#3 Waldos

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 69 messages

Posté 27 January 2013 - 11:00 AM

Merci Dldler.
Je n'y comprends pas grand chose avec ces histoires de rapport caractère=poids en octet.
En tout cas j'ai fait un essai avec ma fonction serialize pour voir et tout à l'air de fonctionner.
Pour répondre à ta question, je n'ai pas besoin de si grands nombres pour mes highscores, le but étant d'avoir le plus petit nombre possible pour chaque highscore (pratique :P)
Mais pour un tableau de 4 niveaux j'ai testé avec des valeurs simples :
$tab[0][0] = '';$tab[0][1] = '';$tab[0][2] = '';$tab[0][3] = '';
$tab[1][0] = '1';$tab[1][1] = '111';$tab[1][2] = '222';$tab[1][3] = '5540';
$tab[2][0] = '2';$tab[2][1] = '666';$tab[2][2] = '777';$tab[2][3] = '9066';
$tab[3][0] = '3';$tab[3][1] = '123';$tab[3][2] = '456';$tab[3][3] = '8077';
$tab[4][0] = '4';$tab[4][1] = '789';$tab[4][2] = '32';$tab[4][3] = '7088';
//to safely serialize
$tabenchaine = base64_encode(serialize($tab));
Et rien que pour ces 4 niveaux (la ligne 0 je l'ai laissé vide pour ne pas m'embrouiller), ça me renvoie une donnée encodée dans mon LONGBLOB de 404 octets. J'avoue que je m'attendais à moins pour 4 niveaux.
Je ne sais pas si il y a moyen de faire moins ou plus efficace…

#4 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 27 January 2013 - 15:45 PM

Bonjour waldows…

Il y a la beaucoup trop d'inconnues pour moi (je ne connais pas php) et je vais avoir du mal a t'aier pratiquement.

2 remarques quand même :
  • une valeur '456' me semble être un String plutôt qu'un nombre. Un sString prenant plus de pace a stocker qu'un nombre entier c'est un choix a éviter si tu peux le faire.
  • Je pense que tu confonds valeur et encombrement mémoire.
  • Un nombre entier (en Flash, pour être concret) prend 32 bits (3 octets) pour être stocké. C'est ce format de stockage qui compte. Ainsi, 0 et 32256 prendront autant de place en mémoire.
  • Voilà pourquoi, quand on veut optimiser et gagner de la place, on tronçonne les valeurs en tranches de bits. Si 8 bits sont suffisants, on tronçonne par packets de 8 bits (1 octet). ça évite les pertes de bits, mais ça limite la valeur maximum du nombre à 255. Si tu ne connais pas le travail sur les bits, tu ne vas pas pouvoir optimiser et compresser tes données…


#5 Waldos

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 69 messages

Posté 27 January 2013 - 15:57 PM

Ah oui, j'ai retiré tous les guillemets autours des nombres, du coup je gagne 100 octet sur la valeur dans la base, et ça n'a pas l'air d'affecter en quoi que ce soit le fonctionnement du programme pour l'instant.
Merci pour l'astuce.

#6 Waldos

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 69 messages

Posté 06 February 2013 - 18:25 PM

Re-bonjour, je reviens à la charge… je bloque sur un problème sûrement tout bête.
En fait j'ai écrit ce code pour updater un tableau des "highscores" (les 10 meilleurs joueurs)

//Si le score du nouveau joueur est meilleur que le score du joueur de la première ligne
if ($newscorejoueurmoves<$tableauhighscoresmoves[1][1] or $tableauhighscoresmoves[1][1]==NULL){
           for ($i=1; $i<=9; $i++){
        $tableauhighscoresmoves[11-$i][0]=$tableauhighscoresmoves[11-($i+1)][0];
        $tableauhighscoresmoves[11-$i][1]=$tableauhighscoresmoves[11-($i+1)][1];
}
        $tableauhighscoresmoves[1][0]=$pseudo;
        $tableauhighscoresmoves[1][1]=$newscorejoueurmoves;
}
//OU ALORS Si le score du nouveau joueur est meilleur que le score du joueur de la deuxième ligne
  elseif ($newscorejoueurmoves<$tableauhighscoresmoves[2][1]){
           for ($i=1; $i<=8; $i++){
        $tableauhighscoresmoves[11-$i][0]=$tableauhighscoresmoves[11-($i+1)][0];
        $tableauhighscoresmoves[11-$i][1]=$tableauhighscoresmoves[11-($i+1)][1];
}
        $tableauhighscoresmoves[2][0]=$pseudo;
        $tableauhighscoresmoves[2][1]=$newscorejoueurmoves;
}
//OU ALORS Si le score du nouveau joueur est meilleur que le score du joueur de la troisième ligne
elseif ($newscorejoueurmoves<$tableauhighscoresmoves[3][1]){
           for ($i=1; $i<=7; $i++){
        $tableauhighscoresmoves[11-$i][0]=$tableauhighscoresmoves[11-($i+1)][0];
        $tableauhighscoresmoves[11-$i][1]=$tableauhighscoresmoves[11-($i+1)][1];
}
        $tableauhighscoresmoves[3][0]=$pseudo;
        $tableauhighscoresmoves[3][1]=$newscorejoueurmoves;
        }
//ETC…etc…
elseif ($newscorejoueurmoves<$tableauhighscoresmoves[4][1]){
           for ($i=1; $i<=6; $i++){
        $tableauhighscoresmoves[11-$i][0]=$tableauhighscoresmoves[11-($i+1)][0];
        $tableauhighscoresmoves[11-$i][1]=$tableauhighscoresmoves[11-($i+1)][1];
}
        $tableauhighscoresmoves[4][0]=$pseudo;
        $tableauhighscoresmoves[4][1]=$newscorejoueurmoves;
        }
elseif ($newscorejoueurmoves<$tableauhighscoresmoves[5][1]){
           for ($i=1; $i<=5; $i++){
        $tableauhighscoresmoves[11-$i][0]=$tableauhighscoresmoves[11-($i+1)][0];
        $tableauhighscoresmoves[11-$i][1]=$tableauhighscoresmoves[11-($i+1)][1];
}
        $tableauhighscoresmoves[5][0]=$pseudo;
        $tableauhighscoresmoves[5][1]=$newscorejoueurmoves;
        }
elseif ($newscorejoueurmoves<$tableauhighscoresmoves[6][1]){
           for ($i=1; $i<=4; $i++){
        $tableauhighscoresmoves[11-$i][0]=$tableauhighscoresmoves[11-($i+1)][0];
        $tableauhighscoresmoves[11-$i][1]=$tableauhighscoresmoves[11-($i+1)][1];
}
        $tableauhighscoresmoves[6][0]=$pseudo;
        $tableauhighscoresmoves[6][1]=$newscorejoueurmoves;
        }
elseif ($newscorejoueurmoves<$tableauhighscoresmoves[7][1]){
           for ($i=1; $i<=3; $i++){
        $tableauhighscoresmoves[11-$i][0]=$tableauhighscoresmoves[11-($i+1)][0];
        $tableauhighscoresmoves[11-$i][1]=$tableauhighscoresmoves[11-($i+1)][1];
}
        $tableauhighscoresmoves[7][0]=$pseudo;
        $tableauhighscoresmoves[7][1]=$newscorejoueurmoves;
        }
elseif ($newscorejoueurmoves<$tableauhighscoresmoves[8][1]){
           for ($i=1; $i<=2; $i++){
        $tableauhighscoresmoves[11-$i][0]=$tableauhighscoresmoves[11-($i+1)][0];
        $tableauhighscoresmoves[11-$i][1]=$tableauhighscoresmoves[11-($i+1)][1];
}
        $tableauhighscoresmoves[8][0]=$pseudo;
        $tableauhighscoresmoves[8][1]=$newscorejoueurmoves;
        }
elseif ($newscorejoueurmoves<$tableauhighscoresmoves[9][1]){
           for ($i=1; $i<=1; $i++){
        $tableauhighscoresmoves[11-$i][0]=$tableauhighscoresmoves[11-($i+1)][0];
        $tableauhighscoresmoves[11-$i][1]=$tableauhighscoresmoves[11-($i+1)][1];
}
        $tableauhighscoresmoves[9][0]=$pseudo;
        $tableauhighscoresmoves[9][1]=$newscorejoueurmoves;
        }
elseif ($newscorejoueurmoves<$tableauhighscoresmoves[10][1]){
        $tableauhighscoresmoves[10][0]=$pseudo;
        $tableauhighscoresmoves[10][1]=$newscorejoueurmoves;
}

En fait j'ai l'impression que mes "elseif" sont pris en compte la première fois (quand le tableau est encore vide), mais dès qu'il y a un joueur qui entre en première place, et qu'un autre joueur le bat, toutes les lignes du tableau sont remplacées par le nom et le score du nouveau joueur, mes "elseif" ne sont plus pris en compte.
J'avoue je sèche un peu dessus. :(

Merci d'avance si vous avez une idée.

#7 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 06 February 2013 - 19:04 PM

Ffffff…

… pour une tartine c'est une tartine.

Tu dois pouvoir factoriser d'une façon ou d'une autre.

Un principe de base :
Une variable i pour parcourir ton tableau $tableauhighscoresmoves
- si : score du joueur supérieur à l'entrée [i] du tableau
- alors sortir de la boucle for
- fin du si
- si : i < 10
- alors :
- - insérer le nouveau score à l'indice [i] du tableau
- - supprimer l'indice 10 du tableau
- fin du si

ça devrait tourner aux alentours de 10 lignes au vu de ce que tu as fait mais je ne suis pas entré plus que ça dans le code.

#8 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 06 February 2013 - 19:10 PM

Oups. Je n'avais pas vu qu'il s'agissait de php.
Je connais beaucoup moins qu'ActionScript, mais je pense quand même que ça doit être possible sur le principe que j'ai décrit.
Peut-être à confirmer par quelqu'un de compétent dans le domaine.



Bonne chance.

#9 Waldos

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 69 messages

Posté 06 February 2013 - 20:15 PM

Oui, mais si je ne me trompe pas il ne suffit pas de vérifier que la valeur est inférieur à tant , d'insérer la valeur et de supprimer la dixième ligne.
Il faut aussi que si la nouvelle valeur entre par exemple en position 3, il y ait un décalage de toutes les autres valeurs du dessous pour ne pas les perdre. Et ce AVANT d'insérer la nouvelle valeur.
C'est à dire:
-Je sais que ma nouvelle valeur va entrer à la place de l'ancienne valeur 3 donc
-la valeur 10 doit devenir égale à la valeur 9
-la valeur 9 doit devenir égale à la valeur 8
-la valeur 8 doit devenir égale à la valeur 7
-la valeur 7 doit devenir égale à la valeur 6
-la valeur 6 doit devenir égale à la valeur 5
-la valeur 5 doit devenir égale à la valeur 4
-la valeur 4 doit devenir égale à la valeur 3

-Et seulement là, la valeur 3 peut prendre la nouvelle valeur entrante, les valeurs 2 et 1 du tableaux restant inchangées.

Et il faut faire ça pour tous les cas de figures, du premier cas (si la valeur entrante va remplacer la 1ere position), au 10eme cas (si la valeur entrante va remplacer la 10 position)

Mon problème, c'est que si la valeur entrante remplace la première position, il ne faut pas exécuter le code de test pour voir si elle remplace la deuxième (car il est logique que si elle est meilleure que la première, elle sera meilleure que toutes les autres), d'où mes "elseif". Sauf qu'il les considère comme de simples "if", j'ai l'impression, du coup tous mes autres codes de vérification sont validés, c'est ça que je ne comprends pas. Où sinon le problème vient d'autre part.

EDIT : Je crois voir ce que tu veux dire. Effectivement je vais essayer, ça devrait m'éviter de faire des "elseif" et simplifier le code. Je te tiens au courant.
Merci !

#10 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 06 February 2013 - 23:21 PM

Alors,
si personne n'intervient, tu vas devoir te débrouiller seul pour trouver le bon code. Je peux juste continuer avec toi l'analyse.
J'ai vu ton édit, donc j'ai fait avancer un peu le chmilblick.

Si tes tableaux n'ont pas de fonction pour insérer une valeur à l'intérieur d'un tableau, tu peux le simuler toi même.
Une fois sorti de la première boucle, tu as un i qui te donne la position d'insertion.
Tu peux par exemple, faire une boucle descendante, de j = 10 à i, pour placer la valeur j-1 en case j
A la fin : tu places ta nouvelle valeur en i.

Je tente quand même une transcription en actionScript, ça me semble assez proche pour que tu t'y retrouves :
//On parcourre le tableau jusqu'a temps de trouver un score inférieur
for ($i=0; $i<10;$i++)
{
  if ($newscorejoueurmoves<$tableauhighscoresmoves[$i][1] || $tableauhighscoresmoves[$i][1]==NULL)
  {
         break;
  }
}
// Si i est inférieur à 10, il faut insérer le nouveau score
if($i<10)
{
  // On faire remonter les scores de la neuvième à la ième place
  for ($j=9; $j>$i;$j--)
  {
   $tableauhighscoresmoves[$j]=$tableauhighscoresmoves[$j-1];
  }
  // On range le nouveau score
  $tableauhighscoresmoves[$i]=[$pseudo,$newscorejoueurmoves];
}


#11 Waldos

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 69 messages

Posté 06 February 2013 - 23:27 PM

Ouf, je vais prendre le temps de lire tout ça merci. Là je viens d'essayer l'exercice de faire ce que tu proposais au dessus, j'en étais arrivé à ça mais ça ne marche pas non plus, ça me fait sensiblement le même problème :
$i=1;
$arreterboucle=0;
while ($arreterboucle==0)
{
        if ($newscorejoueurmoves<$tableauhighscoresmoves[$i][1] or $tableauhighscoresmoves[$i][1]==NULL){$arreterboucle=1;}
                else{
                        if($i<10){
                        $i++;}
                        if($i>=10){
                        $arreterboucle=2;}
                        }
}
if ($arreterboucle==1){
for($j=$i+1; $j<=10; $j++){
        $tableauhighscoresmoves[11-($j-$i)][0]=$tableauhighscoresmoves[11-(($j+1)-$i)][0];
        $tableauhighscoresmoves[11-($j-$i)][1]=$tableauhighscoresmoves[11-(($j+1)-$i)][1];
        }
        $tableauhighscoresmoves[$i][0]=$pseudo;
        $tableauhighscoresmoves[$i][1]=$newscorejoueurmoves;

}

Du coup je vais voir avec ton code actionscript.

EDIT : Arf, je viens d'essayer avec ton code, ça me renvoie le même problème. Quand un joueur bat le record du joueur précédent, tous les champs du tableau (de 1 à 10) sont remplacés par son nom. :/

Je vais continuer à chercher.

#12 Waldos

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 69 messages

Posté 14 February 2013 - 16:25 PM

Re ! J'ai l'impression qu'une partie du sujet a été effacé, je ne retrouve pas la page 2. :(

Quoi qu'il en soit, j'ai un nouveau petit problème, mais je pense qu'il ne devrait pas être difficile à résoudre cette fois.

Dldler >> J'ai repris la boucle que tu avais fait pour récupérer la valeur de $i, afin de voir à quelle ligne il fallait insérer le joueur dans les highscores. J'ai voulu y apporter une amélioration en départageant deux joueur qui feraient le même nombre de mouvements par rapport à leur meilleur temps.
Le code marche quand je le mets à l'extérieur de (après) la boucle qui récupère $i, mais quand j'ai voulu l'inclure dans la boucle, j'ai l'impression que le "break" n'est plus pris en compte. J'ai testé et le nouveau joueur ne rentre plus dans les records du tout.
Pourtant ça ne me renvoie pas d'erreur de syntaxe donc il doit y avoir un truc que je ne vois pas qui devrait me sauter aux yeux…
for ($i=0; $i<$maxhighscore;$i++)
        {
                  if ($newscorejoueurmoves<=$tableauhighscoresmoves[$i][1] or $tableauhighscoresmoves[$i][1]==NULL)
                  {
                          if ($newscorejoueurmoves==$tableauhighscoresmoves[$i][1]){
        $nomadversaire=$tableauhighscoresmoves[$i][0];
        $sql = "select highscores from lab_users where pseudo='$nomadversaire'";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$data = mysql_fetch_array($req);
$tableauhighscoresadversaire = unserialize(base64_decode($data[0]));
        if ($newscorejoueurtemps<$tableauhighscoresadversaire[$levelactuel][2]){break;}
        }
                  }
        }
Merci d'avance si tu prends le temps de te pencher dessus.

Je te mets le code qui marche (après et en dehors de la boucle).
Bien sûr le hic, c'est qu'il ne fonctionne que pour la comparaison avec le premier joueur rencontré dans le tableau, c'est pour ça que je voulais l'inclure dans la boucle.

//POUR LES MOVES
    //On parcoure le tableau jusqu'à temps de trouver un score inférieur
    for ($i=0; $i<$maxhighscore;$i++)
    {
                  if ($newscorejoueurmoves<=$tableauhighscoresmoves[$i][1] or $tableauhighscoresmoves[$i][1]==NULL)
                  {
                                                                                 break;
                  }
    }
    if ($newscorejoueurmoves==$tableauhighscoresmoves[$i][1]){
    $nomadversaire=$tableauhighscoresmoves[$i][0];
    $sql = "select highscores from lab_users where pseudo='$nomadversaire'";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$data = mysql_fetch_array($req);
$tableauhighscoresadversaire = unserialize(base64_decode($data[0]));
    if ($newscorejoueurtemps>$tableauhighscoresadversaire[$levelactuel][2]){$i++;}
    else {}
    }
    else{}




1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP