見出し画像

#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 

  1. データベースタブをクリック

データベース名を入力 > 作成ボタン

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でユーザーを作る

  1. データベース一覧で該当のDBの行で「権限をチェックする」をクリック

  2. 左下の「ユーザーアカウントを追加する」をクリック

  3.  ユーザー名、ホスト名の選択、パスワード、PW再入力

  4. すべての権限を与えるのチェックをはずす

  5. テーブルを作ったり、挿入したりする権限の「構造」「データ」にチェックして実行ボタン

  6. もう一度、データベース一覧で該当の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(結果セットから、残っている行を配列で取得する)

PDO::FETCH_ASSOCオプションを使用すると、列名をキーとした連想配列として結果セットの行を取得できる。
フィールド名をそのままキーとして使用して、その値にアクセスすることができる

https://note.com/style_lab3850/n/nd3433e404012

たとえばこんなかんじに、カラム名をキーとして、添字を付けた配列を返す

いいなと思ったら応援しよう!