小さな管理機能を作ってみよう 第30話
初心者向け、PHPプログラム構築講座です。
初心者といっても、PHPの勉強を少し行い、LAMP環境が自分で構築でき、少しアプリケーションを作成しているレベルを対象とします。
まったくの初心者の場合は、わからない部分が出てくると思います。
できるだけ細かく説明は入れていきますが、説明がわからない場合は、PHPやMySQLの初心者講座をご覧ください。
対象のスキルレベル
- LAMP環境の構築
- PHP言語が読める
- HTML, CSS, Javascriptが少しわかる
- Bootstrapのドキュメントをみて、HTMLが書ける
- Ajax(非同期通信)を利用したことがある
- SESSIONを利用したことがある
構築環境
- Windows10
- XAMPP(PHP7.3.2, MariaDB 10.1.38)
ユーザ管理実装
部署管理の実装が終了しましたので、最後となりますが、ユーザ管理を実装していきます。
ログイン前に、ログインするユーザを作成するにあたり、登録部分を作成していました。
登録部分の作成に関しては、小さな管理機能を作ってみよう 第20話を参照してください。
今回は、登録以外の部分を実装していきます。順番としては、一覧表示作成後に、登録・更新部分の作成を行っていきます。
まずはPHP側の実装を行い、HTML修正、Javascriptの作成の順番で構築していきます。
まずは、登録部分以外の実装を行います。
Users.php実装
Users.php
<?php class Users { /* traitを使う宣言 */ use Result; /* 全件取得 */ function list($con, $request){ $rs = []; $sql = "select "; $sql .= " u.user_id, u.name, u.mail, u.tel, u.addr, "; $sql .= " u.dept_id, u.hash, u.created, u.modified, "; $sql .= " d.name dept_name "; $sql .= "from users u "; $sql .= "left outer join depts d on ("; $sql .= " u.dept_id = d.dept_id "; $sql .= ") "; $sql .= "order by user_id"; /* プリペアードステートメントを作成します */ if($stmt = $con->prepare($sql)){ /* SQLを実行します */ $stmt->execute(); /* fetchする際のデータの割り当てを設定します */ $stmt->bind_result( $user_id, $name, $mail, $tel, $addr, $dept_id, $hash, $created, $modified, $dept_name ); /* 全件fetchして変数に割り当てます */ while($stmt->fetch()){ /* fetchが完了したら変数に割り当てます */ $rs[] = [ 'user_id' => $user_id, 'name' => $name, 'mail' => $mail, 'tel' => $tel, 'addr' => $addr, 'dept_id' => $dept_id, 'hash' => $hash, 'created' => $created, 'modified' => $modified, 'dept_name' => $dept_name ]; } $stmt->close(); /* rsのキーに取得したデータをセットします */ $this->setList('rs', $rs); /* TraitのResultに設定してある成功を実行 */ $this->success(); } /* TraitのResultに設定してある返却用配列を返します */ return $this->result(); } /* 1件取得 */ function get($con, $request){ $sql = "select * from users where user_id = ?"; /* プリペアードステートメントを作成します */ if($stmt = $con->prepare($sql)){ /* ?(プレースフォルダー)に値を設定します */ $stmt->bind_param("i", $request['user_id']); /* SQLを実行します */ $stmt->execute(); /* fetchする際のデータの割り当てを設定します */ $stmt->bind_result( $user_id, $name, $mail, $tel, $addr, $dept_id, $hash, $created, $modified ); /* 最初の一行だけ取得するので、whileではなくifにしています */ if($stmt->fetch()){ /* fetchが完了したら変数に割り当てます */ $rs = [ 'user_id' => $user_id, 'name' => $name, 'mail' => $mail, 'tel' => $tel, 'addr' => $addr, 'dept_id' => $dept_id, 'hash' => $hash, 'created' => $created, 'modified' => $modified ]; } $stmt->close(); /* rsのキーに取得したデータをセットします */ $this->setList('rs', $rs); /* TraitのResultに設定してある成功を実行 */ $this->success(); } /* TraitのResultに設定してある返却用配列を返します */ return $this->result(); } /* 登録 */ function insert($con, $request){ $sql = "insert into users(name, mail, tel, addr, dept_id, hash, modified) values (?, ?, ?, ?, ?, ?, current_timestamp)"; /* パスワード生成 */ $hash = password_hash($request['passwd'], PASSWORD_BCRYPT); /* プリペアードステートメントを作成します */ if($stmt = $con->prepare($sql)){ /* ?(プレースフォルダー)に値を設定します */ $stmt->bind_param("ssssis", $request['name'], $request['mail'], $request['tel'], $request['addr'], $request['dept_id'], $hash ); /* SQLを実行します */ $stmt->execute(); $stmt->close(); /* TraitのResultに設定してある成功を実行 */ $this->success(); } /* TraitのResultに設定してある返却用配列を返します */ return $this->result(); } /* 更新 */ function update($con, $request){ $sql = "update users set name = ?, mail = ?, tel = ?, addr = ?, dept_id = ?, hash = ?, modified = current_timestamp where user_id = ?"; /* パスワード生成 */ $hash = password_hash($request['passwd'], PASSWORD_BCRYPT); /* プリペアードステートメントを作成します */ if($stmt = $con->prepare($sql)){ /* ?(プレースフォルダー)に値を設定します */ $stmt->bind_param("ssssisi", $request['name'], $request['mail'], $request['tel'], $request['addr'], $request['dept_id'], $hash, $request['user_id'] ); /* SQLを実行します */ $stmt->execute(); $stmt->close(); /* TraitのResultに設定してある成功を実行 */ $this->success(); } /* TraitのResultに設定してある返却用配列を返します */ return $this->result(); } /* 削除 */ function delete($con, $request){ $sql = "delete from users where user_id = ?"; /* プリペアードステートメントを作成します */ if($stmt = $con->prepare($sql)){ /* ?(プレースフォルダー)に値を設定します */ $stmt->bind_param("i", $request['user_id']); /* SQLを実行します */ $stmt->execute(); $stmt->close(); /* TraitのResultに設定してある成功を実行 */ $this->success(); } /* TraitのResultに設定してある返却用配列を返します */ return $this->result(); } } ?>
PHPの実装が終了しましたので、次回からHTMLの実装に取り掛かりたいと思います。