2014-06-07 77 views
0

我都要让我的生活更容易一点像在这个帖子:Foreaching PDO bindValue/BindParam

PDO::bindParam in a foreach loop, all values are being set as the same?

其他几人......

我试过几个变种把我的代码工作(见消息),但没有结果,我要在我的类方法:

public function getMessages($locationId, $name) { 
    if(!empty($name)) { 

     $query = 'SELECT * FROM (SELECT * FROM sms WHERE location_id=:locationId ORDER BY id DESC LIMIT 5) AS SOURCE ORDER BY id ASC'; 
     $parameters = array(':locationId' => $locationId); 

     $row = $this->returnDataObject($query, $parameters); 

     while ($row) { 
      $this->fetchData($row, $biggestId, $name); 
     } 

     $this->updateSessionKey($locationId, $name); 
    } 
} 

另:

public function returnDataObject($query, $parameters) { 
    var_dump($query); 
    var_dump($parameters); 

    $dataObject = $this->dbh->prepare($query); 

    foreach ($parameters as $key => &$value) { 
     $dataObject->bindParam($key, $value); 
    } 

    $dataObject->execute(); 
    $row = $dataObject->fetch(PDO::FETCH_OBJ); 

    return $row; 

}

我尝试:

foreach ($parameters as $key => &$value) { 
and: 
foreach ($parameters as $key => $value) { 

我尝试:

$dataObject->bindParam($key, $value); 
and: 
$dataObject->bindValue($key, $value); 

我还试图在方法的getMessages死( '我在的getMessages方法'); 但我不能那么远...

我应该做什么不同,以获得此代码的工作?

我感谢任何帮助!


编辑:

我的坏与biggestId但在宣布biggestId:

$biggestId = $this->getBiggestId($locationId); 

但固定没有解决整个问题。这第一种方法的工作原理perfictly如果是:

public function getMessages($locationId, $name) { 
    if(!empty($name)) { 
     $biggestId = $this->getBiggestId($locationId); 

     $messages = $this->dbh->prepare('SELECT * FROM (SELECT * FROM sms WHERE location_id=:locationId ORDER BY id DESC LIMIT 5) AS SOURCE ORDER BY id ASC'); 
     $messages->bindParam(':locationId', $locationId); 
     $messages->execute(); 

     while ($row = $messages->fetch(PDO::FETCH_OBJ)) { 
      $this->fetchData($row, $biggestId, $name); 
     } 

     $_SESSION[$name] = $biggestId; 
    } 
} 

,但我想使用的方法,所以我不必bindParam/BindValue manualy,returnDataObject方法的功能将让我的生活更轻松...

+0

哪里biggestId从何而来?不应该是locationId?你也应该使用fetchAll,因为你需要数组 – meda

+0

我修复了这个问题,但这不是大问题的原因。方法returnDataObject仍然不起作用...我的代码完美工作,而不使用这种方法,但方法会让我的生活更轻松... – user2812532

+0

fetchData导致没有问题,因为它没有使用returnDataObject它的工作,因为它... – user2812532

回答

2

做如下修改:

  • 使用fetchAll()代替fetch()
  • 由于fetchAll()使用,使用foreach RA比一个while循环。

returnDataObject:

public function returnDataObject($query, $parameters) { 
    $dataObject = $this->dbh->prepare($query); 

    foreach ($parameters as $key => &$value) { 
     $dataObject->bindParam($key, $value); 
    } 

    $dataObject->execute(); 
    $rows = $dataObject->fetchAll(PDO::FETCH_OBJ); 

    return $rows; 
} 

的getMessages:

public function getMessages($locationId, $name) { 
    if(!empty($name)) { 

     $query = 'SELECT * FROM (SELECT * FROM sms WHERE location_id=:locationId ORDER BY id DESC LIMIT 5) AS SOURCE ORDER BY id ASC'; 
     $parameters = array(':locationId' => $locationId); 

     $rows = $this->returnDataObject($query, $parameters); 

     foreach($rows as $row) { 
      $this->fetchData($row, $biggestId, $name); 
     } 

     $this->updateSessionKey($locationId, $name); 
    } 
} 
+0

绝对完美的所有functionallity作品!非常感谢!现在我有这种方法... – user2812532

+0

@ user2812532欢迎您,记得批准我的答案;) – meda