どーも!
たかぽんです...!
先日localでMySQLの動作環境を作る機会があったので、その内容について思い出しながらメモを残しておこうと思います...!
やりたかったこと
さて、まず簡単にゴール地点を確認しておきます...!
やることとしては簡単で、Macのlocal環境にてMySQLのサーバーを起動し、データベースを扱える様にします。
実際にCUI上でクエリを叩いたり...といったところがゴールです。
さらに追加で、localにある任意のファイルから初回のテストデータを一括で入れる...といったことと、PHPで該当のMySQLへ接続をする...といったところまで本記事で解説できればと思います。
では、やっていきましょう!
MySQLをインストールする
さて、まずはMySQLをインストールします。
方法は簡単で、下記コマンドを叩くだけ...です...!
brew install mysql
上記ではhomebrewを使用しているため、もしhomebrewが入っていない人は以下の記事を参考にしてみてください。
上記コマンドが完了したら、起動します。
(sudoコマンドなのでパスワードが必要な場合があります)
taka@Taka ~ % sudo mysql.server start
Starting MySQL
. SUCCESS!
SUCCESS!となったら、以下コマンドでrootユーザーにてアクセスしてみましょう...!
taka@Taka ~ % mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.31 Homebrew
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
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>
"mysql>"の状態で入力待機になればOKです。
これで、localでmysqlを起動し、DBの作成やユーザーの操作などができる様になりました...!
次に簡単なDBを作成をしてみます。
Databaseとテストデータの用意
さて、ではDatabaseを作っていきましょう...!
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.01 sec)
上記コマンドで"test"DBを作成しました。
実際に確認をしてみると、デフォルトで作られるDB群に加え、testというDBがあることがわかります。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.02 sec)
mysql>
これからはこのtestデータベースを使っていくのでuseしておきます。
mysql> use test;
Database changed
次に、簡単なテストデータを入れておきましょう。
一つづつコマンドで実行するのがめんどうなので、なので、別ファイルにまとめたクエリを実行してみます。
場所はどこでもいいのですが...例えばDesktopに以下のような"initialdata.sql"ファイルを作成します。
詳細の説明は割愛...!
articleというテーブルを作成するCREATE文、そして、そのテーブルにカラムを20件登録するINSERT文がかかれています。
CREATE TABLE `article` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(32) NOT NULL ,
`price` int unsigned NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (1,'article1',2300);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (2,'article2',1300);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (3,'article3',2500);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (4,'article4',8300);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (5,'article5',45500);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (6,'article6',3300);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (7,'article7',7300);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (8,'article8',78300);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (9,'article9',34300);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (10,'article10',13200);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (11,'article11',5300);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (12,'article12',21700);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (13,'article13',13400);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (14,'article14',17300);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (15,'article15',8700);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (16,'article16',12400);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (17,'article17',93500);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (18,'article18',27800);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (19,'article19',800);
INSERT INTO `article` (`id`,`title`,`price`) VALUES (20,'article20',27300);
上記のファイルをDesktopへ保存したら...
以下のようにすれば一括でコマンド群を実行できます。
mysql> source /Users/taka/Desktop/initialdata.sql
Query OK, 0 rows affected (0.02 sec)
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
...
...
...
Query OK, 1 row affected (0.00 sec)
mysql>
楽ちんですね...!
データがちゃんと入っていることも確認しておきましょう...!
mysql> select * from article;
+----+-----------+-------+
| id | title | price |
+----+-----------+-------+
| 1 | article1 | 2300 |
| 2 | article2 | 1300 |
| 3 | article3 | 2500 |
| 4 | article4 | 8300 |
| 5 | article5 | 45500 |
| 6 | article6 | 3300 |
| 7 | article7 | 7300 |
| 8 | article8 | 78300 |
| 9 | article9 | 34300 |
| 10 | article10 | 13200 |
| 11 | article11 | 5300 |
| 12 | article12 | 21700 |
| 13 | article13 | 13400 |
| 14 | article14 | 17300 |
| 15 | article15 | 8700 |
| 16 | article16 | 12400 |
| 17 | article17 | 93500 |
| 18 | article18 | 27800 |
| 19 | article19 | 800 |
| 20 | article20 | 27300 |
+----+-----------+-------+
20 rows in set (0.00 sec)
mysql>
大丈夫そうですね...!
では、最後にPHPからアクセスしてみましょう...!
PHPでMySQLデータベースへアクセスする
さて、PHPからMySQLデータベースへアクセスする前に、rootとは別のアカウントを作っておきます。
一気に行きます...!
mysql> create user `testuser`@`localhost`;
Query OK, 0 rows affected (0.01 sec)
mysql> SET PASSWORD FOR 'testuser'@'localhost' = 'password';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on test.* to 'testuser'@'localhost';
Query OK, 0 rows affected (0.00 sec)
最初にcreate userでtestuserの作成、そして次にパスワード"password"を設定、最後に、該当ユーザーがtestDBへアクセスできる様に権限を設定しています。
これで、このtestユーザーの情報をつかってPHPからアクセスできるはずです...!
では、同じく場所はどこでも良いので、db-access.phpファイルを作成し、以下の内容で保存します。
<?php
const DATABASE_HOST = 'localhost';
const DATABASE_USER = 'testuser';
const DATABASE_PASS = 'password';
const DATABASE_NAME = 'test';
$link = mysqli_connect(DATABASE_HOST, DATABASE_USER, DATABASE_PASS, DATABASE_NAME);
if (mysqli_connect_errno()) {
die("cannnot connect database :" . mysqli_connect_error() . "\n");
}
echo 'connected to database : ' . DATABASE_NAME . "\n";
mysqli_close($link);
最低限の接続情報と、接続可否のメッセージを出すプログラムです。
接続情報に関しては、現在mysqlサーバーを動かしているのは自分のPC上です。(sudo mysql.server start)
自分のPC上で動いている場合はhostに'localhost'を指定します。
そして、USERは先ほど作った"testuser"です。
また、パスワードも先ほど設定した"password"で、DBの名前はCREATEした"test"データベースでした。
では、上記が保存できたら実行してみます。
実行する際は、先ほどとは別タブで、(mysql > の状態はあくまでmysqlの操作しかできません)実行する点にご留意ください。
db-access.phpファイルを作ったディレクトリで実行できるかと思います。
taka@Taka ~ % php db-access.php
connected to database : test
お、いい感じですね...!
では、最後に本当に作ったデータベースにアクセスできているのか?簡単な値も出して確認をしておこうと思います。
db-access.phpに少しコードを追加して以下の様に変更します。
<?php
const DATABASE_HOST = 'localhost';
const DATABASE_USER = 'testuser';
const DATABASE_PASS = 'password';
const DATABASE_NAME = 'test';
$link = mysqli_connect(DATABASE_HOST, DATABASE_USER, DATABASE_PASS, DATABASE_NAME);
if (mysqli_connect_errno()) {
die("cannnot connect database :" . mysqli_connect_error() . "\n");
}
echo 'connected to database : ' . DATABASE_NAME . "\n";
$query = 'select * from article limit 5';
$result = mysqli_query($link, $query);
$header = ['id', 'title', 'price'];
if ($result->num_rows > 0) {
echo $header[0] . ',' . $header[1] . ',' . $header[2] . "\n";
while($row = $result->fetch_assoc()) {
echo $row['id'] . ',' . $row['title'] . ',' . $row['price'] . "\n";
}
} else {
echo "no results for query, create csv not executed.";
}
mysqli_close($link);
詳しくはコードを読んでいただければ...と思うのですが、簡単に説明しておくと...
"select * from article limit 5"というクエリの結果をばーっと羅列するだけです。
では、変更後実行してみると...?
taka@Taka ~ % php db-access.php
connected to database : test
id,title,price
1,article1,2300
2,article2,1300
3,article3,2500
4,article4,8300
5,article5,45500
良さそうです...!
ちなみに、同じクエリをDBで直接叩くと...?
mysql> select * from article limit 5;
+----+----------+-------+
| id | title | price |
+----+----------+-------+
| 1 | article1 | 2300 |
| 2 | article2 | 1300 |
| 3 | article3 | 2500 |
| 4 | article4 | 8300 |
| 5 | article5 | 45500 |
+----+----------+-------+
5 rows in set (0.01 sec)
mysql>
もちろん、値はそれぞれ一致していそうですね...!
これで、PHPでlocalのMysqlが使える様になりました...!
まとめ
今回はlocal環境でMySQLの環境を作り、そして作ったDBにPHPからアクセスをしてみました。
MySQLはデフォルトだとrootにパスワードを設定しなくても大丈夫だったりするのですが、どうやらPHPで接続する際はパスワードは必須のようでした。
しばらくPHPからアクセスできなくて悩みましたが、新規ユーザーで試すとできたのでなるほどなぁ...と。
試してはいませんが、一応rootユーザーにパスワードを付与して...でもアクセスは可能そうです。
あとはMySQLのsourceコマンドは初めて使ったんですがめっちゃ便利だった...
ある程度現実的にあり得るケースのテーブルやらカラムやらを追加していつでもlocalで試せる様にしておくと今後役に立ちそうな予感がします...!
それでわ!