2015-12-30 78 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()