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_Form PHP Discussion :

Validateur comparaison input d'une table avec valeur d'une autre table [ZF 1.11]


Sujet :

Zend_Form PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut Validateur comparaison input d'une table avec valeur d'une autre table
    Bonjour à tous, je viens vers vous après avoir longuement chercher.

    Voilà,

    J'ai 2 tables, "device" et "model".
    device contient l'id du model.
    Lors de l'insertion du formulaire de device je cherche à faire un validateur qui compare un champ "serial" du formulaire et le "nom du model" de la base.
    S'ils correspondent c'est bon sinon false.

    J'ai fais cette requête pour l'appeler dans le validateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public function verification_serialmodel($iddevice)
    {
    		$select = $this->select()
                    ->setIntegrityCheck(false)
                    ->from(array('device'),
    			array('id','serial_number'))
    		->join(array('netasq_model'),
    		 'device.netasq_model_id = netasq_model.id',array('name'))
    		->where('device.id = ?', $iddevice);
    		return $this->fetchRow($select);
     
    }
    et la le code du validateur :

    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
    17
    18
    19
    20
    21
    22
    23
     
     class Application_Validate_VerificationSerialmodel extends Zend_Validate_Abstract
        {
            const MSG = 'verification_serialmodel'; 
     
            protected $_messageTemplates = array(
                self::MSG => 'Le numero de serie ne correspond pas au modele'
            );
     
            public function isValid($value, $context = null)
            {
     
    			$device = new Application_Model_DbTable_Device();
    			$modelextract = str_replace("-","",$ar_data['name']);
    			$modelserie = substr($ar_data['serial_number'], 0, -10);
    			$device->verification_serialmodel($ar_data);
    			if($modelextract == $modelserie) return true;
     
    			$this->_error(self::MSG);
                return false;
     
            }
        }
    Pourriez vous m'aider s'il vous plaît ?
    Merci d'avance de votre aide.

    Cordialement,

  2. #2
    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
    Plusieurs questions

    d'où viens Pourquoi appeler la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $device->verification_serialmodel($ar_data);
    puisque tu ne l'utilises pas.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    Bonjour MaitrePylos,

    Merci d'avoir répondu,
    j'ai supprimer des lignes de codes, c'est juste un oubli pour $ar_data['name'],
    ensuite pour la fonction comme j'ai supprimé plein de trucs et que je voulais revenir à 0, je l'ai laissé comme ca, ensuite avec un peu d'aide refaire une fonction clean . La je dois avouer je sais pas comment m'y prendre.

    merci d'avance pour votre aide.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    A la base, le ar_data['name'] vient de mon ancienne requête.

    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
     
    public function verification_serialmodel($data)
    {
    		$select = $this->select()
                    ->setIntegrityCheck(false)
                    ->from(array('device'),
    			array('id','serial_number'))
    		->join(array('netasq_model'),
    		 'device.netasq_model_id = netasq_model.id',array('name'))
    		->where("serial_number= ?", $data['serial_number'])
                    ->where("name= ?", $data['name'])
    		->where("id != ?", $data['id']);
    		return $this->fetchRow($select);
     
    }
    Quelqu'un peut m'aider s'il vous plaît?
    Merci d'avance à vous.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    j'ai fais cela dans mon validateur:


    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    <?php
        class Application_Validate_VerificationSerialmodel extends Zend_Validate_Abstract
        {
            const MSG = 'verification_serialmodel'; 
     
            protected $_messageTemplates = array(
                self::MSG => 'Le numero de serie ne correspond pas au modele'
            );
     
            public function isValid($value, $context = null)
            {
                $value = (string) $value;
                $this->_setValue($value);
    			$ar_data['id'] = $context['id'];
    			$ar_data['name'] = $value;
    			$ar_data['serial_number'] = $value;
    			$device = new Application_Model_DbTable_Device();
    			$modelextract = str_replace("-","",$ar_data['name']);
    			$modelserie = substr($ar_data['serial_number'], 0, -10);
    			$device->verification_serialmodel($ar_data);
    			if($modelextract == $modelserie) return true;
     
    			$this->_error(self::MSG);
                return false;
     
            }
        }
    Et la j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Message: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound
    Donc il doit y avoir du coup de incohérence dans mon traitement mais je vois plus.
    Merci d'avance de l'aide apportée.

  6. #6
    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
    Non on peut pas t'aider car ce que tu demandes, on ne sait pas le deviner.

    La seule chose que tu nous donnes est une requête et on ne sait pas ce que tu fais avec.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ublic function verification_serialmodel($iddevice)
    {
    		$select = $this->select()
                    ->setIntegrityCheck(false)
                    ->from(array('device'),
    			array('id','serial_number'))
    		->join(array('netasq_model'),
    		 'device.netasq_model_id = netasq_model.id',array('name'))
    		->where('device.id = ?', $iddevice);
    		return $this->fetchRow($select);
     
    }
    Ok ça te retourne un tableau de données et puis tu dfais quoi avec , tu l'appelles où

    ceci ne sert à rien

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    class Application_Validate_VerificationSerialmodel extends Zend_Validate_Abstract
        {
            const MSG = 'verification_serialmodel'; 
     
            protected $_messageTemplates = array(
                self::MSG => 'Le numero de serie ne correspond pas au modele'
            );
     
            public function isValid($value, $context = null)
            {
     
    //ok tu instancie un objet			
    $device = new Application_Model_DbTable_Device();
    //retourne null puisque $ar_data n'existe pas	
    $modelextract = str_replace("-","",$ar_data['name']);
     
    //idem
    			$modelserie = substr($ar_data['serial_number'], 0, -10);
    //te reqête est donc vide			
    $device->verification_serialmodel($ar_data);
     
    //null == null donc true, mais tu n'a rien vérifier
    			if($modelextract == $modelserie) return true;
     
    			$this->_error(self::MSG);
                return false;
     
            }
        }
    Montre nous ce que tu veux faire exactement.

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    très bien excusez moi si je me suis mal exprimé,

    J'ai un formulaire, ou je saisi un numéro de série.
    ce numéro de série est dans la table device. Cette table a comme clé étrangère netasq_model_id, et la clé primaire de la table netasq_model.

    Tous les models ont un nom de ce genre U-450, U-250 etc.
    Le validateur doit validé le fait que mon numéro de série commence par U250, U450 etc.
    Voilà j'espère que cela rendra plus clair le schéma que je veux adopter.
    la requête qui est appelée dans le validateur est la suivante :

    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
     
    public function verification_serialmodel($data)
    {
    		$select = $this->select()
                    ->setIntegrityCheck(false)
                    ->from(array('device'),
    			array('id','serial_number'))
    		->join(array('netasq_model'),
    		 'device.netasq_model_id = netasq_model.id',array('name'))
    		->where("serial_number= ?", $data['serial_number'])
                    ->where("name= ?", $data['name'])
    		->where("id != ?", $data['id']);
    		return $this->fetchRow($select);
     
    }
    merci d'avance.

  8. #8
    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
    Il ya rien qui te dérange ici ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    $ar_data['name'] = $value;
    $ar_data['serial_number'] = $value;
     
    $modelextract = str_replace("-","",$ar_data['name']);
    $modelserie = substr($ar_data['serial_number'], 0, -10);
    en gros tu crées un tableau de $ar_data en y mettant exactement la même valeur

    puis tu manipules je ne sais quoi (ai pas les valeurs).

    tu aurais autant de chance de faire $value == $value

    en gros tu te regardes dans un miroir et tu demandes si c'est toi.

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    le name correspond au nom du model et l'id est l'id du device que je récupère en get.

    en fait je me suis repiqué sur mes autres validateurs pour vérifier si une donnée existait déjà dans la table lors d'un update.

    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
    17
    18
    19
    20
    21
    22
    23
     
    <?php
        class Application_Validate_VerificationSerialnumber extends Zend_Validate_Abstract
        {
            const MSG = 'verification_serialnumber'; 
     
            protected $_messageTemplates = array(
                self::MSG => 'Le Numero de serie existe dans la base actuellement'
            );
     
            public function isValid($value, $context = null)
            {
                $value = (string) $value;
                $this->_setValue($value);
    			$ar_data['id'] = $context['id'];  
                $ar_data['serial_number'] = $value;
    			$device = new Application_Model_DbTable_Device();
    			if ($device->verification_serialnumber($ar_data) == 0) return true;
    			$this->_error(self::MSG);
                return false;
     
            }
        }

  10. #10
    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
    dans le serianumber vous passez des valeurs différentes alors que dans le seriel model non !

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    $ar_data['name'] = $value;
    $ar_data['serial_number'] = $value;

    en effet j'ai pas fais attention à cela.
    Mais le truc c'est que je ne vois pas comment récupérer la valeur que je saisi et la comparer avec celle de la table.

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    j'ai remodifié mon isValid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $value = (string) $value;
    $this->_setValue($value);
    $ar_data['id'] = $context['id'];
    $ar_data['name'] = $context['name']; // à la place de value
    $ar_data['serial_number'] = $value;
    $device = new Application_Model_DbTable_Device();
    $modelextract = str_replace("-","",$ar_data['name']);
    $modelserie = substr($ar_data['serial_number'], 0, -10);
    $device->verification_serialmodel($ar_data);
    if($modelextract == $modelserie) return true;
     
    $this->_error(self::MSG);
    return false;
    merci d'avance.

  13. #13
    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
    ceci sert à quoi, parce que tu ne l'utilises pas $device->verification_serialmodel($ar_data);

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    le model change en fonction de l'id que je récupère.
    Car il y a déjà un ajout en amont avant celui là.
    Je l'appelle ajout mais c'est un update bien entendu.
    le model est sais dans un autre formulaire, donc on connait le nom du model dans cet enregistrement.

  15. #15
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    je sais pas, je sais plus. Comment ce je ne l'utilises pas ?

  16. #16
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    ah oui en effet je l'utilises pas, ok.

    En fait la requête je veux m'en servir pour remonter le nom du model de tel enregistrement.

  17. #17
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    mais je vois plus comment faire.

  18. #18
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 118
    Points : 52
    Points
    52
    Par défaut
    Vu que le process a changé entre temps je vais passer par un regex.
    Merci pour tout.

    Cordialement,

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

Discussions similaires

  1. [AC-2003] Compléter une table avec des données d'autres tables
    Par Tchebichef dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 30/11/2012, 11h55
  2. [MySQL] Mettre a jour table avec valeur d'une autre
    Par hugue1 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/03/2011, 13h32
  3. Récupérer la valeur d'une cellule avec fonction sur une autre feuille
    Par rogerlette dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/09/2010, 12h38
  4. Remplir une table avec les données d'autres tables
    Par Beltegeuse dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 09/04/2008, 12h00
  5. créer TRIGGER sur 1 table avec liaison sur 2 autre table
    Par shaka84 dans le forum Développement
    Réponses: 2
    Dernier message: 11/04/2006, 11h10

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