##はじめに
LAMP環境を整えてPHP使っておきながらPHP内でのデータベースの使い方がわからなかったので、忘れないようにまとめておきます。
簡単なスタッフの追加ページぽい何かとスタッフ一覧ページぽいものを作りながら簡単にまとめておきます。
###準備
phpMyAdminを使ってデータベースに簡単なスタッフ管理を想定したテーブルを作ります。
カラムは3つで「code,name.password」のカラムを作ります。このうちcodeを主キーにします。
データの方などは以下の画像を参照してください
##作ってみる
####スタッフ追加ページ
まずはスタッフ追加ページを作ります。
スタッフ名とパスワード・確認用パスワードを入力する欄をHTMLで用意します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
スタッフ追加<br/>
<br/>
<form method="post" action="add_confirm.php">
スタッフ名を入力してください<br/>
<input type="text" name="name" style="width:200px"><br/>
パスワードを入力してください<br/>
<input type="password" name="pass" style="width:100px"><br/>
パスワードをもう一度入力してください<br/>
<input type="password" name="pass2" style="width:100px"><br/>
<br/>
<input type="submit" value="登録">
</form>
</body>.
</html>
ここまでは大丈夫…
問題のデータベースは次から…
####データベースに接続
何度もデータベース接続のコードを書くのが面倒なので、使いまわし用の関数を入れたphpファイルを作ります。
<?php
// データベースに接続
function connectDB() {
$dsn = 'mysql:dbname=データベース名;host=localhost;charset=utf8'; //データベース名とホスト名
$user='root'; //データベースのユーザー名
$password='****'; //データベースのパスワード
try {
$dbh = new PDO($dsn, $user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
return $dbh;
} catch (PDOException $e) { // データベースに接続出来なかった場合の処理
print'エラー'; // エラーメッセージを表示して終了
exit();
}
}
?>
PDOオブジェクトを使ってデータベースに接続しています。
使い方はこちら(PDOを使ったPHPでのデータベース基本操作)を参考にさせていただきました。
####入力データの確認
スタッフ追加ページのstaff_add.htmlで入力されたスタッフ名とパスワードの確認ページを作ります。
スタッフ名の未入力やパスワードと確認用パスワードが一致していない場合の処理も作っていきます。
<?php
//staff_add.htmlからデータ受取
$staff_name=$_POST['name'];
$staff_password=$_POST['pass'];
$staff_password2=$_POST['pass2'];
//エスケープ処理
$staff_name=htmlspecialchars($staff_name,ENT_QUOTES,'UTF-8');
$staff_password=htmlspecialchars($staff_password,ENT_QUOTES,'UTF-8');
$staff_password2=htmlspecialchars($staff_password2,ENT_QUOTES,'UTF-8');
//以下、入力内容確認処理
if($staff_name==''){
print'スタッフ名が入力されていません。<br/>';
}else{
print'スタッフ名:';
print $staff_name;
print'<br/>';
}
if($staff_password!=$staff_password2){
print'パスワードが一致しません。<br/>';
}
if($staff_name==''||$staff_password==''||$staff_password!=$staff_password2){
//入力内容に問題があれば戻るボタンのみ表示
?>
<form>
<input type="button" onclick="history.back()" value="戻る">
</form>
<?php
}else{
//MD5方式でパスワードをハッシュ化
$staff_password=md5($staff_password);
?>
<form method="post" action="add_done.php">
<input type="hidden" name="name" value="<?php print $staff_name;?>">
<input type="hidden" name="pass" value="<?php print $staff_password;?>"><br/>
<input type="button" onclick="history.back()" value="戻る">
<input type="submit" value="登録">
<form>
<?php
}
?>
エスケープ処理については以下を参考にしました。
・PHPでエスケープが必要な時と方法を最短理解!
・「何故htmlspecialcharsを通すのか?」を一言でどうぞ
####データベースにレコードを追加
次は、前の画面で確認したスタッフ名とハッシュ化したパスワードを受け取って、データベースに追加する処理を作ります。
<?php
require_once 'connect.php';
$dbh = connectDB();
try {
$staff_name=$_POST['name'];
$staff_password=$_POST['pass'];
//エスケープ処理
$staff_name=htmlspecialchars($staff_name,ENT_QUOTES,'UTF-8');
$staff_password=htmlspecialchars($staff_password,ENT_QUOTES,'UTF-8');
$sql='INSERT INTO テーブル名(name,password) VALUES (?,?)'; //SQL命令文 入れたいデータは「?」
$stmt=$dbh->prepare($sql); //準備する命令
$data[]=$staff_name; //「?」にセットしたいデータを順番に書き出し
$data[]=$staff_password;
$stmt->execute($data); //クエリの実行
$dbh=null; //データベース切断
print $staff_name;
print 'さんを追加しました。<br/>';
}catch(Exception $e){
print'エラー';
exit();
}
?>
<a href="staff_list.php">戻る</a>
これでどこかミスってなければデータベースにユーザー名とパスワードのレコードが追加されてるはず。
(passwordには「test」をハッシュ化したものが入ってます)
####スタッフ一覧
せっかくなのでデータベースに追加したスタッフの一覧を表示させるページも作ります。
<?php
require_once 'connect.php';
$dbh = connectDB();
try{
$sql='SELECT name FROM テーブル名 WHERE 1';
$stmt=$dbh->prepare($sql);
$stmt->execute();
$dbh=null;
print'スタッフ一覧<br/>';
while(true){
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
if($rec==false){
break;
}
print $rec['name'];
print '<br/>';
}
}catch(Exception $e){
print 'エラー';
exit();
}
?>
<br/>
<input type="button" onclick="location.href='./staff_add.html'" value="スタッフ追加">
最後に、最初に作ったスタッフ追加ページに飛ぶ飛ぶスタッフ追加ボタンもつけておきます。