[PHP] hoe werkt PDO:FETCH_INTO?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • chronozphere
  • Registratie: Juli 2006
  • Laatst online: 16-12-2020
Hey,

Ik heb het volgende stuk code bekeken:

http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html#8.7

maar ik heb geen idee wat er nu exact gebeurt. :?

> In het begin word er een nieuwe instantie van animals gemaakt. Waarom?

> Er word één nieuwe instantie van animals doorgegeven aan $stmt->setFetchMode. Wat gebeurt daar verder mee?

> Ik zie aan het gebruikte foreach dat $stmt itereerbaar is. Wat voor elementen bevat $stmt dan?

Alvast bedankt! :)

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

$stmt is een Prepared Statement.

En die fetchmode wil zeggen dat als je itereerd over je uitgevoerde statement, dat voor iedere row een nieuw animal wordt aangemaakt.

http://php.net/manual/en/pdostatement.setfetchmode.php

[ Voor 14% gewijzigd door Snake op 06-03-2010 18:11 ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:56

Creepy

Tactical Espionage Splatterer

Dat aanmaken van een instantie van animals is niet nodig en de naamgeving is erg verwarrend omdat animals 1 animal bevat en niet meerdere. Je vragen over de werking van setFetchMode en het gebruik van dat $stmt worden gewoon uitgelegd in de handleiding van setFetchMode
Pff, die manual is absoluut niet duidelijk, niet gek dat je opzoek gaat naar uitleg. Die tutorial die je volgt is al niet van al te beste kwaliteit maar van de docs van setFetchMode en PDO zelf wordt je ook niet vrolijk.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • chronozphere
  • Registratie: Juli 2006
  • Laatst online: 16-12-2020
Pricies. De documentatie laat te wensen over. ;( En die tutorial is het beste wat ik tot nu toe gevonden heb.

Het is me onduidelijk wat er pricies gebeurd met het object dat je doorgeeft aan setFetchMode(). Het word nergens beschreven.

Ik wilde eigenlijk een method maken die m.b.v FETCH_INTO, alle properties van het object uit de database laadt. Het volgende lijkt te werken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MyClass
{
    //properties hier, net zoals in de gebruikte database table...

    public function loadFromDB($id, $pdo)
    {
         //query voorbereiden
         $stmt = $this->pdo->prepare("SELECT * FROM table WHERE id = :id LIMIT 1" );
                    
        //voeg het gegeven ID in 
         $stmt->bindValue(":id", $id, PDO::PARAM_INT);
                    
        //geef aan dat we de properties in dit object willen laden 
        $stmt->setFetchMode(PDO::FETCH_INTO, $this);
    
         //voer de query uit                
        $stmt->execute();
                    
    //fetch een keer om de data daadwerkelijk te lezen...
    $stmt->fetch();         
    }
}


Dit komt puur voort uit trial'n error en ik begrijp nog steeds niet de ins en outs van setFetchMode(). Wat zou er bijvoorbeeld gebeuren met $this als we meerdere resultaten zouden krijgen?? (andere query dan ;) ).

Wat er tijdens de iteratie (in tutorial) pricies gebeurd weet ik ook niet zeker. Het lijkt me aannemelijk dat er bij elke "stap" fetch() word aangeroepen, maar ik heb er geen informatie over kunnen vinden.

Als iemand hier het fijne van weet, hoor ik het heel graag. ;)

Acties:
  • 0 Henk 'm!

  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 16-09 11:44
Weet niet het fijne, nooit zo gebruikt, maar ik zal een poging doen.
> In het begin word er een nieuwe instantie van animals gemaakt. Waarom?
Die is niet nodig. Het zal als voorbeeld dienen daar.
> Er word één nieuwe instantie van animals doorgegeven aan $stmt->setFetchMode. Wat gebeurt daar verder mee?
Diezelfde instantie wordt gebruikt om de result set in op te slaan bij een fetch. Alleen de inhoud van de properties in de instantie verandert met elke fetch.
> Ik zie aan het gebruikte foreach dat $stmt itereerbaar is. Wat voor elementen bevat $stmt dan?
De $stmt is een instantie van de PDOStatement class, behalve een prepared statement geeft het ook toegang tot de result set via de fetch methods. PDOStatement zelf is itereerbaar (via interface Traversable) en het zal inderdaad een fetch doen voor elke iteratie in de foreach. dit staat eigenlijk nergens, erg fijne documentatie.

De truuk met FETCH_INTO is dat een fetch in die mode de result set opslaat in de public properties van een bestaande instantie van een class (vergelijk het met FETCH_CLASS waar iedere keer een nieuwe instantie van die class wordt gemaakt).

Heb je meer dan 1 rij resultaten en plemp je alles in $this, dan zou dit normaal de vorige resultaten in je $this properties steeds overschrijven bij een fetch. Je zou kunnen gaan stunten met magic function __set om meerdere resultaten op te slaan (lijkt me totaal niet handig, zou dan eerder FETCH_CLASS gebruiken en nog een keer nadenken over je objecten). 1 fetch is geen punt, dat kan altijd (de rest van de resultaten negeren door niet verder te fetchen, maar let dan wel op de volgorde... en het blijft vies).