number of bound variables does not match number of tokens

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Roeltje M

Roeltje M

17/07/2010 15:34:35
Quote Anchor link
Hoi,

ik heb de volgende code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
    public function updateUser($user,$pass,$pass2,$name,$email,$id)
    {
        if(strlen($user) < 3)
            throw new InvalidCategoryException ('Gebruikersnaam moet 3 tekens of meer bevatten');
        if(strlen($name) < 5)
            throw new InvalidCategoryException ('Volledige naam moet 5 tekens of meer bevatten');        
        if(!empty($pass) && !empty($pass2))
        {
            if(strlen($pass) < 5)
                throw new InvalidCategoryException ('Wachtwoord moet 5 tekens of meer bevatten');        
            if($pass != $pass2)
                throw new InvalidCategoryException ('Wachtwoorden zijn niet gelijk');                
        }                
        if(strlen($email) < 6)
            throw new InvalidCategoryException ('E-mailadres moet 6 tekens of meer bevatten');        
        if(!$this->isValidEmail($email))
            throw new InvalidCategoryException ('E-mailadres heeft een onjuist formaat');                    
        
        $query = "UPDATE dxtr_user SET user_name=:naam, user_loginname=:user,".(!empty($pass) && !empty($pass2) ? "user_password:pass," : "")." user_email=:mail WHERE user_id=:id"    ;                                                                                                                
        $stmt = $this->db->prepare($query);        
        $stmt->bindParam(':pass', md5($pass));
        $stmt->bindParam(':naam', $name);    
        $stmt->bindParam(':user', strtolower($user));    
        $stmt->bindParam(':mail', $email);    
        $stmt->bindParam(':id', $id);            
        $stmt->execute();        
    }    


Het is een optie om een wachtwoord in te voeren bij het wijzigen van een gebruiker. Echter, bij het uitvoeren van de query, wanneer ik wél wachtwoorden invoeren, krijg ik de hele tijd deze error:

Quote:
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /home/svcolm01/domains/svcolmschate.nl/public_html/new/includes/functions.inc.php on line 163


Hoe los ik dit op?
 
PHP hulp

PHP hulp

22/12/2024 09:58:34
 
Noppes Homeland

Noppes Homeland

17/07/2010 15:46:26
Quote Anchor link
het aantal bind's wat in je SQL-statement staat moet overeenkomen met het aantal bindParam.

Daarnaast is de controle met empty() een zinloze actie, pas correcte controle toe met trim() == '' of trim() != ''
 
Roeltje M

Roeltje M

17/07/2010 15:50:14
Quote Anchor link
maar het aantal binds klop toch als $pass niet empty is? En je hebt helemaal gelijk wat betreft de controle.
 
Noppes Homeland

Noppes Homeland

17/07/2010 15:53:34
Quote Anchor link
"maar het aantal binds klop toch als $pass niet empty is? "

dat is nu maar net de vraag, want je doet altijd ongeacht toch bindParam
 
Roeltje M

Roeltje M

17/07/2010 15:56:03
Quote Anchor link
Hoe bedoel je?
 
Noppes Homeland

Noppes Homeland

17/07/2010 16:02:23
Quote Anchor link
zoals het geschreven staat

het prepared statement moet altijd evenveel bind's hebben als dat je bindParams hebt. Jij hebt altijd 5x een bindParam
 
Jelmer -

Jelmer -

17/07/2010 20:06:50
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$stmt->bindParam(':pass', md5($pass));

Dit soort aanroepen gaan niet werken, want bindParam wil een variabele als tweede argument omdat hij een reference maakt. Als je de waarde wilt kopiëren zoals normaal bij functies gebeurt (niet helemaal waar, maar zo kan je het wel zien) moet je bindValue gebruiken.

Maar dit zou je als Notice te zien moeten krijgen. Heb je error_reporting = E_ALL en display_errors = on?

(volgens mij mag je trouwens wel variabelen aan je query verbinden via bindParam of bindValue ook al worden ze niet in de query gebruikt, maar als je ze wel in de query gebruikt maar niet verbindt, dan krijg je deze foutmelding)
Gewijzigd op 17/07/2010 20:08:09 door Jelmer -
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.