てくてくテック

【MySQL】MacでlocalにMySQL環境を作り、PHPで実行してみる...!

mysql

どーも!

たかぽんです...!

先日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で試せる様にしておくと今後役に立ちそうな予感がします...!

それでわ!

モバイルバージョンを終了