MySQLを使う流れ
- MySQLに接続する
- MySQLに命令する
- テーブルにデータを登録する
- テーブルからデータを取得する
- MySQLとの接続を切断する
MySQLに接続しよう
mysql クライアントからmysqlサーバへの接続
-h:host ホスト名
-u:user ユーザー名
-D database データベース名(大文字)
-p password 値を指定しないとターミナルで入力、非表示なのでセキュア
appコンテナからdbコンテナのmysqlに接続する$ docker-compose exec app mysql -h db -u book_log -D book_log -p
パスワードは「pass」を入力
mysqlとの接続を切断する
>quit
(exit
でも可能)
接続と切断
- MySQLへ接続
1
2
3
4
5
6
7
8
9$ docker-compose exec app mysql -h db -u book_log -D book_log -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.62 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. - MySQLから切断
1
2MySQL [book_log]> quit
ByeSQL文でデータベースを操作する
テーブルの作成
CREATE TABLE
文で作成1
2
3
4
5CREATE TABLE[IF NOT EXISTS]<テーブル名>(
<列名1><データ型><制約>,
<列名2><データ型><制約>,
・・・
)<テーブルオプション>; - 命名ルール
- 半角英数
- アンダーバー
- 最初の文字はアルファベット
- 名前の重複はだめ(1つのデータベースに同名のテーブルダメ,1つのテーブルに同名の列はダメ)
データ型 列ごとにデータ型を宣言
INTEGER
整数VARCHAR
文字列(可変長文字列)DATE
日付TIMESTAMP
日付と時間の両方を含む値
制約 鉄に入れるデータに制限や条件をかけること
NOT NULL
データを必ず入れるPRIMARY KEY
プライマリーキー(主キー)制約AUTO _INCREMENT
データを追加した際に最大値より1づつ増えていくDEFAULT CURRENT_TIMESTAMP
対象の列に値を指定しなかった場合にデフォルト値が現在のタイムスタンプに設定される。
テーブルを作成してみる
mysqlにつないで以下のコマンドをメモ帳などからコピペで実行。
typoでミスらないように。
1 | CREATE TABLE book_log ( |
テーブルの確認
SHOW COLUMNS FROM book_log;
1 | +------------+--------------+------+-----+-------------------+----------------+ |
テーブルの削除
DROP TABLE <テーブル名>;
ファイルからSQL文を実行
テキストファイルにSQL文を保存、下記のコマンドを実行mysql < text_file
Docker上のMySQLに対して実行するなら
docker-compose exec app /bin/bash
(appコンテナ内でコマンドを実行)mysql -h db -u book_log -D book_log -p < text_file
PHPからMySQLに接続
MySQLiの使い方
- mysqli_connext関数
1
`mysqli_connect('my_host','my_user','my_password','my_db')`
読書ログでMySQLに接続するなら
1 | mysqli_connect('db','book_log','pass','book_log'); |
MySQLに接続できないケースの対策
mysqli_connect()は接続に失敗した場合にFALSEを返す。
FALSEが帰ってきたらアプリケーションを終了させよう
1 | $link = mysqli_connect('db','book_log','pass','book_log'); |
MySQLとの接続を切断する
- mysqli_close関数
$link: mysqli_connect()が返すリンクIDが格納されているmysqli_close($link);
テーブルにデータを登録する
MySQL にコマンドで登録する方法
1 | INSERT INTO companies ( |
結果の確認
1 | SELECT * FROM companies\G |
PHPからMySQLに対してSQL文を実行する方法
INSERT文を使うと、テーブルに1行のデータを挿入する$link
:mysqli_connect() が返すリンクIDが格納されている$query
:SQL文の文字列
1 | mysqli_query($link, $query) |
複数行にまたがる文字列を表記しよう(ヒアドキュメント)
- 構文$sqlにSQL文を格納し、mysqli()関数の第2引数に渡すと、PHPからSQL文を実行できる
1
2
3<<<EOT // ID
内容
EOT; // 終わりのID1
2
3
4
5
6
7
8
9
10
11$sql = <<<EOT
INSERT INTO companies (
name,
establishment_date,
founder
) VALUES (
'SmartHR Ink',
'2013-01-23',
'Shoji Miyata'
)
EOT;1
mysqli_query($link, $sql);
SQL文実行時にエラーがあった場合、エラーメッセージを表示する
queryの戻り値を$resultに格納、$result がTRUEならデータを追加と表示、$resultがFALSEならエラーメッセージを表示する。
1 | $result = mysqli_query($link, $sql); |
バリデーション処理
論理演算子
! 否定の演算子 // TRUEでないときTRUEを返す
&& 論理積の演算子 // 左から判定し、TRUEなら右の判定へとすすむ。すべてTRUEならTRUEを返す
|| 論理積の演算子 // 左から判定し、TRUEになった時点でTRUEを返す
書籍名のバリデーション ・空文字でないか? ・255文字以下か?
// バリデーション処理する関数
1 | function validate($reviews) |
評価のバリデーション 5以下の整数であるか?(1~5)
型キャスト(型の変換)
- (int) 整数への変換
- (bool) 論理値への変換
- (string) 文字列への変換
例文
1 | $a = '2'; // string(1) "2" |
比較演算子
- $a == $b 等しい場合にTRUE 比較時に型キャストされる
- $a === $b 型キャストは行われない(厳密な比較)
- $a != $b 等しくない場合にTRUE 比較時に型キャストされる
- $a !== $b 型キャストは行われない(厳密な比較)
- $a < $b $aが$bより小さい場合にTRUE
- $a > $b $aが$bより大きい場合にTRUE
- $a <= $b $aが$bより小さいか等しい場合(以下)にTRUE
- $a >= $b $aが$bより大きいか等しい場合(以上)にTRUE
入力時に整数にキャストしておく$review['score'] = (int)trim(fgets(STDIN));
1から5の整数かのバリデート処理
1 | if (!$review['score']) { |
入力してほしい文字列と一致しているかのバリデーション
in_array()
- 使い方
in_array(探す値, 配列, <型のチェック>) : TRUE か FALSE を返す。1
2
3
4
5$status = ['未読', '読了', '読んでる']; // この配列の値に一致しているもの以外をFALSEにする
if (!in_array($review['status'], $status)) {
$errors['status'] = '(読了,読んでる,未読)のうちいずれかを入力してください';
}SQLのテーブルからデータを取得する
SELECT文を使う
1 | SELECT <列名>,<列名> FROM テーブル名; // 指定した列のデータを取得する。 |
1 | SELECT * FROM テーブル名; // すべての列のデータを取得する。 |
PHPからSQLのSELECT文を実行してテーブルからデータを取得する。
1 | // データベースに接続する |
mysqli関数 まとめ
PHPからMySQLに接続
mysqli_connect関数mysqli_connect('my_host','my_user','my_password','my_db')
$link = mysqli_connect('my_host','my_user','my_password','my_db') // リンクIDを$linkに格納
PHPからMySQLとの接続を切断する
mysqli_close関数
mysqli_close($link)
$link: mysqli_connect()が返すリンクID
PHPからMySQLに対してSQL文を実行する
mysqli_query($link, $query)
$link:mysqli_connect() が返すリンクID
$query:SQL文の文字列
SQL文を(ヒアドキュメントなどで)$queryに格納し、$link(リンクID)と一緒にmysqli_query()に渡す。
INSERT INTO文 (登録)
1 | $sql = <<<EOT |
SELECT文 (データの取得)
1 | $sql = 'SELECT name, founder FROM companies'; |
SQLの結果であるmysqli_resultオブジェクト を連想配列で取得する
1 | mysqli_fetch_assoc($results) |
SQLの結果をメモリから解放する。
1 | mysqli_free_result($results); |