2015-12-30 92 views
1

这是我的PHP代码:PDO准备更新语句不能正常工作

public function update($table,$fields_and_values,$condition_field,$condition_field_value) 
{ 
    $query="UPDATE $table SET "; 
    foreach($fields_and_values as $field=>$value) $query.=($field."=:".$field." ,"); 
    $query.=" "; 
    $query=str_replace(", "," WHERE ",$query); 
    $query.=($condition_field."='".$condition_field_value."'"); 
    echo $query; 
    $stmt=$this->conn->prepare($query); 
    foreach($fields_and_values as $field=>$value) $stmt->bindParam(":".$field,$value); 
    $stmt->execute(); 
} 

,这是我如何调用该函数在我的课:

$db=new db_connection('localhost','root','','maps'); 
$db->connect(); 
    $arr=array('username'=>'testfromnewclass3','password'=>'123456'); 
    $db->update('users',$arr,'username','term'); 
    $db->disconnect(); 

没关系其他功能像断开连接一样!他们正常工作。
我的问题是,当这个命令执行时,都用户名密码变得123456! 这是我从echo $query得到:

UPDATE users SET username=:username ,password=:password WHERE username='term' 

什么毛病我的功能?如果是的话,我该如何解决它?

+0

调试你的第二环,你有约束力的值(的var_dump是什么,你要检查什么是正在传递的实际值之间PDOStatement::bindValue() )。还有一些提示:使用'bindValue'而不是'bindParam'。 'bindParam'可以改变传递变量的值,它的用途是当存储过程可以返回值,然后这些值包含在你传递的变量中。另外,不要断开与MySQL的连接。你不想那样。您正在以这种方式创建开销。 – Mjh

回答

1

使用$stmt->bindValue($field, $value); 代替$stmt->bindParam(":".$field,$value);

Check this理解差异PDOStatement::bindParam()