number of bound variables does not match number of tokens
ik heb de volgende code:
Code (php)
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
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();
}
{
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?
Daarnaast is de controle met empty() een zinloze actie, pas correcte controle toe met trim() == '' of trim() != ''
maar het aantal binds klop toch als $pass niet empty is? En je hebt helemaal gelijk wat betreft de controle.
dat is nu maar net de vraag, want je doet altijd ongeacht toch bindParam
Hoe bedoel je?
het prepared statement moet altijd evenveel bind's hebben als dat je bindParams hebt. Jij hebt altijd 5x een bindParam
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 -