Как я могу просто вернуть объекты в PDO? - PullRequest
4 голосов
/ 14 апреля 2009

Испытание PDO в первый раз.

$dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);

$stmt = $dbh->query("SELECT * FROM animals");
$stmt->setFetchMode(PDO::FETCH_INTO, new animals);

foreach($stmt as $animals)
{
    echo $animals->name;
}

Если я пропущу метод setFetchMode(), мне нужно вызвать $animals["name"], который мне не нужен.

Но я не хочу вызывать setFetchMode() для каждого запроса, который я делаю.

Есть ли способ установить FetchMode по умолчанию? Или какой-то другой способ заставить query() возвращать объекты с одним глобальным параметром.

Ответы [ 2 ]

7 голосов
/ 14 апреля 2009

Возможно, вы могли бы попытаться расширить класс PDO для автоматического вызова функции для вас ... вкратце:

class myPDO extends PDO
{
   function animalQuery($sql)
   {
     $result = parent::query($sql);
     $result->setFetchMode(PDO::FETCH_INTO, new animals);
     return $result;
   }

//   // useful if you have different classes
//   function vegetableQuery($sql)
//   {
//     $result = parent::query($sql);
//     $result->setFetchMode(PDO::FETCH_INTO, new vegetables);
//     return $result;
//   }
}

$dbh = new myPDO("mysql:host=$hostname;dbname=animals", $username, $password);

$stmt = $dbh->animalQuery("SELECT * FROM animals");

foreach($stmt as $animals)
{
    echo $animals->name;
}
4 голосов
/ 04 марта 2011

Поскольку PDO необходимо знать, в какой объект вы хотите извлечь, вам нужно будет указать его вручную. Но если вы просто хотите использовать объект для извлечения данных, а не массив, и вам все равно, если это не животный объект, вы можете использовать анонимные объекты по умолчанию, когда вы устанавливаете атрибут после строки подключения, что может быть сделано в упакованный конструктор

  $connection = new PDO($connection_string);
  //PDO::FETCH_OBJ: returns an anonymous object with property names that correspond to the column names returned in your result set 
  $connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); 

Тогда все запросы будут возвращать объекты. Хотя это не совсем то, что вы хотите, чтобы его закрыть.


Вы также можете добавить данные в свой класс животных:

while($dataObj = ...) {
 $animal = new Animal($dataObj);
}

Если вы посмотрите на функцию запроса, можно изменить некоторые параметры, передав дополнительные параметры: http://www.php.net/manual/en/pdo.query.php Я не проверял это, но похоже, что он приближает вас к тому, что вы хотите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...