//tips
//php理解
最初に実施していたphpカート作成まで行う。webブラウザとの関係、xamppの設定も含めて理解する。まずはデータベース追加画面の作成から。
先にスタッフの登録画面は作っていたので、そちらの拡充を行っていく。phpのブラウザ表示は下記のようにhttpを使用してフォルダのパスを指定するurlを打ち込むことで表示できる。
http://localhost/staff/staff_add.php
下記を加えることで「○○さんを追加しました。」という表示を出せるようになる。
try{プログラム内容}catch(Exception $e){問題発生時のお詫びの文言、強制exit命令}でエラーストップを組み込んでいる。
データベースに接続した後は、sqlで命令を行い、最後にデータベースを切断することで内容反映が行われるのできちんと切断までを実行する。
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)はPDOでの例外エラーを詳細にするためのオプションで、デバッグ時に役立つもののよう。
https://www.toumasu-program.net/entry/2019/12/20/102903
すぐにprepareの方に行かない。
$dsn='mysql:dbname=shop;host=localhost;charset=utf8’;//shopデータベース
$user='root’;//ユーザ名root
$password=‘’;//パスワードなし
$dbh=new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
Sql文のINSERT INTOでテーブル名と列、リクエストパラメータを指定し、prepareで挿入準備を行う。
$sql = 'INSERT INTO mst_staff(name,password) VALUES (?,?)';
$stmt=$dbh->prepare($sql);
まだリクエストパラメータの部分は設定していないので?に入れたい順番に記載し、executeで処理を実行させる。
$data[]=$staff_name;
$data[]=$staff_pass;
$stmt->execute($data);
データベースから切断するためにはpdoで生成した$dbhにnullを挿入する。データベースを操作したら切断は必須の処理とのこと。
データベースサーバがダウンした際の安全策としてtry~catchで全体を包む。
<body>
<?php
try
{
$staff_name=$_POST['name'];
$staff_name=$_POST['pass'];
$staff_name=htmlspecialchars($staff_name,ENT_QUOTES,'UTF-8');
$staff_pass=htmlspecialchars($staff_pass,ENT_QUOTES,'UTF-8');
$dsn='mysql:dbname=shop;host=localhost;charset=utf8';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = 'INSERT INTO mst_staff(name,password) VALUES (?,?)';
$stmt=$dbh->prepare($sql);
$data[]=$staff_name;
$data[]=$staff_pass;
$stmt->execute($data);
$dbh=null;
print $staff_name;
print'さんを追加しました。<br/>';
}
catch(Exception $e)
{
print'ただいま障害によろ大変迷惑をおかけしております。';
exit();
}
?>
<a href="staff_list.php">戻る</a>
</body>
次にスタッフ一覧画面を作成していく。
ここでは先のものをベースにして新たにselect文を使用している。
SELECT name FROM mst_staff where 1
SELECT nameは列指定、FROMはテーブル指定、whereは、id=1ではなく、1で全てを取得するという意味になるよう。ここは勘違いしない。
Name部分は複数指定できるので
SELECT code,name FROM mst_staff where 1
としてname列とcode列を取得できる。
<body>
<?php
try{
$dsn='mysql:dbname=shop;host=localhost;charset=utf8';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql='SELECT code,name FROM mst_staff WHERE 1';
$stmt=$dbh->prepare($sql);
$stmt->execute();
$dbh=null;
print'スタッフ一覧<br/></br/>';
print’<form method=‘post’ action=“staff_edit.php”>’;
while(true){
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
if($rec==false)
{
break;
}
print $rec['name'];
print '<br/>';
}
}catch(Exception $e){
print'ただいま障害により大変ご迷惑をおかけしております';
exit();
}
?>
</body>
一部加筆の上ブラウザに表示してみる。
http://localhost/staff/staff_list.php
スタッフ情報の修正画面を作成していく。
ちなみに、$dbhでインスタンスを生成する際に変数ではなく、そのまま$dbh=new PDO(…,’root’,...);などとすることもできるが見やすいようにここでは変数に格納してから引数にしている。
また<?php?>の外に出すことで普通にechoを使わずにhtmlを記載することができるので覚えておく。echoの使用はかなり面倒だった。
またテクニックとしてhtmlのタグの中にphpの変数を出すために
<input type=“text” name=“name” value=“<?php print $staff_name;?>”>
のように短文のphpを組み込むことができることも覚えておく。
Phpの中にhtmlを書き込む場合はechoかprintがあるが、printの方が見やすいように思われる。
print'<input type ="hidden" name="code" value="'.$staff_code.'" >';
.で文字列同士を繋ぐ必要があるのでそれは忘れないようにする。
データベースからの取得内容は一人分のコードなのでそこまで複雑ではない。
<body>
<?php
try{
$staff_code=$_POST['staffcode'];
$dsn='mysql:dbname=shop;host=localhost;charset=utf8';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql='SELECT name FROM mst_staff WHERE code=?';
$stmt=$dbh->prepare($sql);
$data[]=$staff_code;
$stmt->execute($data);
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$staff_name=$rec['name'];
$dbh=null;
}catch(Exception $e){
print'ただいま障害により大変ご迷惑をおかけしております';
exit();
}
?>
スタッフ修正<br/>
<br/>
スタッフコード<br/>
<?php print $staff_code;?>
<br/>
<br/>
<form method ="post" action="staff_edit_check.php">
<input type="hidden" name="code" value="<?php print $staff_code;?>">
スタッフ名<br/>
<input type ="text" name="name" style="width:200px" value="<?php print $staff_name;?>"><br/>
パスワードを入力ください<br/>
<input type="password" name="pass" style="width:100px"><br/>
パスワードをもう一度入力してください<br/>
<input type="password" name="pass2" style="width:100px"><br/>
<br/>
<input type="button" onclick="history.back()" value="戻る">
<input type="submit" value="OK">
</form>
</body>
データの修正の場合には先に確認したように
UPDATE mst_staff SET name=“…” WHERE code=1
UPDATE テーブル SET 列名=“列の値” WHERE 条件
mst_staffテーブルのcode=1の名前を…に変更、という意味になる。