質問するログイン新規登録

質問編集履歴

1

PHPコードを追記

2017/11/11 07:57

投稿

okame
okame

スコア54

title CHANGED
File without changes
body CHANGED
@@ -32,6 +32,187 @@
32
32
  これを追記してからMySQLを再起動しようとすると、起動しない状態となっています。
33
33
  Apacheサーバーのエラーログにも特に何も出力はされていません。
34
34
 
35
+ ###追記:PHPのソースコード
36
+
37
+ まずは以下の登録した管理者の情報を編集する完了画面のコードです。
38
+ 26行目の``` $managerRepository->execute('UPDATE'); ``` で更新処理を実行します。
39
+
40
+ ```php
41
+ <?php
42
+
43
+ require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';
44
+
45
+ use AppBundle\Entity\ManagerRepository;
46
+
47
+ $loader = new Twig_Loader_Filesystem($_SERVER['DOCUMENT_ROOT'] . '/app/resources/views/');
48
+ $twig = new Twig_Environment($loader);
49
+
50
+ // このページに直接アクセスしてきた場合はエラー画面遷移
51
+ if (count($_POST) == 0) {
52
+ echo $twig->render('admin/error.html.twig', [
53
+ 'error' => '操作に誤りがありました。初めからやり直してください。',
54
+ ]);
55
+ exit();
56
+ }
57
+
58
+ $managerRepository = new ManagerRepository();
59
+ $managerRepository->setAllProperties('UPDATE');
60
+ $managerRepository->execute('UPDATE');
61
+
62
+ echo $twig->render('admin/staff/editComplete.html.twig', [
63
+ 'username' => $managerRepository->getUsername(),
64
+ ]);
65
+
66
+ ?>
67
+ ```
68
+
69
+ 上記26行目のメソッドのコードは以下です。
70
+ 下の方のコード```$dbObject->run('UPDATE', $sql, $values); ``` に続きます。
71
+ $sqlに格納しているクエリは直接DBツール上で実行しましたが、正常に実行できます。
72
+
73
+ ```php
74
+ <?php
75
+
76
+ namespace AppBundle\Entity;
77
+
78
+ use AppBundle\Common\DatabaseAccessObject;
79
+
80
+
81
+ class ManagerRepository extends Manager
82
+ {
83
+ ...
84
+ public function execute($type)
85
+ {
86
+ $dbObject = new DatabaseAccessObject();
87
+
88
+ $sql = '';
89
+ $values = [];
90
+
91
+ switch ($type) {
92
+ ...
93
+ case 'UPDATE':
94
+ $sql = 'UPDATE manager SET
95
+ user_name = ?,
96
+ password = ?,
97
+ password_updated_at = ?,
98
+ last_name = ?,
99
+ first_name = ?,
100
+ remarks = ?,
101
+ updated_at = ?,
102
+ updated_manager_id = 0 WHERE id = ?';
103
+
104
+ $values = [
105
+ $this->getUsername(),
106
+ $this->getPassword(),
107
+ $this->getPasswordUpdatedAt(),
108
+ $this->getLastName(),
109
+ $this->getFirstName(),
110
+ $this->getRemarks(),
111
+ $this->getUpdatedAt(),
112
+ $this->getId(),
113
+ ];
114
+
115
+ $dbObject->run('UPDATE', $sql, $values);
116
+ break;
117
+ ...
118
+ }
119
+ }
120
+ ```
121
+
122
+ 上記```$dbObject->run('UPDATE', $sql, $values); ``` のコードは以下です。
123
+
124
+ ```php
125
+ <?php
126
+
127
+ namespace AppBundle\Common;
128
+
129
+ use AppBundle\Common\Config;
130
+
131
+ /**
132
+ * データベースへの接続情報をセット
133
+ */
134
+ Config::set('dsn', 'mysql:host=localhost;dbname=***;charset=utf8');
135
+ Config::set('user', '***');
136
+ Config::set('password', 'ad***');
137
+
138
+ /**
139
+ * Class DatabaseAccessObject データベースへの接続、リクエストを管理
140
+ */
141
+ class DatabaseAccessObject
142
+ {
143
+ /**
144
+ * @var \PDO $dbh データベースハンドラ
145
+ */
146
+ private $dbh;
147
+
148
+ /**
149
+ * データベースへ接続する
150
+ *
151
+ * @throws \PDOException
152
+ */
153
+ public function __construct()
154
+ {
155
+ // データベース情報
156
+ $dsn = Config::get('dsn');
157
+ $user = Config::get('user');
158
+ $password = Config::get('password');
159
+
160
+ // DB接続とエラー発生時のエラーモード設定
161
+ $this->dbh = new \PDO($dsn, $user, $password);
162
+ $this->dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
163
+ }
164
+
165
+ /**
166
+ * セットしたクエリを実行する
167
+ *
168
+ * @paramsh array $params
169
+ * @return array $stmt
170
+ * @throws \PDOException
171
+ */
172
+ public function run($type, $query, $params = [])
173
+ {
174
+ $this->dbh->beginTransaction();
175
+
176
+ try {
177
+ $stmt = $this->dbh->prepare($query);
178
+
179
+ if (count($params)) {
180
+ $stmt->execute($params);
181
+
182
+ } else {
183
+ $stmt->execute();
184
+ }
185
+
186
+
187
+ } catch (\Exception $e) {
188
+ // トランザクションが失敗した際のロールバック処理
189
+ $this->dbh->rollBack();
190
+ throw $e;
191
+ }
192
+
193
+ $this->dbh->commit();
194
+
195
+ if ($type == 'SELECT') {
196
+ return $stmt->fetchAll();
197
+
198
+ } elseif ($type == 'SELECT_BY_ONE') {
199
+ return $stmt->fetch();
200
+ }
201
+ }
202
+
203
+ /**
204
+ * 接続を閉じる
205
+ */
206
+ public function __destruct()
207
+ {
208
+ $this->dbh = null;
209
+ }
210
+ }
211
+ ```
212
+
213
+ 最終的にPDOStatement::execute()メソッドでクエリを投げているわけですが、
214
+ これの返り値は「true」となり、エラーは発生していません。
215
+
35
216
  ###以上です
36
217
 
37
218
  皆様のお知恵を拝借できれば幸いです。宜しくお願い致します。