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

PHP & Base de données Discussion :

BIGINT 64 bits réduit à 31 bits [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Par défaut BIGINT 64 bits réduit à 31 bits
    Bonjour,

    J'ai un champs mySQL de type BIGINT(20) dont la valeur est :
    $bigint = 18446744073709551615 soit 64 bits à 1.

    Il s'affiche correctement sur le serveur FREE
    avec la fonction decbin($bigint) : les 64 bits sont bien à 1.

    En local sur mon PC (Seven) avec WampServeur (64bits) :
    decbin($bigint) affiche 31 bits à 1 au lieu des 64 bits à 1
    pourtant $bigint = 18446744073709551615 et s'affiche bien en entier dec.

    Config : WampServeur 2.2D 64bit ; PHP 5.3.10 ; MySQL 5.5.20 ; Apache 2.2.21

    La configuration php ini avec precision à 32 au lieu de 14 ne change rien bien sûr...

    Comment puis-je retrouver les 64 bits en binaire de ce bigint sous WampServeur ?

    Par avance merci de votre aide

    Cranx
    www.souslesmers.fr : Observons le monde vivant sous-marin

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Par défaut
    je crois pas qu'il y ait de version php 64 bits officielle pour windows

    PHP_INT_SIZE te donne quoi?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Par défaut
    Bonjour MartyMacFly,

    PHP_INT_SIZE = 4

    Comment le configurer à 8, je n'est pas trouvé dans php ini... ?
    merci

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Par défaut
    c'est pas une config c'est une constante
    donc la comme je pensais ton php est en 32 bits

    les versions 64 bits windows sont non officielles et souvent peu stable

    bon courage

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Par défaut
    et sous Linux avec XAMPP en 64bits, est-ce que cela fonctionne ?
    si oui, je vai avoir le plaisir d'installer une session Linux

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Par défaut
    oui

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Par défaut
    Avant de me lancer dans Linux que je ne connais pas
    il me semble étrange que la variable s'affiche bien en dec mais pas binaire.
    Comme PHP_SIZE_INT est sur 4 octects,
    je devrais avoir $bigint=2147483647 au lieu de 18446744073709551615
    puisque decbin($bigint) affiche 31 bits à 1

    Encore merci de ton aide

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Par défaut
    ton $bigint est une chaine de caractère (surement récupéré de ta bdd)

    la fonction decbin fait une conversion implicite en int d'ou les 31 bits à 1


    en alternative sur windows tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function bcdecbin($dec) {
        $bin = '';
        while ($dec) {
            $m = bcmod($dec, 2);
            $dec = bcdiv($dec, 2);
            $bin .= abs($m);
        }
        return strrev($bin);
    }
    si tu as l'extension bcmath

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Par défaut
    Merci MartyMacFly
    Cela fonctionne sur le serveur et en local sur mon PC sans ajout d'extention

    Mon code initial pourra sûrement être optimisé
    en intégrant les fonctions de bcmath pour extraire
    les 40 premiers bits parmi les 64 de ce bigint.

    Ce code est donc totalement à revoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <?php
         $bigint = $donnees['bigint'];  // récupération du bigint sur 8 octets
         $liste = ""; // liste des zones marines
     
         for ($bit = 0; $bit < 40; $bit++) // scan des bits
           { 
            $bit_compar = pow(2,$bit); // pow(x,y)=x^y
     
           if (($bigint & $bit_compar) == $bit_compar)  // test du bit correspondant à la zone marine à afficher
            {
             $nom_zone = mysql_result(mysql_query("SELECT zone FROM slm_zone WHERE id_zone = $bit + 1"),0); // récupération du nom de la zone marines
             $liste_zone .= $nom_zone.' ; ';   // zone marine ajoutée à la liste           
            }
          }
    ?>

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 12
    Par défaut
    Voici une version fonctionnelle qui peut encore être optimisée
    pour éviter les requêtes multiples dans la bdd
    Ce code me permet enfin de tester les 64 bits d'un BIGINT au delà des 31 premiers bits

    Ouf ! pas besoin d'installer LINUX
    Un grand merci à MartyMacFly pour son aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php 
        $zone = $donnees['bigint'];
        $liste_zone = "";
     
        for ($bitzone = 1; $bitzone < 41; $bitzone++) 
         {
           if (bcmod($zone, 2) == 1) // zone à afficher
            {
             $nom_zone = mysql_result(mysql_query("SELECT zone FROM slm_zone WHERE id_zone = $bitzone"),0); // à optimiser pour éviter les requêtes multiples
             $liste_zone .= $nom_zone.'<br />';              
            }
            $zone = bcdiv($zone, 2);
          }
          echo $liste_zone;  
    ?>

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

Discussions similaires

  1. IBM réduit 1 bit de donnée à 12 atomes
    Par Gecko dans le forum Actualités
    Réponses: 27
    Dernier message: 19/01/2012, 08h32
  2. Le wave 32 bits -> wave 8 bits
    Par troumad dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 03/04/2006, 11h00
  3. Comment convertir une image 24 bits en 8 bits ?
    Par James64 dans le forum Langage
    Réponses: 22
    Dernier message: 13/12/2004, 20h12
  4. [debutante] Conversion 8 bits en 16 bits
    Par bolo dans le forum Algorithmes et structures de données
    Réponses: 28
    Dernier message: 06/12/2004, 23h20
  5. Machine 32 bits - cryptage 128 bits
    Par free0pen dans le forum Assembleur
    Réponses: 6
    Dernier message: 02/04/2004, 20h14

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