2014-06-07 79 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