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

Symfony PHP Discussion :

Requête sur base de données [1.x]


Sujet :

Symfony PHP

  1. #21
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 80
    Points : 169
    Points
    169
    Par défaut
    Tout dépend de votre besoin.

    Vous avez besoin d'une seule information => fetchOne()
    Vous avez besoin de plusieurs lignes d'information ou encore la requete est susceptible de retourner plus d'un enregistrement exploitable => execute().

    premier cas, pas d'itération car l'objet retourné est directement du type que vous voulez exploiter.
    second cas, itération ou indiçage direct (si un seul enregistrement retourné, il sera à l'offset 0) des données contenues dans le Doctrine_Collection.

    A votre place, ce qui me chagrinerait un peu plus, c'est qu'un appel à la méthode getUsername() ne semble rien retourner, alors que si vous surchargez la méthode __toString(), cela semble fonctionner.

  2. #22
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Je plussois Agnello Fabrice.

    Je serais curieux de voir le code de la méthode _toString()
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #23
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 80
    Points : 42
    Points
    42
    Par défaut
    sait pas trop comment, mais ca marche, voila ce que j'ai fait;

    dans utilisateur.class:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public function  __toString() {
            return $this->getNom();
        }
    dans le modele:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public function getUtilisateurByConnexion($username,$password)
        {
            $q = Doctrine_Query::create()
                ->from('Utilisateur u')
                ->where('u.username ="'.$username.'"')
                ->andWhere('u.password ="'.$password.'"')
                ;
            return $q;
        }
    dans l'action:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $this->user = Doctrine_Core::getTable('Utilisateur')
                              ->getUtilisateurByConnexion($this->username,$this->pass)
                              ->execute()
                              ;
    je crois que c'est ici qu'il ya eu un declic ; precedemment je mettais Doctrine au lieu de Doctrine_Core.

    dans le template j'utilise mes accesseurs comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php foreach ($user as $user):?>
        <?php echo $user->getProfilUtilisateur();?><br/>
        <?php echo $user->getUnite()?><br/>
        <?php echo $user->getUnite()->getTypeUnite()?><br/>
        <?php endforeach ;?>
    c'est la ou je trouve qu'il ya quelque chose de mystique, quand je fais simplement un <?php echo $user; ?> il ne me ramene aucun objet mais quand je passe le foreach il me ramene mes donnees.
    Mais bon le weekend commence bien!

    Merci à Tous pour votre temps

  4. #24
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Pour répondre point à point.

    Pour l'affichage de $user (qui utilise _toString() ), le résultat doit être le même que l'utilisation d'un $user->getNom(), si ce n'est pas le cas, cela pourrait être la révélation d'un problème certain et grave dans le modèle et doit être éclairci au plus vite.

    Pour ta fonction du modèle, le code a tout intérêt à être le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function getUtilisateurByConnexion($username,$password)
        {
            return Doctrine_Query::create()
                ->from( 'Utilisateur u' )
                ->where( 'u.username = ?', $username )
                ->andWhere( 'u.password = ?', $password );
        }
    Cela peut sembler très proche, mais le traitement est essentiellement différent. En passant par le "?" tu délègues à doctrine la sécurisation des données qui éviteront ainsi une injection SQL. Imagine la tête de ta requête si l'utilisateur tape en tant que nom u"; INSERT INTO Utilisateur ("username") SET ("toto"); ? Entonnant non ? Doctrine, lui, va repérer cette manip et la rendre inopérante.

    Pour ce qui est du foreach, une lecture attentive des remarques portées par Agnello Fabrice et moi apporte déjà la solution. Relis les remarques précédantes et tu comprendra que "execute()" ne donne pas le même résultat que "fetchOne()"
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Requête sur base de données distante
    Par themich dans le forum Requêtes
    Réponses: 0
    Dernier message: 09/02/2013, 18h24
  2. Requête sur bases de données Blast
    Par jb59000 dans le forum Bioinformatique
    Réponses: 12
    Dernier message: 09/02/2009, 11h06
  3. [MySQL] Requête sur base de données à partir d'un formulaire
    Par spawns dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 26/01/2009, 09h00
  4. Execution de requête sur base de données distante
    Par ~~PriVate JoKe~~ dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/11/2006, 21h59
  5. Requête sur base de données ACCESS
    Par JLamotte dans le forum Access
    Réponses: 1
    Dernier message: 21/11/2005, 10h50

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