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

Zend_Db PHP Discussion :

Changer le type d'une colonne en fonction des types SQL


Sujet :

Zend_Db PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 186
    Points : 71
    Points
    71
    Par défaut Changer le type d'une colonne en fonction des types SQL
    Bonjour, je cherche un moyen pour caster les valeur d'une row en fonction du type du champ correspondant.

    Exemple :

    La table USER contient un champ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `USER_RIGHT_ID` int(11) NOT NULL
    ,

    Si j'exécute ce code :

    Dans la classe Model_DbTable_User qui hérite de Zend_Db_Table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $oUserSelect = $this->select();
    $oUserSelect->from($this);
    $aReturnUser = $this->fetchAll($oUserSelect)->toArray();
    Je voudrais que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $aReturnUser->USER_RIGHT_ID
    retourne une valeur de type int

    Alors que actuellement toutes les valeurs sont de type string...

    Merci d'avance pour vos réponses.

  2. #2
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    en PHP les changement de type de variable se fait automatiquement donc dans la plupart des cas tu n'as pas besoin de t'en occuper et ça fonctionnera
    GNAP !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 186
    Points : 71
    Points
    71
    Par défaut
    en PHP les changement de type de variable se fait automatiquement donc dans la plupart des cas tu n'as pas besoin de t'en occuper et ça fonctionnera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Alors que actuellement toutes les valeurs sont de type string...
    Si je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($aReturnUser->USER_RIGHT_ID === 3)
    ça ne marchera forcément pas... (Même si le champs USER_RIGHT_ID à la valeur 3 en base de données).

    Je veux simplement respecter les types entre base de données et php, pour un souci de performance et de conformité

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 178
    Points : 230
    Points
    230
    Par défaut
    Hello,

    Cette histoire de typage n'est en fait pas simple car il faut connaître les types de colonne en base de données et cela dépendra donc de ton Db_Adapter car les types varient selon le SGBD choisi.

    Ensuite, certaines parties de Zend_Db, te renverront des array de stdClass et là, t'as pas de moyen de caster automatiquement sur ce comportement (jointures, requetes sur l'adapter sans passer par une table…).

    Bref, pas évident de trouver un endroit central pour intervenir là-dessus juste avec la couche Zend_Db.

    Resterait la solution de créer ou d'utiliser un ORM et de ne plus passer que par lui pour tes models ce qui te donnerait le côté centralisé.

    Mais tout ça va prendre pas mal de temps juste pour du cast non ?

  5. #5
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Je suis perplexe, si sa table est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    `USER_RIGHT_ID` int(11) NOT NULL
    Alors cela devrais retourner un entier et non pas un string, même si il rentre un string dasn son champs MySQL devrais le caster.

    peux tu faire ceci, et nous montrer ce que cela retourne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $oUserSelect = "SELECT * FROM User;"
    $aReturnUser = $this->fetchAll($oUserSelect);
     
    Zend_Debug::dump($aReturnUser);

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    par défaut tout est envoyé et reçu en string, pour avoir les types il faut utiliser FETCH_BOUND

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Hé bien je ne suis pas du tout d'accord, je viens de faire un test et voila ce que ma db me retourne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    array(1) {
      [0] => array(1) {
        ["heures"] => float(315360)
      }
    }
    mon champ "heures" n'est absolument pas du string !!!!!

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Hé bien je ne suis pas du tout d'accord, je viens de faire un test et voila ce que ma db me retourne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    array(1) {
      [0] => array(1) {
        ["heures"] => float(315360)
      }
    }
    mon champ "heures" n'est absolument pas du string !!!!!
    t'es sous quelle base ? ton test c'est sous PDO ou sous Zend_DB ? si c'est ous zend_db t'utilises quelle pilote ? (t'as xdebug ?)

  9. #9
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Zend_Db sous MySQL avec le pilote mysqli

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Zend_Db sous MySQL avec le pilote mysqli
    oui en effet Zend_Db avec mysqli le fais, mais mysqli seul ne le fait pas, Zend_Db avec pdo mysql non plus

  11. #11
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Ok,

    Donc dans son cas je ferais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         $result = $mysqli->query($sql);
     
            while($req = $result->fetch_object() ){
     
               var_dump((int)$req->heures);
    Ce qui me retourne un int

    donc pour lui, ceci devrais fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((int)$aReturnUser->USER_RIGHT_ID === 3)

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    plutôt un intval ou un settypeca sera plus joli
    ou sinon le FETCH_BOUND qui est fais pour

Discussions similaires

  1. [XL-2013] Remplissage d'une colonne en fonction des valeurs d'un tableau
    Par Sgueum15 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 15/11/2014, 14h50
  2. Réponses: 2
    Dernier message: 10/10/2013, 15h35
  3. Réponses: 2
    Dernier message: 04/05/2012, 07h50
  4. Réponses: 2
    Dernier message: 17/03/2011, 21h45
  5. [Débutant] Changer le type d'une colonne
    Par david71 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 08/11/2005, 11h26

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