query functie aanroepen uit PDO class
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)
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
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;
}
}
?>
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
global te doen.
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).
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 Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
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);
}
}
$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
hier vinden.
De link van Rob over Dependency Injection is wel handig, maar wat informatie over hoe je dit in PHP kan implementeren kan je 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.
Ik zie dat je nog niets hebt gedaan met mijn 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.
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
lastInsertId() zou gewoon moeten werken?
Waarom denk je dit?
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