query functie aanroepen uit PDO class

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

John Brat

John Brat

05/01/2019 11:05:50
Quote Anchor link
Hoi,
Ik heb onderstaande pdo Class en contacts class
nu wil ik in de functie getcontacts() de functie query() uit de database class aanroepen die het resultaat uit deze query teruggeeft.

Ik heb van alles geprobeerd maar denk dat ik iets over het hoofd zie.
iemand tips over wat ik op de vraagtekens moet plaatsen om dit voor elkaar te krijgen?

class.database.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
include ('config.php');

class database extends PDO {
  
  private $log;
  public $debug = FALSE;

  //
  // Constructor - Create database connection
  //

  function __construct($dblogin)
  {

    // Exception afvangen, anders komen de logingegevens in tekst als foutmelding!
    try
    {
      PDO::__construct('mysql:host=localhost;dbname='.$dblogin['db'], $dblogin['user'], $dblogin['pass']);
      //parent::__construct('mysql:host=127.0.0.1;dbname='.$dblogin['db'], $dblogin['user'], $dblogin['pass']);
      $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    catch (PDOException $e)
    {

      if ($this->debug) echo $e->getMessage();
    }
  }


  //
  // Execute query.
  //

  function query($sql)
  {

    $starttime = microtime(TRUE);
    try
    {
       $stmt = parent::query($sql);
       $stmt->execute();
       $results = $stmt->fetchAll();
    }

    catch (PDOException $e)
    {

      if ($this->debug) echo $e->getMessage();
    }

    $this->log[] = array('sql'=>$sql,'time'=>microtime(TRUE)-$starttime);
    return (isset($results)) ? $results : NULL;
  }

  //
  // Show table with executed queries and execution times
  //

  function showLog()
  {

    $html = '<table border="1">';
    foreach ($this->log as $item)
      $html.= '
        <tr>
          <td>'
.sprintf('%10.2f',1000*$item['time']).' ms</td>
          <td><pre>'
.$item['sql'].'</pre></td>
        </tr>'
;
    $html .= '</table>';
    return $html;  
  }
}

?>


contacts_model.php

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

class contacts {

public function getcontacts()
  {

    
    $sql = "SELECT * from contacts";
    ????????????function
query($sql)??????????????
    return ?????resultaat van de query??????
  }
}

?>
 
PHP hulp

PHP hulp

22/12/2024 22:02:29
 
Rob Doemaarwat

Rob Doemaarwat

05/01/2019 13:09:03
Quote Anchor link
Ik neem aan dat je ergens een instantie van je database class aanmaakt. Die zul je dan in je contacts beschikbaar moeten maken. De simpelste (maar niet de meeste nette ...) manier is om dit gewoon met een global te doen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
//ergens in je initialisatie
$db = new database(['db' => '...','user' => '...','pass' => '...']);

//in contacts_model.php

public function getcontacts()
  {
    global $db;
    
    $sql = "SELECT * from contacts";
    return $db->query($sql);
  }
}

Zoals gezegd: niet netjes, werkt wel. Voor de volledigheid ook een linkje naar dependency injection (= netter, maar zoals altijd zijn er meerdere wegen die naar Rome leiden).
Gewijzigd op 05/01/2019 13:09:59 door Rob Doemaarwat
 
- Ariën  -
Beheerder

- Ariën -

05/01/2019 13:11:30
Quote Anchor link
De link van Rob over Dependency Injection is wel handig, maar wat informatie over hoe je dit in PHP kan implementeren kan je hier vinden.
 
Thomas van den Heuvel

Thomas van den Heuvel

05/01/2019 16:55:11
Quote Anchor link
Ik zie dat je nog niets hebt gedaan met mijn suggesties. In de DSN ontbreekt een charset en is je host hard coded.

Wellicht doe je er ook verstandig aan om zoveel mogelijk PDO::MYSQL_-directives expliciet in te stellen.

Die PDO::__construct() geeft een PDO-object terug. Zou je die niet als protected/private klasse variabele moeten onthouden? Nu extend "database" (hoofdletter?) rechtstreeks PDO. Dit houdt dus in dat je op dit moment "database" gewoon als PDO-object kunt gebruiken... Wat is dan precies het nut van "database"? Dit is haast niet eens een wrapper omdat het geen PDO-functionaliteit afschermt.

Enne, je lijkt hier prepared statements helemaal overboord te hebben gegooid? Waar behandel je apart parameters? Ik zou in de query() methode op zijn minst een tweede argument verwachten? Waarom gebruik je uberhaupt PDO?

En ja, dependency injection dus.
 
John Brat

John Brat

06/01/2019 14:43:32
Quote Anchor link
Hoi Thomas,
Ik ben heel erg blij met je suggesties en ben er hard mee aan het werk.
mijn host gaat eind januari over naar php V7.2 en mijn site heb ik jaren geleden geschreven dus probeer even snel alles om te zetten naar PDO. Waarom PDO? ik kan ook kiezen voor Mysqli maar ik denk dat PDO mysqli gaat overleven.

Brengt me op de volgende vraag:
ik gebruikte voorheen mysql_insert_id() om het id op te halen van een zojuist ingevoerd database veld, maar dit lijkt in PDO ook niet meer te werken.
nog een suggestie?

bvd
 
Thomas van den Heuvel

Thomas van den Heuvel

06/01/2019 15:31:18
Quote Anchor link
lastInsertId() zou gewoon moeten werken?

John Brat op 06/01/2019 14:43:32:
ik kan ook kiezen voor Mysqli maar ik denk dat PDO mysqli gaat overleven.

Waarom denk je dit?
Gewijzigd op 06/01/2019 17:10:13 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.