1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Graze\DataDb\Adapter; |
4
|
|
|
|
5
|
|
|
use Graze\DataDb\Dialect\DialectInterface; |
6
|
|
|
use PDO; |
7
|
|
|
use PDOStatement; |
8
|
|
|
use Traversable; |
9
|
|
|
|
10
|
|
|
class PdoAdapter implements AdapterInterface |
11
|
|
|
{ |
12
|
|
|
/** @var PDO */ |
13
|
|
|
private $pdo; |
14
|
|
|
/** @var DialectInterface */ |
15
|
|
|
private $dialect; |
16
|
|
|
|
17
|
|
|
/** |
18
|
|
|
* @param PDO $pdo |
19
|
|
|
* @param DialectInterface $dialect |
20
|
|
|
*/ |
21
|
|
|
public function __construct(PDO $pdo, DialectInterface $dialect) |
22
|
|
|
{ |
23
|
|
|
$this->pdo = $pdo; |
24
|
|
|
$this->dialect = $dialect; |
25
|
|
|
} |
26
|
|
|
|
27
|
|
|
/** |
28
|
|
|
* @param string $sql |
29
|
|
|
* @param array $bind |
30
|
|
|
* |
31
|
|
|
* @return mixed |
32
|
|
|
*/ |
33
|
|
|
public function query($sql, array $bind = []) |
34
|
|
|
{ |
35
|
|
|
$statement = $this->pdo->prepare($sql); |
36
|
|
|
return $statement->execute($bind); |
37
|
|
|
} |
38
|
|
|
|
39
|
|
|
/** |
40
|
|
|
* @param string $sql |
41
|
|
|
* @param array $bind |
42
|
|
|
* @param array $options Extra set of options to pass to prepare |
43
|
|
|
* |
44
|
|
|
* @return PDOStatement |
45
|
|
|
*/ |
46
|
|
|
private function prepareQuery($sql, array $bind = [], array $options = []) |
47
|
|
|
{ |
48
|
|
|
$statement = $this->pdo->prepare($sql, $options); |
49
|
|
|
foreach ($bind as $key => $value) { |
50
|
|
|
$statement->bindValue($key, $value); |
51
|
|
|
} |
52
|
|
|
return $statement; |
53
|
|
|
} |
54
|
|
|
|
55
|
|
|
/** |
56
|
|
|
* @param string $sql |
57
|
|
|
* @param array $bind |
58
|
|
|
* |
59
|
|
|
* @return Traversable |
60
|
|
|
*/ |
61
|
|
|
public function fetch($sql, array $bind = []) |
62
|
|
|
{ |
63
|
|
|
$iterator = $this->prepareQuery($sql, $bind, [PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false]); |
64
|
|
|
return $iterator; |
65
|
|
|
} |
66
|
|
|
|
67
|
|
|
/** |
68
|
|
|
* @param string $sql |
69
|
|
|
* @param array $bind |
70
|
|
|
* |
71
|
|
|
* @return array |
72
|
|
|
*/ |
73
|
|
|
public function fetchAll($sql, array $bind = []) |
74
|
|
|
{ |
75
|
|
|
return $this->prepareQuery($sql, $bind)->fetchAll(); |
76
|
|
|
} |
77
|
|
|
|
78
|
|
|
/** |
79
|
|
|
* @param string $sql |
80
|
|
|
* @param array $bind |
81
|
|
|
* |
82
|
|
|
* @return array|bool |
83
|
|
|
*/ |
84
|
|
|
public function fetchRow($sql, array $bind = []) |
85
|
|
|
{ |
86
|
|
|
return $this->prepareQuery($sql, $bind)->fetch(); |
87
|
|
|
} |
88
|
|
|
|
89
|
|
|
/** |
90
|
|
|
* @param string $sql |
91
|
|
|
* @param array $bind |
92
|
|
|
* |
93
|
|
|
* @return mixed |
94
|
|
|
*/ |
95
|
|
View Code Duplication |
public function fetchOne($sql, array $bind = []) |
|
|
|
|
96
|
|
|
{ |
97
|
|
|
$row = $this->fetchRow($sql, $bind); |
98
|
|
|
if ($row) { |
99
|
|
|
return $row[0]; |
100
|
|
|
} |
101
|
|
|
|
102
|
|
|
return false; |
103
|
|
|
} |
104
|
|
|
|
105
|
|
|
/** |
106
|
|
|
* @param mixed $value |
107
|
|
|
* |
108
|
|
|
* @return string |
109
|
|
|
*/ |
110
|
|
|
public function quoteValue($value) |
111
|
|
|
{ |
112
|
|
|
return $this->pdo->quote($value); |
113
|
|
|
} |
114
|
|
|
|
115
|
|
|
/** |
116
|
|
|
* Start a transaction |
117
|
|
|
* |
118
|
|
|
* @return static |
119
|
|
|
*/ |
120
|
|
|
public function beginTransaction() |
121
|
|
|
{ |
122
|
|
|
$this->pdo->beginTransaction(); |
123
|
|
|
return $this; |
124
|
|
|
} |
125
|
|
|
|
126
|
|
|
/** |
127
|
|
|
* @return static |
128
|
|
|
*/ |
129
|
|
|
public function commit() |
130
|
|
|
{ |
131
|
|
|
$this->pdo->commit(); |
132
|
|
|
return $this; |
133
|
|
|
} |
134
|
|
|
|
135
|
|
|
/** |
136
|
|
|
* @return static |
137
|
|
|
*/ |
138
|
|
|
public function rollback() |
139
|
|
|
{ |
140
|
|
|
$this->pdo->rollBack(); |
141
|
|
|
return $this; |
142
|
|
|
} |
143
|
|
|
|
144
|
|
|
/** |
145
|
|
|
* @return DialectInterface |
146
|
|
|
*/ |
147
|
|
|
public function getDialect() |
148
|
|
|
{ |
149
|
|
|
return $this->dialect; |
150
|
|
|
} |
151
|
|
|
} |
152
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.