0

我想让我的生活更轻松一些,就像在这篇文章中一样:

PDO::bindParam 在 foreach 循环中,所有值都设置为相同吗?

还有其他几个...

我尝试了几种变体来让我的代码工作(查看消息)但没有结果我必须在我的类中使用方法:

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 方法中');但我没能走到那一步……

我应该做些什么不同的事情来让这个代码工作?

我很感激任何帮助!


编辑:

我对最大 ID 不好,但声明最大 ID:

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

但解决这个问题并不能解决整个问题。如果是,第一种方法可以完美地工作:

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,returnDataObject 方法的功能将使我的生活更轻松......

4

1 回答 1

2

进行以下更改:

  • 使用fetchAll()而不是fetch()
  • 既然fetchAll()使用了,就使用 aforeach而不是while循环。

返回数据对象:

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;
}

获取消息:

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);
    }
}
于 2014-06-07T18:57:10.470 回答