Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[PHP/PDO] Welk resultaattype: array, stdClass of PDORow?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben me wat aan het verdiepen in de verschillende fetch mogelijkheden met PDO en Mysql.

Voor mezelf ben een reminder aan het maken zodat ik het nooit meer hoef te vergeten in de toekomst en dit aan de hand van voorbeelden die ik voor mezelf maak.

Ik heb bvb :

PHP:
1
2
3
4
5
6
7
8
9
10
11
require('incl/connect.inc.php');
$stmt = $db->prepare ('SELECT visit_name, visit_firstname FROM visitor');
$stmt->execute();

$result = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($result);
# GEEFT DIT:
# Array ( 
#           [visit_name] => Moveir 
#           [visit_firstname] => Peter 
#        )


PHP:
1
2
3
4
5
6
7
8
$result = $stmt->fetch(PDO::FETCH_LAZY);
print_r($result);
#GEEFT DIT
# PDORow Object ( 
#           [queryString] => SELECT visit_name, visit_firstname FROM visitor 
#           [visit_name] => Mortier 
#           [visit_firstname] => Jurgen 
#                )


PHP:
1
2
3
4
5
6
7
$result = $stmt->fetch(PDO::FETCH_OBJ);
print_r($result);
# GEEFT DIT
# stdClass Object ( 
#           [visit_name] => Verwijl
#           [visit_firstname] => Henk 
#                  ) 


Alle 3 hebben ze hetzelfde result maar toch is de ene een ARRAY de andere PDORow Object en nog een andere stdClass Object. Wat is nu het verschil tussen de 3? Waarom zou je de ene kiezen en waarom de andere? :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Arrays hebben een lagere memory footprint, stdClass net iets meer en een PDORow nog veel meer. Arrays en standaardobjecten zijn redelijk vergelijkbaar en zijn vooral persoonlijke voorkeur. Een PDORow biedt extra functionaliteit die je al dan niet nodig kan hebben.

Gebruik var_dump in plaats van print_r en je ziet een stuk duidelijker wat het verschil is. ;)

Je hoeft trouwens niet te schreeuwen in je topictitel. ;)

[ Voor 13% gewijzigd door NMe op 02-02-2014 01:44 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
NMe schreef op vrijdag 31 januari 2014 @ 17:23:
Arrays hebben een lagere memory footprint, stdClass net iets meer en een PDORow nog veel meer. Arrays en standaardobjecten zijn redelijk vergelijkbaar en zijn vooral persoonlijke voorkeur. Een PDORow biedt extra functionaliteit die je al dan niet nodig kan hebben.

Gebruik var_dump in plaats van print_r en je ziet een stuk duidelijker wat het verschil is. ;)

Je hoef trouwens niet te schreeuwen in je topictitel. ;)
Thx voor de duidelijke antwoorden! Sorry voor de korte titel was niet de bedoeling, heb door jullie al veel bijgeleerd dus zou ik eerder heel beleefd omgaan :)

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 22-11 19:50
In principe is performance relevant maar niet als eerste. Het gaat veelal over encapsulation. Je wilt dat onderdelen niet teveel van elkaar weten zodat ze herbruikbaar zijn etc.

Als je daar op gaat zoeken kom je interessante voorbeelden tegen.

Ook interessant is om te kijken hoe grotere frameworks dit doen. Bijvoorbeeld CakePHP gaat van arrays (in versie 2) naar classes (in versie 3). Als je mailinglists leest zie je hoe dat werkt.

Je hebt nog een 4e variant die ik interessant vind:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php 
//models (eigen classes die ook daadwerkelijk iets betekenen)
class Visitor {
  public $visit_name;
  public $visit_firstname;
  
  public function getMyName() {
    return 'Your name is: '.$this->visit_name;
  }
}

//data laag
require('incl/connect.inc.php'); 
$stmt = $db->prepare ('SELECT visit_name, visit_firstname FROM visitor'); 
$stmt->execute(); 

$VisitorOne = $stmt->fetch(PDO::FETCH_CLASS, 'Visitor');
var_dump($VisitorOne); 
var_dump($VisitorOne->getMyName());

Verwijderd

@DJluc

Ik wist niet eens dat PDO dit kon, best nice en doet me denken aan een soort ActiveRecord oplossing of iets dat vergelijkbaar is met Zend's DbTable implementatie.

In mijn eigen framework heb ik vooral voor het gemak ook een dergelijke implementatie waarbij een model een directe representatie van een table of een rij in die table is. Je kunt dan bijvoorbeeld doen :
code:
1
2
3
$userModel->fetchAll( $userModel->select()->where( array('username' => 'thioz') );

maar tegelijk ook : $db->fetchAll( $userModel->select() );


@Raz3rt : waarom je voor optie X zou kiezen boven optie Y ...

naast performance/cost redenen heeft het natuurlijk ook met smaak te maken en hoe de rest van je code om gaat met data.

bijvoorbeeld als alle classes/objecten binnen je code een array verwachten, dan zou ik niet snel kiezen voor een methode die stdClasses terugggeeft want die kost je enkel meer code om je data te parsen/casten.