2011-09-04 145 views
0

爲什麼這不起作用:PHP PDO準備語句:bindParam不起作用

public function query($query, $vars = array()) 
{ 
    $link = $this->getLink(); 
    if($link) 
    { 
     $stmt = $link->prepare($query); 
     if($stmt) 
     { 
      if(count($vars)>0) 
      { 
       $count = 1; 
       foreach($vars as $v) 
       { 
        $stmt->bindParam($count, $v); 
        $count++; 
       } 
      } 
      if($stmt->execute()) 
       return $stmt->fetch(PDO::FETCH_ASSOC); 
     } 
    } 
    return false; 
} 

和這個作品:

public function query($query, $vars = array()) 
{ 
    $link = $this->getLink(); 
    if($link) 
    { 
     $stmt = $link->prepare($query); 
     if($stmt) 
     { 
      if($stmt->execute($vars)) 
       return $stmt->fetch(PDO::FETCH_ASSOC); 
     } 
    } 
    return false; 
} 

電話:

$result = $db->query('select * from users where user like ? and email like ?',array('my_user', '[email protected]')); 

與最終編輯代碼:

public function query($query, $vars = array()) 
{ 
    $link = $this->getLink(); 
    if($link) 
    { 
     $stmt = $link->prepare($query); 
     if($stmt) 
     { 
      if(count($vars)>0) 
      { 
       $count = 1; 
       foreach($vars as $v) 
       { 
        $stmt->bindValue($count, $v); 
        $count++; 
       } 
      } 
      if($stmt->execute()) 
       return $stmt->fetch(PDO::FETCH_ASSOC); 
     } 
    } 
    return false; 
} 

回答

2

原因是bindParam將一個變量(不是它的值)綁定到一個參數。但是,$v的值隨for循環的每次迭代而變化,因此每個查詢參數都將數組中的最後一項作爲它們的值(而不是您想要的)。

我會建議使用的bindValue代替bindParam

1

我不是非常熟悉PDO,但似乎你不能綁定其不斷變化的變量。改爲使用bindValue。

另外請注意,你不應該這樣使用LIKE。改爲使用=