PHP,MySQL奮闘記
はじめに
最近学んでいるPHPについて、知識を整理・定着させるために記事にする
正直まだわからないことだらけであり、間違いが含まれているかもしれないことを注意していただきたい
また、間違いやもっと良い書き方などあれば是非指摘していただきたい
説明に使用するコードは全てgithubに載せてあるので、
省略している部分などの参照に利用してほしい
環境
form処理
概要
HTMLのフォーム処理を利用したデータの受け渡し
全体の流れは以下の通り
各入力フィールドにデータが入力され、 formでデータが送信される際には、 inputタグのname属性で付けたデータ名とその値を一組にして、 formタグのaction属性で指定したサーバー上のファイルに、 formタグのmethod属性で指定した転送方法で送られる。
以下のサイトに詳しく書かれてあります↓
サンプルコード
index.htmlで入力した姓と名を、form1.phpへ渡し
正常に入力されていればその値を表示、
入力されていなければindex.htmlへ戻るというコードを以下に載せる
<!-- index.html --> <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>名前の入力</title> </head> <body> <form method="post" action="form1.php"> 姓:<input type="text" name="family_name"><br> 名:<input type="text" name="first_name"><br> <input type="submit" value="送信"> </form> </body> </html>
<!-- form1.php --> <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>入力の確認</title> </head> <body> <?php $family_name=$_POST['family_name']; $first_name=$_POST['first_name']; $family_name=htmlspecialchars($family_name); $first_name=htmlspecialchars($first_name); if($family_name == ''){ print '姓が入力されていません<br>'; } if($first_name == ''){ print '名が入力されていません<br>'; } if($family_name == '' || $first_name == ''){ print '<form>'; print '<input type="button" onclick="history.back()" value="戻る">'; print '</form>'; }else{ print '正常に入力されています<br>'; print '姓: '.$family_name.'<br>'; print '名: '.$first_name.'<br>'; } ?> </body> </html>
MySQLの利用
PDOの概要
PDOとはPHP Data Objectsの略
PHP標準のDB接続クラス
オブジェクト生成時にコンストラクタでDB情報の設定 PDOのメソッド利用によってDB操作ができる
今回はMySQLを利用するが、DB情報やSQL文を変更することで
容易に他のDBへのアクセスや他の操作ができることが利点だと感じる
tableの作成
今回はユーザーのアカウントの登録をイメージしたtableを作成した
初めPDOを利用して作成しようとしたがうまくいかなかったので、
phpMyAdmin上でtableを作成した
tableの構造は以下の画像のとおりである
うまくいかなかったが、私が書いたsql文も載せておく
<!-- dbcreate.php --> <?php //略 $sql = 'CREATE TABLE user ( id INT(11) AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20), mail_address VARCHAR(30), register_datetime DATETIME )'; //略 ?>
PDOインスタンス生成
<?php $dsn = 'mysql:host=localhost; dbname=test'; $username = 'root'; $password = ''; //DBの接続 $dbh = new PDO($dsn, $user, $password); ?>
今回はlocalhost上、testというDBを使用した
username,passwordは初期設定のままである
SQL文の実行
<?php //SQL作成 $sql = 'SELECT * FROM user'; //SQL実行 $stmt = $dbh->prepare($sql); $stmt->execute(); ?>
インスタンス生成により接続したDBに
SQL文を実行する手順である。
SQL文をprepareメソッドの引数にいれ、
executeメソッドによって実行される。
つまりSQL文(変数sql)さえ変更すれば
思うがままに実行できるのだ
便利!簡単!
今回は利用していないが、
PDOには、引数のSQL文を実行する
queryメソッドというものも用意されている
fetchメソッド
DBを操作するとき、対象となる行が複数あり、
ひとつひとつ行を取り出し参照したい
といったときにfetchメソッドは便利だ
たとえば先ほどの
'SELECT * FROM user'
でuserにある全ての行を参照し、SQL文を実行したとする
そしてfetchメソッドにより1行ずつ値を取り出し
ブラウザ上に表示する例は以下の通りである
<?php while($rec = $stmt->fetch(PDO::FETCH_ASSOC)){ print $rec['id']; print '<br>'; print $rec['name']; print '<br>'; print $rec['mail_address']; print '<br>'; print $rec['register_datetime']; print '<br>'; print '<br>'; } ?>
ここでFETCH_ASSOCを選択することで、
POST配列のような連想配列として扱うことができる
そのほかにも様々な設定があるので
詳しくは以下のリファレンスを参照してほしい
まとめ
インスタンス生成、SQL文の実行、fetchメソッド
この3つだけで最低限のDB処理はできそうである
PDOの力はおそろしい...
table全てのデータを表示するコードをまとめとして載せる
<!-- view.php --> <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>一覧</title> </head> <body> <?php $dsn = 'mysql:host=localhost; dbname=test'; $username = 'root'; $password = ''; //文字化け対策 $options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET CHARACTER SET 'utf8'"); //phpのエラーを表示するように設定 error_reporting(E_ALL & ~E_NOTICE); try{ //DBの接続 $dbh = new PDO($dsn, $username, $password, $options); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //SQL作成 $sql = 'SELECT * FROM user'; //SQL実行 $stmt = $dbh->prepare($sql); $stmt->execute(); while($rec = $stmt->fetch(PDO::FETCH_ASSOC)){ print $rec['id']; print '<br>'; print $rec['name']; print '<br>'; print $rec['mail_address']; print '<br>'; print $rec['register_datetime']; print '<br>'; print '<br>'; } } catch (PDOException $e){ print $e->getMessage(); exit; } //接続閉じる $dbh = null; ?> </body> </html>
さいごに
今回初めてPHPを通して、サーバーサイドの学習をしたが
想像以上に簡単で面白いと感じた
cookie,session,HTTP,JSなどの知識も増やしていきたい
精進あるのみ
※補足
ユーザーの登録日時とは別で更新日時を登録したほうがいい、
という助言いただきました!!
ありがとうございます^^