1 | <?php |
||
2 | |||
3 | namespace WebStream\Database; |
||
4 | |||
5 | use Doctrine\DBAL\Statement; |
||
6 | use WebStream\Database\Driver\DatabaseDriver; |
||
7 | use WebStream\DI\Injector; |
||
8 | use WebStream\Exception\Extend\DatabaseException; |
||
9 | |||
10 | /** |
||
11 | * Query |
||
12 | * @author Ryuichi TANAKA. |
||
13 | * @since 2013/12/07 |
||
14 | * @version 0.7 |
||
15 | */ |
||
16 | class Query |
||
17 | { |
||
18 | use Injector; |
||
19 | |||
20 | /** |
||
21 | * @var DatabaseDriver データベースコネクション |
||
22 | */ |
||
23 | private DatabaseDriver $connection; |
||
24 | |||
25 | /** |
||
26 | * @var string SQL |
||
27 | */ |
||
28 | private string $sql; |
||
29 | |||
30 | /** |
||
31 | * @var array<mixed> バインドパラメータ |
||
32 | */ |
||
33 | private array $bind; |
||
34 | |||
35 | /** |
||
36 | * @var Statement ステートメント |
||
37 | */ |
||
38 | private Statement $stmt; |
||
39 | |||
40 | /** |
||
41 | * Constructor |
||
42 | * @param DatabaseDriver $connection データベースコネクション |
||
43 | */ |
||
44 | 52 | public function __construct(DatabaseDriver $connection) |
|
45 | { |
||
46 | 52 | $this->connection = $connection; |
|
47 | 52 | } |
|
48 | |||
49 | /** |
||
50 | * SQLを設定する |
||
51 | * @param string SQL |
||
52 | */ |
||
53 | 52 | public function setSql($sql) |
|
54 | { |
||
55 | 52 | $this->sql = $sql; |
|
56 | 52 | } |
|
57 | |||
58 | /** |
||
59 | * バインドパラメータを設定する |
||
60 | * @param array $bind バインドパラメータ |
||
61 | */ |
||
62 | 52 | public function setBind(array $bind) |
|
63 | { |
||
64 | 52 | $this->bind = $bind; |
|
65 | 52 | } |
|
66 | |||
67 | /** |
||
68 | * SELECT |
||
69 | * @return object 取得結果 |
||
70 | */ |
||
71 | 44 | public function select() |
|
72 | { |
||
73 | 44 | $this->logger->debug("execute select."); |
|
74 | 44 | $this->execute(); |
|
75 | 44 | $result = new Result($this->stmt); |
|
76 | 44 | $result->inject('logger', $this->logger); |
|
77 | |||
78 | 44 | return $result; |
|
79 | } |
||
80 | |||
81 | /** |
||
82 | * INSERT |
||
83 | * @return integer 処理結果件数 |
||
84 | */ |
||
85 | 20 | public function insert() |
|
86 | { |
||
87 | 20 | $this->logger->debug("execute insert."); |
|
88 | |||
89 | 20 | return $this->execute(); |
|
90 | } |
||
91 | |||
92 | /** |
||
93 | * UPDATE |
||
94 | * @return integer 処理結果件数 |
||
95 | */ |
||
96 | 4 | public function update() |
|
97 | { |
||
98 | 4 | $this->logger->debug("execute update."); |
|
99 | |||
100 | 4 | return $this->execute(); |
|
101 | } |
||
102 | |||
103 | /** |
||
104 | * DELETE |
||
105 | * @return integer 処理結果件数 |
||
106 | */ |
||
107 | 20 | public function delete() |
|
108 | { |
||
109 | 20 | $this->logger->debug("execute delete."); |
|
110 | |||
111 | 20 | return $this->execute(); |
|
112 | } |
||
113 | |||
114 | /** |
||
115 | * SQLを実行する |
||
116 | * @return integer 結果件数 |
||
117 | */ |
||
118 | 52 | private function execute() |
|
119 | { |
||
120 | 52 | unset($this->stmt); |
|
121 | |||
122 | try { |
||
123 | 52 | $stmt = $this->connection->getStatement($this->sql); |
|
124 | 52 | if ($stmt === false) { |
|
125 | throw new DatabaseException("Can't create statement: " . $this->sql); |
||
126 | } |
||
127 | 52 | $this->logger->info("Executed SQL: " . $this->sql); |
|
128 | 52 | foreach ($this->bind as $key => $value) { |
|
129 | 36 | $this->logger->info("Bind statement: $key => $value"); |
|
130 | 36 | if (preg_match("/^[0-9]+$/", $value) && is_int($value)) { |
|
131 | 16 | $stmt->bindValue($key, $value, \PDO::PARAM_INT); |
|
132 | } else { |
||
133 | 24 | $stmt->bindValue($key, $value, \PDO::PARAM_STR); |
|
134 | } |
||
135 | } |
||
136 | |||
137 | 52 | if ($stmt->execute()) { |
|
138 | 52 | $this->stmt = $stmt; |
|
139 | 52 | return $stmt->rowCount(); |
|
140 | } else { |
||
141 | $messages = $stmt->errorInfo(); |
||
0 ignored issues
–
show
|
|||
142 | $message = $messages[2]; |
||
143 | $sqlState = "(SQL STATE: ${messages[0]})"; |
||
144 | $errorCode = "(ERROR CODE: ${messages[1]})"; |
||
145 | throw new DatabaseException("${message} ${sqlState} ${errorCode}"); |
||
146 | } |
||
147 | } catch (\Exception $e) { |
||
148 | throw new DatabaseException($e); |
||
149 | } |
||
150 | } |
||
151 | } |
||
152 |
This function has been deprecated. The supplier of the function has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.