<?php define('DB_DATABASE', 'name_db'); define('DB_USERNAME', 'dbuser'); define('DB_PASSWORD', 'xxxx'); define('PDO_DSN', 'mysql:dbhost=localhost;dbname=' . DB_DATABASE); try { $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // $stmt = $db->prepare("select score from users where score > ?"); // $stmt->execute([60]); //$stmt = $db->prepare("select name from users where name like ?"); //$stmt->execute(['%t%']); $stmt = $db->prepare("select score from users order by score desc limit ?"); $stmt->bindValue(1, 1, PDO::PARAM_INT); $stmt->execute(); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach($users as $user){ var_dump($user); } echo $stmt->rowCount() . "records found."; /* (1) exec(): 結果を返さない、安全なsql (2) query(): 結果を返す、安全、何回も実行されない (3) prepare(): 結果を返す、安全対策が必要、複数回実行 */ // $stmt = $db->prepare("insert into users(name, score) values(?, ?)"); // $stmt->execute(['tagu', 44]); // $stmt = $db->prepare("insert into users(name, score) values(:name, :score)"); // $stmt->execute(['name'=>'nishikawa', ':score'=>76]); // echo "inserted: " . $db->lastInsertId(); // bindValue 値をbind // bindParam 変数への参照をbindValue // $stmt = $db->prepare("insert into users(name, score) values(?, ?)"); // $name = 'tagu'; // $stmt->bindValue(1, $name, PDO::PARAM_STR); // $score= 23; // $stmt->bindValue(2, $score, PDO::PARAM_INT); // $stmt->execute(); // $score= 44; // $stmt->bindValue(2, $score, PDO::PARAM_INT); // $stmt->execute(); //$stmt->bindParam(2, $score, PDO::PARAM_INT); // $score = 52; // $stmt->execute(); // $score = 44; // $stmt->execute(); // $score = 2; // $stmt->execute(); } catch (PDOException $e){ echo $e->getMessage(); exit; }
phpでPOD接続
PODとはphp data obujectの略で、データベース接続クラスのことです。 PHPは標準でMySQLやPostgreSQLやSQLiteなど、色々なデータベースに接続するための命令が用意されています。PDOを使うことで、どのデータベースを利用する場合でも同じ関数を使うことができますので、もし将来データベースを変更することがあっても、PDOオブジェクトを作成する時に指定したパラメータだけを変更するばいいことになります。
index.php
<?php define('DB_DATABASE', 'name_db'); define('DB_USERNAME', 'dbuser'); define('DB_PASSWORD', 'xxxx'); define('PDO_DSN', 'mysql:dbhost=localhost;dbname=' . DB_DATABASE); try { $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // insert $db->exec("insert into users (name, score) values('yamada', 55)"); echo "user added!"; // disconnect $db = null; } catch (PDOException $e){ echo $e->getMessage(); exit; }
prepared
<?php define('DB_DATABASE', 'name_db'); define('DB_USERNAME', 'dbuser'); define('DB_PASSWORD', 'xxxx'); define('PDO_DSN', 'mysql:dbhost=localhost;dbname=' . DB_DATABASE); try { $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); /* (1) exec(): 結果を返さない、安全なsql (2) query(): 結果を返す、安全、何回も実行されない (3) prepare(): 結果を返す、安全対策が必要、複数回実行 */ $stmt = $db->prepare("insert into users(name, score) values(?, ?)"); $stmt->execute(['name', 44]); echo "inserted: " . $db->lastInsertId(); } catch (PDOException $e){ echo $e->getMessage(); exit; }
mysqlのバックアップ・復元
バックアップの取り方
[vagrant@localhost mysql]$ mysqldump -u dbuser -p blog_app > blog_app.dump.sql Enter password: [vagrant@localhost mysql]$ ls blog_app.dump.sql commands.sql
復元方法
不等号記号がバックアップの逆になります。
mysql -u dbuser -p blog_app < blog_app.dump.sql
mysqlで遊ぼう3
レコードの件数表示
select count(*) from users;
レコードのフィールドの値
select distinct team from users;
最大値の抽出
select max(score) from users;
select avg(score) from users;
select sum(score) from users;
チームごとの平均値表示
select avg(score) from users group by team;
ランダム関数も使えます。
select rand();
select * from users order by rand() limit 1;
mysql> select * from users order by rand() limit 1; +----+--------+------------------+----------+------+-------+---------------------+ | id | name | email | password | team | score | created | +----+--------+------------------+----------+------+-------+---------------------+ | 3 | kimura | kimura@gmail.com | NULL | red | 2.3 | 2016-11-01 09:00:00 | +----+--------+------------------+----------+------+-------+---------------------+ 1 row in set (0.00 sec)
文字列、日付関数
select email, length(email) from users;
連結関数
select concat(name,'(‘,team,’)’) from users;
select concat(name,'(‘,team,’)’) as label from users;
select name, substring(team,1,1) from users;
select now();
select name,month(created) from users;
select name, datediff(now(), created) from users;
レコードの更新は通常updateを使います。
mysql> update users set team = 'red' where id = 5; Query OK, 1 row affected (0.06 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from users; +----+----------+--------------------+----------+--------+-------+---------------------+ | id | name | email | password | team | score | created | +----+----------+--------------------+----------+--------+-------+---------------------+ | 1 | yamada | yamada@gmail.com | NULL | blue | 5.5 | 2016-11-03 11:00:00 | | 2 | sasaki | sasaki@gmail.com | NULL | yellow | 8.2 | 2016-11-02 10:00:00 | | 3 | kimura | kimura@gmail.com | NULL | red | 2.3 | 2016-11-01 09:00:00 | | 4 | tanaka | tanaka@gmail.com | NULL | blue | 4.5 | 2016-10-31 08:00:00 | | 5 | yamamoto | yamamoto@gmail.com | NULL | red | 7.4 | 2016-10-30 07:00:00 | | 6 | yoshida | yoshida@gmail.com | NULL | yellow | 4.2 | 2016-10-29 06:00:00 | +----+----------+--------------------+----------+--------+-------+---------------------+ 6 rows in set (0.00 sec)
削除にはdeleteを使用します。
delete from users where score <= 3.0;
データ構造の変更
フィールドの追加
alter table users add full_name varchar(255) after name;
フィールドの変更
alter table users change full_name full_name varchar(100);
フィールドの削除
alter table users drop full_name;
テーブル名変更
alter table users rename blog_users;
テーブルの連結
テーブルを追加して、連結します。
create table posts ( id int not null auto_increment primary key, user_id int not null, title varchar(255), body text, created datetime ); insert into posts (user_id,title,body,created) values (1, 'title-1 by yamada','body-1','2016-11-01 14:00:00'), (1, 'title-2 by yamada','body-2','2016-10-31 13:00:00'), (2, 'title-3 by sasaki','body-3','2016-10-30 12:00:00'), (2, 'title-4 by sasaki','body-3','2016-10-29 11:00:00'), (3, 'title-5 by kimura','body-4','2016-10-28 10:00:00'), (3, 'title-6 by kimura','body-4','2016-10-27 09:00:00'); mysql> select * from posts; +----+---------+-------------------+--------+---------------------+ | id | user_id | title | body | created | +----+---------+-------------------+--------+---------------------+ | 1 | 1 | title-1 by yamada | body-1 | 2016-11-01 14:00:00 | | 2 | 1 | title-2 by yamada | body-2 | 2016-10-31 13:00:00 | | 3 | 2 | title-3 by sasaki | body-3 | 2016-10-30 12:00:00 | | 4 | 2 | title-4 by sasaki | body-3 | 2016-10-29 11:00:00 | | 5 | 3 | title-5 by kimura | body-4 | 2016-10-28 10:00:00 | | 6 | 3 | title-6 by kimura | body-4 | 2016-10-27 09:00:00 | +----+---------+-------------------+--------+---------------------+ 6 rows in set (0.00 sec) mysql> select users.name,posts.title from users,posts where users.id=posts.user_id; +--------+-------------------+ | name | title | +--------+-------------------+ | yamada | title-1 by yamada | | yamada | title-2 by yamada | | sasaki | title-3 by sasaki | | sasaki | title-4 by sasaki | +--------+-------------------+ 4 rows in set (0.00 sec)
条件指定することも可能です。
select users.name,posts.title,posts.created from users,posts where users.id=posts.user_id order by posts.created desc;
外部のsqlファイルからコマンドを打つことも可能です。
drop table if exists users; create table users ( name varchar(255), email varchar(255) ); insert into users (name,email) values ('name','name@gmail.com');
外部コマンドの入力方法は以下の通りです。
[vagrant@localhost mysql]$ mysql -u dbuser -p blog_app < commands.sql
mysqlで遊ぼう2
テーブルの作り方
mysql> create table users ( -> id int, -> name varchar(255), -> email varchar(255), -> password char(32) -> ); Query OK, 0 rows affected (0.33 sec)
テーブルの確認
mysql> show tables; +--------------------+ | Tables_in_blog_app | +--------------------+ | users | +--------------------+ 1 row in set (0.00 sec)
削除する際は、drop table users とします。
mysqlでは扱えるデータ型は複数あります。
-数値
int
double
-文字列
char(固定長)
varchar(可変長)
text
-日付
date
datetime
それ以外
enum
また、フィールドにオプションをつけることが可能です。
入力必須:not null
デフォルト値: default ”
自動連番 auto_increment
索引(インデックス) 主キー(primary key)、キー(key)、ユニークキー(unique)
では、createして、descでテーブルの構造を見てみましょう。
mysql> create table users ( -> id int not null auto_increment primary key, -> name varchar(255), -> email varchar(255) unique, -> password char(32), -> score double, -> sex enum('male', 'female') default 'male', -> memo text, -> created datetime, -> key score(score) -> ); Query OK, 0 rows affected (0.05 sec) mysql> desc users; +----------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-----------------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | email | varchar(255) | YES | UNI | NULL | | | password | char(32) | YES | | NULL | | | score | double | YES | MUL | NULL | | | sex | enum('male','female') | YES | | male | | | memo | text | YES | | NULL | | | created | datetime | YES | | NULL | | +----------+-----------------------+------+-----+---------+----------------+ 8 rows in set (0.00 sec)
挿入はinsert int tablename() values();、入力後は、select * from users;で確認できます。
mysql> insert into users (name,email,password,score,memo,created) values('name','test@gmail.com','xxx','5.5','memomemomemo','2016-11-04 12:00:00'); Query OK, 1 row affected (0.01 sec) mysql> select * from users; +----+------+----------------+----------+-------+------+--------------+---------------------+ | id | name | email | password | score | sex | memo | created | +----+------+----------------+----------+-------+------+--------------+---------------------+ | 1 | name | test@gmail.com | xxx | 5.5 | male | memomemomemo | 2016-11-04 12:00:00 | +----+------+----------------+----------+-------+------+--------------+---------------------+ 1 row in set (0.00 sec)
select * from users \G で縦に表示することも可能です。
select * from users where score >= 5.0; など条件付きの検索はwhereを使います。
mysql> select * from users where score >= 5.0; +----+----------+--------------------+----------+--------+-------+---------------------+ | id | name | email | password | team | score | created | +----+----------+--------------------+----------+--------+-------+---------------------+ | 1 | yamada | yamada@gmail.com | NULL | blue | 5.5 | 2016-11-03 11:00:00 | | 2 | sasaki | sasaki@gmail.com | NULL | yellow | 8.2 | 2016-11-02 10:00:00 | | 5 | yamamoto | yamamoto@gmail.com | NULL | | 7.4 | 2016-10-30 07:00:00 | +----+----------+--------------------+----------+--------+-------+---------------------+ 3 rows in set (0.00 sec)
一部一致の検索は、likeを使います。
mysql> select * from users where email like '%@gmail.com'; +----+----------+--------------------+----------+--------+-------+---------------------+ | id | name | email | password | team | score | created | +----+----------+--------------------+----------+--------+-------+---------------------+ | 1 | yamada | yamada@gmail.com | NULL | blue | 5.5 | 2016-11-03 11:00:00 | | 2 | sasaki | sasaki@gmail.com | NULL | yellow | 8.2 | 2016-11-02 10:00:00 | | 3 | kimura | kimura@gmail.com | NULL | red | 2.3 | 2016-11-01 09:00:00 | | 4 | tanaka | tanaka@gmail.com | NULL | blue | 4.5 | 2016-10-31 08:00:00 | | 5 | yamamoto | yamamoto@gmail.com | NULL | | 7.4 | 2016-10-30 07:00:00 | | 6 | yoshida | yoshida@gmail.com | NULL | yellow | 4.2 | 2016-10-29 06:00:00 | +----+----------+--------------------+----------+--------+-------+---------------------+ 6 rows in set (0.00 sec)
その他の以下のようにコマンドです。
mysql> select * from users where score between 5.0 and 8.0;
mysql> select * from users where team in (‘red’, ‘yellow’);
mysql> select * from users where score <= 4.5 and team 'blue';
並び替えはorder byを指定します。descは並び順が逆になります。
select * from users order by score;
select * from users order by score desc;
制限を加えることもできます。
select * from users limit 3;
select * from users limit 2, 2;
select * from users order by score limit 3;
MySQLで遊ぼう
mysqlの開発者用サイトです。
MySQL
データベースには、テーブル、フィールド(列)、レコード(行)の概念があります。Excelのスプレッドシートのように考えると分かり易いです。
mysqlの起動では、ユーザー名を入れて起動します。
[vagrant@localhost ~]$ mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.6.34 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
パスワードの設定は以下の通りです。
set password for root@localhost=password(”)
データベースの作り方は、create databaseで作れます。
mysql> create database blog_app; Query OK, 1 row affected (0.12 sec)
一覧表示
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | blog_app | | mysql | | performance_schema | +--------------------+ 4 rows in set (0.14 sec)
データベースの削除
mysql> drop database blog_app; Query OK, 0 rows affected (0.21 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.00 sec)
データベースの利用
mysql> use test; Database changed
作業ユーザーの設定方法
mysql> create database blog_app; Query OK, 1 row affected (0.06 sec) mysql> grant all on blog_app.* to dbuser@localhost identified by 'xxxx'; Query OK, 0 rows affected (0.16 sec)
作業ユーザーでのログイン
[vagrant@localhost ~]$ mysql -u dbuser -p blog_app Enter password:
AWS サーバーの増設
サーバーのスペックだけでなく、ロードバランサを使って振り分けたいときなどは、イメージから、サーバーを作成します。
それから、ロードバランサーを作成していきます。
AWS DBの起動
AWSのDBはRDSにありますので、そこからインスタンスを起動します。
Multi-AZ Deploymentの設定は通常「はい」にして、セキュリティを高めます。
DBインスタンスを作成したら、エンドポイントを確認します。
そして、mysqlに接続します。
[ec2-user@ip-172-31-21-202 ~]$ mysql -h mydbinstance.c7fqvxerxxxx.ap-northeast-1.rds.amazonaws.com -u name -p
AWS IMAGESの作成
IMAGESはインスタンスのテンプレートのようなものです。
イメージは、サーバーがシャットダウンされて、snapshots、AMIsが作られます。
インスタンスがシャットダウンされると、パブリックDNSが使用できなくなるので、Elastic IPsでIPアドレスを作成します。
そして、作成済みのインスタンスと関連付けを行います。
すると、インスタンスに割り当てられていることがわかります。
バックアップはElastic block storeのvolumesでクリップスナップショットをつくれば、その時点のバックアップをとります。
インスタンスのスペック変更は、一旦インスタンスを停止し、インスタンスタイプの変更で簡単に変更することができます。
t2.nanoでウェブサーバーを立ち上げよう
AWSに接続したら、サーバーにhttpd、php、mysqlをインストールします。
[ec2-user@ip-172-31-21-202 ~]$ sudo yum -y install httpd php mysql
インストールが完了したら、httpdの立ち上げを行います。
[ec2-user@ip-172-31-21-202 ~]$ sudo service httpd start Starting httpd: [ OK ] [ec2-user@ip-172-31-21-202 ~]$ sudo chkconfig httpd on
そうしたら、index.htmlファイルを作成し、ウェブサーバーが稼働しているか確認してみます。
[ec2-user@ip-172-31-21-202 ~]$ sudo vim /var/www/html/index.html
すると、反映されていることが確認できます。