Developer

魁!小野の塾 小さな管理機能を作ってみようの巻 第30話
2021.12.15
Lv2

魁!小野の塾 小さな管理機能を作ってみようの巻 第30話

小さな管理機能を作ってみよう 第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 highlight=””] <?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]

PHPの実装が終了しましたので、次回からHTMLの実装に取り掛かりたいと思います。

魁!小野の塾