Прогнозирование PDO bindValue / BindParam

Я хотел сделать мою жизнь немного проще, как в этом посте:

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"); Но я не мог зайти так далеко...

Что я должен сделать по-другому, чтобы этот код работал?

Я ценю любую помощь!


РЕДАКТИРОВАТЬ:

Мой плохой с bigId, но объявляет bigId:

$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 облегчит мою жизнь...

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);
    }
}
Другие вопросы по тегам