ぱぴブログ

さんたろのブログ

ゲーム開発が好きな人のひとりごと

PHP,MySQL奮闘記

はじめに

最近学んでいるPHPについて、知識を整理・定着させるために記事にする

正直まだわからないことだらけであり、間違いが含まれているかもしれないことを注意していただきたい

また、間違いやもっと良い書き方などあれば是非指摘していただきたい

説明に使用するコードは全てgithubに載せてあるので、
省略している部分などの参照に利用してほしい

github.com

環境

  • OS ... Windows10
  • XAMPP ... 7.3.3
  • PHP ... 7.3.3
  • Apache ... 2.4.38
  • MariaDB ... 10.1.38

form処理

概要

HTMLのフォーム処理を利用したデータの受け渡し
全体の流れは以下の通り

各入力フィールドにデータが入力され、 formでデータが送信される際には、 inputタグのname属性で付けたデータ名とその値を一組にして、 formタグのaction属性で指定したサーバー上のファイルに、 formタグのmethod属性で指定した転送方法で送られる。

以下のサイトに詳しく書かれてあります↓

www.htmq.com

サンプルコード

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へのアクセスや他の操作ができることが利点だと感じる

www.php.net

tableの作成

今回はユーザーのアカウントの登録をイメージしたtableを作成した
初めPDOを利用して作成しようとしたがうまくいかなかったので、
phpMyAdmin上でtableを作成した

tableの構造は以下の画像のとおりである

f:id:papyrustaro:20190518215728p:plain
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メソッドというものも用意されている

www.php.net

www.php.net

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配列のような連想配列として扱うことができる
そのほかにも様々な設定があるので
詳しくは以下のリファレンスを参照してほしい

www.php.net

まとめ

インスタンス生成、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などの知識も増やしていきたい
精進あるのみ

※補足
ユーザーの登録日時とは別で更新日時を登録したほうがいい、
という助言いただきました!! ありがとうございます^^