【问题标题】:Foreaching PDO bindValue / BindParamForeaching PDO bindValue / BindParam
【发布时间】:2014-07-28 18:49:38
【问题描述】:

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

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

我应该怎样做才能让这段代码正常工作?

感谢您的帮助!


编辑:

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

【问题讨论】:

  • 最大标识符从何而来?不应该是locationId吗?您还应该使用 fetchAll 因为您需要数组
  • 我修复了这个问题,但这不是大问题的原因。 returnDataObject 方法仍然不起作用...我的代码在不使用此方法的情况下可以完美运行,但方法会让我的生活更轻松...
  • fetchData 没有问题,因为不使用 returnDataObject 它就可以正常工作......

标签: php pdo foreach bindvalue


【解决方案1】:

进行以下更改:

  • 使用fetchAll() 而不是fetch()
  • 由于使用了fetchAll(),因此请使用foreach 而不是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);
    }
}

【讨论】:

  • 绝对完善所有功能作品!非常感谢!现在我有了这个方法...
  • @user2812532 不客气,记得批准我的回答;)
猜你喜欢
  • 2011-04-13
  • 2013-02-15
  • 2014-08-20
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 2023-03-28
  • 2012-09-05
  • 2014-05-10
相关资源
最近更新 更多