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

ORM PHP Discussion :

SQLSTATE[HY093]: Invalid parameter number


Sujet :

ORM PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 36
    Points : 26
    Points
    26
    Par défaut SQLSTATE[HY093]: Invalid parameter number
    Bonjour,

    Quand j'essaye de récupérer une valeur dans ma table avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $utilisateur = Doctrine_Core::getTable('Utilisateur')->findOneByEmail($request->getParameter('mailEnter'));
    Je ne sais pas pourquoi la requête générée par symfony est comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT u.id AS u__id, u.login AS u__login, u.nom AS u__nom, u.prenom AS u__prenom, u.password AS u__password, u.email AS u__email, u.level AS u__level, u.created_at AS u__created_at, u.updated_at AS u__updated_at FROM utilisateur u WHERE (u.email = ?) LIMIT 1 - (ahmed.guemmi@gmail.com, 66102e571b3fed662a002d0a88c141a5)
    La deuxième valeur est du Csfr token je pense mais j'ai bien définis dans ma classe formulaire passForm.class.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $this->widgetSchema->setNameFormat('mailEnter[%s]');

    Ma classe passForm.class.php:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     <?php
     
     
     class PassForm extends sfForm
    {
      public function configure()
      {
     
     
    	// $this->setWidgets(array('mailEnter'=> new sfWidgetFormInput()));
    	 $this->widgetSchema['mailEnter'] = new sfWidgetFormInputText();
    	 $this->widgetSchema->setNameFormat('mailEnter[%s]');
     
    	$this->validatorSchema['mailEnter'] = new sfValidatorPass();  
    	$this->widgetSchema->setLabels(array(
          'mailEnter'   => "Enter your mail",
     
    	));
    	/*$this->validatorSchema['email'] = new sfValidatorAnd(array(
          new sfValidatorString(array('max_length' => 50)),
          new sfValidatorEmail(array(), array('invalid' => 'The email address is invalid.')),
          
        ));*/
     
    	$this->validatorSchema->setPostValidator(
        new sfValidatorCallback(array('callback'=> array($this, 'checkEmail')))
        );
      }
     
      public function checkEmail($validator, $values) {
           $this->widgetSchema->setNameFormat('mailEnter[%s]');
     
    		if (!empty($values['mailEnter']) ) {
     
    			$utilisateur = Doctrine::getTable('utilisateur')->findOneByEmail($values['mailEnter']);
    			if ($utilisateur) {
     
    			    if ($utilisateur->getEmail() == $values['mailEnter']) {
    			    	// Login correct !
     
    					//if ($utilisateur->getEtat() == 1) {
    						//$password="westsida";
    						$password = substr(md5(rand(100000, 999999)), 0, 6);
                            $utilisateur->setPassword("$password");	
    						$utilisateur->save();						
    						return $values;	
    				//	}
    					/*else {
    						if ($utilisateur->getEtat() == 0) {
    							throw new sfValidatorError($validator, 'Your account is still disabled. Please click on the confirmation email to activate your account.');
    						}
    						else {
    							throw new sfValidatorError($validator, 'You are bannished from the website.');
    						}
    					}*/
     
     
    	            } else {
    	            	// Connexion incorrecte
    	                throw new sfValidatorError($validator, 'Email incorrect');
    	            }
    			}
    			else {
    				 throw new sfValidatorError($validator, 'This Email doesnt exists');
    			}
            }
        }
     
    }

    Mon template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <form action="<?php echo url_for('mailChecker') ?>" method="POST">
      <table>
        <?php echo $form5 ?>
        <tr>
          <td colspan="2">
            <input type="submit" />
          </td>
        </tr>
      </table>
    </form>
    Mon action :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
      public function executeCheckMail(sfWebRequest $request)
    {
       $this->form5 = new PassForm();
       $utilisateur = Doctrine_Core::getTable('Utilisateur')->findOneByEmail($request->getParameter('mailEnter'));
      // $var=$request->getParameterHolder()->getAll();
       $var1=$var;
     
        $utilisateur = Doctrine_Core::getTable('Utilisateur')->findOneByEmail($var["mailEnter"]);
        $this->form5->bind($var);
     
        if ($this->form5->isValid())
        {
     
    		/*$q = Doctrine_Query::create() 
                           ->from('utilisateur u') 
                           ->where('u.Email=?', $request->getParameter('mailEnter')); 
        $user1 = $q->execute();
    	$test=$user1->Utilisateur_id;	
     
    		$password = substr(md5(rand(100000, 999999)), 0, 6);
    		//$password="westsida";
         //$utilisateur->setPassword($password);*/
     
    	  $message = Swift_Message::newInstance('My subject')
    					->setFrom('ahmed.guemmi@gmail.com')
    					->setTo('ahmed.guemmi@gmail.com')
    					->setBody(
    'Your new Password is: '.$password
    );
    $this->getMailer()->send($message);
     
     
    }
    else{
     
    $this->setTemplate("pass");
      }
     
    }

    Merci d'avance.

  2. #2
    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
    Il le met vu que tu le lui demande...

    En effet, dans le paramètre de find de ta requête tu lui mets :
    $request->getParameter('mailEnter')

    Hors dans ton form, le modèle de nom est :
    $this->widgetSchema->setNameFormat('mailEnter[%s]');

    Donc tu vas avoir un tableau "mailEnter" avec un élément par champ. A priori, tu n'as qu'un champ et le token CSFR.

    La confusion vient du fait que ton champ porte le même nom que la racine du modèle de nom du form.

    Pour ne récupérer que ton champ, utilise la commande :
    $request->getParameter("mailEnter['mailEnter']")
    attention aux ' et aux "

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Merci michel pour ta réponse, par contre maintenant j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    You must specify the value to findOneBy
    Après avoir changé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $this->widgetSchema->setNameFormat('mail[%s]');
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $utilisateur = Doctrine_Core::getTable('Utilisateur')->findOneByEmail($request->getParameter("mail['mailEnter']"));
    Comme s'il reconnait même pas "mail['mailEnter']"
    Ce qui me semble bizard c'est que j'ai déjà fait presque la même chose pour un autre formulaire mais ça marchait il rajoutait pas le champs "csrf token"
    et je faisais la récupération direct sur le nom du champs sans mettre un tableau.

    Merci d'avance.

  4. #4
    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
    Il est possible que, pour l'autre formulaire réalisé, tu aies construit le formulaire directement et donc utilisé les nom simple pour ton form.

    En fait, je n'ai jamais essayé de récupéré directement ainsi les données.

    Essaye de passer par un array intermédiaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $mail = $request->getParameter('mail');
    $utilisateur = Doctrine_Core::getTable('Utilisateur')->findOneByEmail($mail['mailEnter']");

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    ça marche toujours pas la même erreur

  6. #6
    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
    [mode debug brutal = on]
    entre les deux ligne tu lui mets un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'XXX' . $mail['mailEnter'] .'XXX'
    Il affiche quoi entre les 'X' ?
    [mode debug brutal = off]

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Points : 114
    Points
    114
    Par défaut
    tente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $utilisateur = Doctrine_Core::getTable('Utilisateur')->findOneByEmail($request->getpostParameter("mail['mailEnter']"));

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/04/2015, 10h16
  2. [PDO] Erreur execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables
    Par Aaymeric91 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 30/09/2013, 17h27
  3. Réponses: 3
    Dernier message: 22/05/2013, 13h06
  4. Réponses: 6
    Dernier message: 03/06/2010, 10h09
  5. Réponses: 3
    Dernier message: 25/08/2009, 23h25

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