//tips
//ecサイト/php理解
type=“password”が存在し、<input type="password" name="pass" style="width:100px"><br/>のようにすることで入力中も※証での表示となる。
パスワードは$staff_pass=md5($staff_pass);とすることで暗号化することができる。より安全な関数として他にもpassword_hashなどがある。
次はデータベースの追加画面を作成していく。miテキストエディタにて編集しているとphpの大文字の記述や記号の記述が多く、タイプに時間がかかり、ストレスフル。色々なエディターを試しているとvscodeにて自動補完が可能であることがわかり、今後はこちらを使用していくことにする。
下記を参考にPHP Intelephenseをvscodeに導入。
https://codelikes.com/vscode-recommend-extension/#toc9
やっとコードを書き終えた。今までの言語で一番タイピングがしづらいので慣れるまでもう少し時間がかかりそう。
<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=loacalhost;cahrset=utf-8';
$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>
初歩的なところからウォーミングアップした方が良さそうなので、phpに基礎の部分から確認していく。
phpは現在作成しているecサイトだけでなく、ログイン・ログアウトのユーザ認証機能を実現でき、それらの処理は基本的に
・リクエストの解析
・データベースの操作
・レスポンスの生成
によって成り立っている。つまり、phpではこれら3つを実行する言語と言える。
Phpを実行するためには.phpファイルをサーバサイドの指定された場所に配置してあげる必要がある。というのも上記の3つの処理はサーバ側にて対応が必要なものだからである。
一般的にはwebコンテンツを表示するhtmlと同じ場所に格納する。
例えばc:¥xampp¥htdocs¥php¥chapter2¥welcom.phpにファイルを格納している場合、スクリプトを実行するためにはブラウザからPhpファイルのurlを開く必要があり、
http://localhost/php/chapter2/welcom.php
というhttpを使用してブラウザが動作しているコンピュータlocalhostのphp/chapter2/welcom.phpを開くことで処理が実現される。
もう少し具体的に言うとサーバがhttp以下を受け取り、サーバ内でphpの内容を実行し、結果を受け取りそれをサーバがブラウザに返す流れとなる。
Phpファイルはサーバ側にあるため、サーバ内の他のフォルダやデータベースにもアクセスでき、操作を行うことができる。
Jsとの違いは、jsの場合は、サーバからブラウザに送られるhtmlの内容に付加されたjsプログラムはサーバ側ではなくクライアントサイドのページで実行されるため、ユーザーインターフェース編集などのブラウザ内での処理を行うことが得意である。
なので、どちらもサーバにファイルは置かれるものの、jsはブラウザの編集、phpはデータベースやファイル操作といった棲み分けがなされている。
Phpの開発環境として、xamppが使いやすく、本来であればネットワークを通してサーバと通信したり、ファイル転送などを行うことなく、使用しているPCの中にwebサーバ(apache)とデータベース(mysqlなど)を収めることができる。
Phpスクリプトの中にhtmlが混在している場合にはweb上ではhtmlドキュメントの内容と<?phpと?>で挟まれた実行結果を表示することになる。
文字の出力にはprintやechoを使用するが、違いは、printの戻り値は1で、式で使用できるが、echoの戻り値の型はvoidという点。 echoはprintよりもわずかに処理が早いよう。
‘でも“でも文字列を作ることができるが’の方が高速なのでこちらが一般的に使われるよう。細かい機能の違いもあるので必要な時に確認する。
文末に;をつけることも他の言語と変わらない。
繰り返しの部分を別のファイルに保存しておき、使用したい時に取り出す際にはphpのrequire文が用いられ、require’ファイル名’;として読み込むことができる。
<?php require ‘../header.php’; ?>
とすることでheader.phpを実行できる。上位階層にリンクするときは、../ に続けてファイル名を記述。2つ上の階層を指定するときは、../../ に続けてファイル名を記述。これはhtmlの方のルール。
Htmlとの複合になることが多いため、htmlの基本的な機能も一緒に確認。
<form>タグでユーザの入力を受け付け、その下に下記を記述してみる。
<input type=“text” name=“user”>//userという名前のテキストボックスの作成
<input type=“submit” value=“確定”>//確定と記述された送信ボタンの作成
submitの場合はwebサーバにフォームを送信する。
この送信先を指定するため、
<form action=“user_output.php” method=”post”>
として、action属性で出力用のスクリプトを指定する。
フォーム上のボタンを選択するとフォームタグの出力先と連動する。ここではフォームの内容をサーバに送信するためにpostを指定している。
連動先のuser_output.phpに下記のように記述すると「ようこそ、〇〇さん」と表示される。〇〇部分はテキストフォームに書き込まれた文字列を取得してくる。
<?php
echo ‘ようこそ、’,$_REQUEST[‘user’],’さん’;
?>
Echoは+などではなく,で文字列の連結を表されるので便利。
$_REQUEST[‘user’],’のuserとはテキストボックスのname部分の名前で、フォームで入力した内容はリクエストパラメータでwebサーバに送信される。
このリクエストパラメータ名がつけられる理由として、複数の追加パラメータをリクエストパラメータとしてサーバ側に送信するため、個々のパラメータを区別するために名前をつけている。
つまり、ユーザ側から複数の情報を渡してあげる場合は、各の情報には区別できるように名前をつけといてあげる必要があることになる。
このリクエストパラメータの情報は$_REQUEST[‘’]として取得し、レスポンスデータで表示することができる。
リクエストとレスポンスの関係性をよく理解しておくことで$_メソッドの内容は理解できそう。
さらに付け加えると、安全性のためにhtmlspecialcharsで入力内容を文字化させることができる
<?php
echo ‘ようこそ、’,htmlspecialchars($_REQUEST[‘user’]),’さん’;
?>
formで送られる内容が文字列でない場合も確認する。
例えば下記のようなチェックボックスにて内容が送信される場合は、
<form action=“check-output.php” method=“post”>
<p><input type=“checkbox” name=“mail”>お買い得情報を受け取る</p>
<p><input type=“submit” value=“確定”></p>
</form>
check-output.php側ではbool情報を受け取ることになり、下記のように分岐分けできる。
<?php
if(isset($_REQUEST[‘mail’]))
{
echo’お買い得情報のメールをお送りさせていただきます’
}
else
{
echo’メールの送信は行いません’
}
?>
isset関数、isset(変数)、は変数に代入されていて、かつ値がnull出ない時にtrueを返す。それ以外はfalseを返すのでチェックボックスがチェックされていない場合はfalseを返している。
今度は複数のラジオボタンの例を見ていく。
<form action =“radio-output.php” method=“post”>
<p><input type=“radio” name=“meal” value=“和食” checked>和食</p>
<p><input type=“radio” name=“meal” value=“洋食” >洋食</p>
<p><input type=“radio” name=“meal” value=“中華” >中華</p>
<p><input type=“submit” value=“確定”></p>
</form>
ボタンがクリックされている時にはinputタブの中にcheckedが記載され、nameは全て共通になっていることが特徴。
この場合リクエストパラメータはmealの一つしかないことになる。
セレクトボタンの場合は、<select>の中に<option>という選択肢を追加していく形となる。$_REQUEST[‘seat’]でVALUE値を取得するために各optionにvalueで文字列を設定している。
<form action =“select-output.php” method=“post”>
<select name=“seat”>
<option value=“自由席”>自由席</option>
<option value=“指定席”>指定席</option>
<option value=“グリーン席”>グリーン席</option>
</select>
<p><input type=“submit” value=“確定”></p>
</form>
このselctを応用すると購入個数を選択させることもでき、
<p>購入数を選択してください</p>
<form action=“select-for-output.php” method=“post”>
<select name=“count”>
<?php
for($i=0;$i<10;$i++)
{
echo’<option value=“’,$i,’”>’,$i,’</option>’;
}
?>
</select>
<p><input type=“submit” value=“確定”></p>
</form>
このようにすることで0から9までの購入個数を表示させることができるようになる。<option value=“自由席”>自由席</option>のように一つずつ記載していかないでも一度に反映ができるようになる。