PHP 学習メモ 1

概要

 PHP 学習メモ。PHP インストールからデータベース接続まで。

内容

  1. PHP インストール
  2. PHP でデータベース接続
  3. メモ

 上記 1、2 は以下を参考にした。

docs.aws.amazon.com

1. PHP インストール

1-1. OS を確認

[ec2-user@ip-172-31-10-77 ~]$ uname -r
6.1.66-91.160.amzn2023.x86_64
[ec2-user@ip-172-31-10-77 ~]$ cat /etc/system-release
Amazon Linux release 2023 (Amazon Linux)

1-2. セキュリティパッチなど更新

$ sudo dnf update -y

1-3. 必要なツールをインストール

$ sudo dnf install -y httpd php

 インストールした Apache のバージョン:

[ec2-user@ip-172-31-8-236 ~]$ httpd -v
Server version: Apache/2.4.58 (Amazon Linux)
Server built:   Oct 24 2023 00:00:00

 インストールした PHP のバージョン:

[ec2-user@ip-172-31-8-236 ~]$ php -v
PHP 8.2.9 (cli) (built: Aug  3 2023 11:39:08) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.9, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.9, Copyright (c), by Zend Technologies

1-4. Apache 起動

$ sudo systemctl enable httpd
$ sudo systemctl start httpd

1-5. PHP ファイル作成

$ cd /var/www/html
$ sudo vi hello.php

 以下を貼り付ける。

<!DOCTYPE html>
<html>
    <head>
        <title>PHP Test</title>
    </head>
    <body>
        <?php echo '<p>Hello World</p>'; ?>
        <?php phpinfo(); ?>
    </body>
</html>

 上記のコードは以下を参考にした。

www.php.net


1-6. 動作確認

 http:/xxx.xxx.xxx.xxx/hello.php にアクセス。

図 1

2. PHP でデータベース接続

2-1. MySQL クライアントインストール

 インストールは以下を参考にした。

docs.aws.amazon.com

$ sudo dnf install -y mariadb105

 インストール後、バージョン確認。

[ec2-user@ip-172-31-10-77 html]$ mysql --version
mysql  Ver 15.1 Distrib 10.5.20-MariaDB, for Linux (x86_64) using  EditLine wrapper

2-2. 動作確認用テーブル作成、データ追加

 データベース接続。

$ mysql -h tutorial-db-instance.c3a7vynvhtxw.ap-northeast-1.rds.amazonaws.com -P 3306 -u tutorial_user -p

 使用するデータベースに切り替える。

MySQL [(none)]> use sample;

 データベース切り替え後、テーブル作成。

> CREATE TABLE PHP_DEMO (
  ID int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  NAME VARCHAR(45),
  ADDRESS VARCHAR(90)
);

 テーブル作成後、データ追加。

> insert into PHP_DEMO (name, address) values ('test-name-1', 'test-address-1');

2-3. PHP でデータベース接続

 クライアントインストール。

$ sudo dnf install -y php-mysqli

 クライアントについて:

www.php.net

 データベース接続情報ファイル /var/www/inc/dbinfo.inc を以下の内容で作成。ドキュメントルートフォルダの外に作成すること。

<?php
    define('DB_SERVER', 'tutorial-db-instance.c3a7vynvhtxw.ap-northeast-1.rds.amazonaws.com');
    define('DB_USERNAME', 'tutorial_user');
    define('DB_PASSWORD', 'tutorial_user');
    define('DB_DATABASE', 'sample');
    define('DB_PORT', 3306);
?>

Apache のドキュメントルートフォルダの確認

[ec2-user@ip-172-31-10-77 html]$ grep '^DocumentRoot' /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html"

 PHP ファイル /var/www/html/SamplePage.php を作成。

<?php include "../inc/dbinfo.inc"; ?>
<html>
<body>
<h1>Sample page</h1>

<!-- データベース接続 -->
<?php
  $connection = mysqli_connect(
    DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT
  );
?>

<table border="1"  cellpadding="10" cellspacing="1">
  <tr>
    <td>ID</td>
    <td>NAME</td>
    <td>ADDRESS</td>
  </tr>

  <!-- クエリ -->
  <?php
    // 全行取得
    $result = mysqli_query($connection, "SELECT * FROM PHP_DEMO");
    
    // クエリ結果をレコードごとに処理
    while($query_data = mysqli_fetch_row($result)) {
      echo "<tr>";
      echo "<td>",$query_data[0], "</td>",
           "<td>",$query_data[1], "</td>",
           "<td>",$query_data[2], "</td>";
      echo "</tr>";
    }
  ?>
</table>

<!-- データベース切断 -->
<?php
  // メモリ解放
  mysqli_free_result($result);
  // データベース切断
  mysqli_close($connection);
?>

</body>
</html>

2-4. 動作確認

図 2

3. メモ

関数について

  • mysqli_connect

 MySQLサーバに接続する関数。詳細は以下:

www.php.net

 この関数の定義は次の通り:

mysqli_connect(
    ?string $hostname = null,
    ?string $username = null,
    ?string $password = null,
    ?string $database = null,
    ?int $port = null,
    ?string $socket = null
): mysqli|false

 : mysql|false は、戻り値の型を表す。データベースの接続に成功した場合は mysqli オブジェクトを返し、失敗した場合は false を返すという意味。
 ?string $hostname = null は型宣言とデフォルト引数値を表す。詳細は次の通り:

  • ?string:変数 $hostname は文字列型。型の前にクエスチョンマークをつけると、null 型も許容する
  • $hostnamePHP の変数はドル記号の後に変数名を書く
  • = null:デフォルト引数であり、引数の省略が可能。デフォルト値は null であることを表す

 この関数のデフォルト引数に渡された値が null だった場合、/etc/php.ini の値が適用される。例えばポート番号の変数 $port は以下の値が適用される。

[ec2-user@ip-172-31-10-77 html]$ grep 'mysqli.default_port' /etc/php.ini
mysqli.default_port = 3306

 ※ php.ini を変更した場合、変更内容を反映させるにはphp-fpm.serviceを再起動する。

$ sudo systemctl restart php-fpm.service

 ※ FPM(FastCGI Process Manager)について:

www.php.net