#104 PHPを学び直す
業務でPHPが増えてきたので、学び直そうかと思います。
XAMMPの設定
ApacheをStartさせて、127.0.0.1をアドレスバーにいれると、XAMMPのホーム画面が表示される
httpd.confのドキュメントルートを変える
XAMMPコントロールパネルのconfigボタンでいきなり編集するとバックアップが取れないので
C:\xampp\apache\conf でファイルのバックアップのコピーをとってからやるほうがいい
testフォルダをドキュメントルートにしたい場合は、httpd.confで
DocumentRoot "C:/xampp/htdocs"
<Directory "C:/xampp/htdocs">
↓ こうする。
DocumentRoot "C:/xampp/htdocs/test"
<Directory "C:/xampp/htdocs">
DBが絡まない場合のデータ受け渡し
1.フォームを作ってphpへデータを送信する:入力画面
<form action="check.php" method="POST">
<input type="text" name="title">
<input type="submit" value="確認">
</form>
2.echoでデータを出力する:確認画面
<?php
$title = htmlspecialchars($_POST['title'], ENT_QUOTES);
?>
<p>確認画面</p>
<form action="send.php" method="POST">
<input type="hidden" name="title" value="<?php echo $title; ?>">
内容詳細:<?php echo $title; ?>
<input type="submit" value="送信">
</form>
3.メール送信処理:送信結果画面
<?php
$title = htmlspecialchars($_POST['title'], ENT_QUOTES);
mb_language('ja');
$name = "自動送信";
$email = "<送信元のアドレス>";
$header ='From:'. mb_encode_mimeheader($name) . "<" . $email .">";
$result = mb_send_mail('<自分のメアド>', $title, $header);
if($result){
echo "メールを送信しました";
} else {
echo "送信失敗しました";
}
?>
PHPMyAdminでDBとテーブルを作る
コンパネでmysqlの方もStartを押して、Adminボタンを押すと、phpMyAdminが立ち上がる
phpMyAdminはブラウザ上でMySQLデータベースを管理できるツール
右カラムにはサーバの種類やバージョンなどが書いてある
データベースの種類
・RDB(リレーショナルDB) 表形式で管理する主流のDB
・NoSQL RDBではないDB 膨大なデータを扱うときに使う セッション管理などによく使われる
DBを管理するシステム(DBMS)
DBの管理や操作をするシステム よく使われるのはMySQL 他に
・Oracle Database
・PostgreSQL
・SQLite
流れ
PHP(MySQLに操作命令) → DBMS(DBを操作) → DB
データベースタブをクリック
データベース名を入力 > 作成ボタン
2 テーブル名とカラム数を入力 > 作成ボタン
id INT Auto Increment, name varchar 255, age intなどのカラムを設定する
> 保存ボタン > 表示ボタン
データの入っていないカラムが生成されたのが確認できる
3 データを挿入する
挿入タブ > それぞれのカラムに対応したデータを入力 > 実行
実行するとSQL文が発行される > 表示ボタン > データが挿入されたのが確認できる
データベース言語(SQL言語)
データベースの操作を行う言語。DBの追加、更新、削除、検索を行う
SQL文の種類
・データ定義(DDL:Data Definition Language):テーブル操作
新規作成(CREATE)する場合や、変更(ALTER)、テーブル結合(JOIN)、削除(DROP)する際に使用。また、テーブルに格納されているデータを一括ですべて削除するTRUNCATEも、DDLに含まれる
テーブルを定義する際に、使われるデータ型には以下のような種類がある。
数値:INT, TINYINT, BIGINT
文字列型:VARCHAR, TEXTなど
日付や時間:DATE, TIMESTAMPなど
データ定義の例
id INT A-I
title VARCHAR 200
content TEXT
category INT
date TIMESTAMO
status INT default = 1(初期状態は非公開など)
いずれもNOT NULL(nullを許さない)
・データ操作(DML:Data Manipulation Language):データ操作
作られたDBの中で操作する。最も使用される言語。検索(SELECT)、更新(UPDATE)、挿入(INSERT)、削除(DELETE)がある。
データ操作(DML)の例
INSERT文:データを追加
INSERT INTO テーブル名(カラム名) VALUES (入れたい値);
INSERT into test(`title`, `content`, `date`, `status`) VALUES('test', 'this is test', '2024-07-14', 1);
DELETE文:データの削除
DELETE FROM テーブル名 WHERE カラム名 = 消したい値;
DELETE from blog where id = 1;
・データ定義(DCL:Data Control Language):アクセス制御
アクセス権限を付与(GRANT)する命令や、権限の取消(REVOKE)など
phpMyAdminでユーザーを作る
データベース一覧で該当のDBの行で「権限をチェックする」をクリック
左下の「ユーザーアカウントを追加する」をクリック
ユーザー名、ホスト名の選択、パスワード、PW再入力
すべての権限を与えるのチェックをはずす
テーブルを作ったり、挿入したりする権限の「構造」「データ」にチェックして実行ボタン
もう一度、データベース一覧で該当のDBの行で「権限をチェックする」をクリックすると、新しいユーザーができたことが確認できる
PHPからDBに接続する
PDO(PHP Data Object)
PHP5.1以降の標準のDB接続クラス
PDOを使わないと接続の際にMySQLなら mysql_connect()とか、postgreSQLならpg_connect()のように文法が違ってしまうから、同じ関数で操作できるPDOを使う。
<?php
$dsn = 'mysql:host=ホスト名;dbname=データベース名;charset=utf8';
$user = 'rootとかユーザ名';
$password = 'パスワードをかく';
try {
$pdh = new PDO($dsn, $user, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]); // ↑エラーを例外で出すというオプション
$stmt = $pdh->query("SELECT * FROM users WHERE id = 1");
$user = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($user);
exit;
} catch (PDOException $e){
print('Error:' . $e->getMessage());
exit();
}
?>
$dsn は、(Data Source Name)の略。データベースに接続するために 必要な情報を代入する
$phdは、php data hundleでPHPでデータを操作するという変数
PDOのインスタンスを作って、$dsnや$user、$passwordを引数にする。オプションでエラーハンドリングを連想配列で指定する[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,]
try…catch文:データベースの操作をする時は必ず使う
tryで接続成功したときの処理、catchでエラーメッセージを表示させる
わざとuser名に違う名前を書いてみると、
SQLSTATE[HY000] [1045] Access denied for user '間違えたユーザー名'@'localhost' (using password: YES)
ユーザー名をアクセス拒否されました。と、出る。
わざとパスワードを間違えても同じエラーメッセージが出るので、YESはパスワードが合っているという意味ではなくて、パスワードを使っているという意味っぽい。
catch文のexit();は処理終了の意味
文字コードについて
コンピュータが文字を識別するために割り当てた数値(コード)のこと。
・ASCII:国際標準、1文字1バイト、日本語なし
・UTF-8:パソコン標準、日本語は3バイト
・Shift_JIS:日本語は2バイト、ASCIIに日本語を追加したものでMicrosoftが作った
PHPからDBに接続したからデータをとってくる
やり方
1 SQL文を準備する
$sql = "SELECT * FROM データベース名";
2 SQL文の実行 dbhからsql文を実行して$stmt(PDO statement)に代入
$stmt = $dbh->query($sql);
PDOクラスとは(DBに接続するクラス)
PDO queryとは(SQL ステートメントを準備して実行する)
PDOStatement クラスとは(ステートメント実行後に結果セットを表す)
3 SQL文の結果を取り出し
$result = $stmt->fetchall(PDO::FETCH_ASSOC);
PDOStatement::fetchAll(結果セットから、残っている行を配列で取得する)
たとえばこんなかんじに、カラム名をキーとして、添字を付けた配列を返す