🥳

アクセスカウンター:MySQLデータベース編

2024/08/17に公開

この記事について

この記事は、アクセスカウンターの連載です。
https://zenn.dev/phpbeginners/books/49b9ede3c8c30e/viewer/62bec3

この記事の動作サンプルはこちら

この記事の対象者

  • PHPの基礎が分かったのでステップアップしたい
  • データベースの基本的な操作が分かる
    • MySQLのインストールが完了している
    • MySQLにデータベースを作成することができる
    • MySQLにテーブルを作成することができる

この記事で学べること

  • 簡単なSQL文の書き方
    • INSERT: 新規レコードの挿入
    • SELECT: 既存レコードの選択
    • UPDATE: 既存レコードの更新
  • プリペアドステートメント(安全なSQL文の書き方)
  • try catch文の書き方
  • PDOの使い方

テーブルの構造

この記事のプログラムで使うテーブルの構造は以下のようになっています。

CREATE TABLE `t_count` (
  `date` date NOT NULL,
  `count` int unsigned NOT NULL,
  PRIMARY KEY (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

PHPのプログラム

コメントは3点リーダーになっているので、自分でコメントを埋めてみて下さい❗

<?php
//	...
error_reporting(E_ALL);

//	...
date_default_timezone_set('Asia/Tokyo');

//	...
if(!class_exists('PDO') ){
	exit('<p style="color:red;">PDO is not installed.</p>');
}

//	...
$hostname = 'localhost';
$database = 'php_test';
$username = 'php_user';
$password = 'password';
$dsn      = "mysql:host={$hostname};dbname={$database};charset=utf8";

//	...
try {
	//	...
	$pdo = new PDO($dsn, $username, $password);
	$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

	//	...
	$date = date('Y-m-d');

	//	...
	$sql = 'SELECT * FROM `t_count` WHERE `date` = :date';
	$stmt = $pdo->prepare($sql);
	$stmt->bindValue(':date', $date);
	$stmt->execute();

	//	...
	$record = $stmt->fetch(PDO::FETCH_ASSOC);

	//	...
	if( empty($record) ){
		//	...
		$count = 1;
		$sql = "INSERT INTO `t_count` (`date`, `count`) VALUES (:date, :count)";
	}else{
		//	...
		$count = $record['count'] +1;
		$sql = "UPDATE `t_count` SET `count` = :count WHERE `date` = :date";
	}

	//	...
	$stmt = $pdo->prepare($sql);
	$stmt->bindValue(':date', $date);
	$stmt->bindValue(':count', $count);

	//	...
	$stmt->execute();

	//	...
	echo "Today: {$count}<br/>";

} catch (PDOException $e) {
	$file = $e->getFile();
	$line = $e->getLine();
	$error_message = $e->getMessage();
	echo "<p style='color:red;'>PDOException: {$error_message}</p>";
	echo "{$file} #{$line}<br/>";
}

MySQLの仕様上の注意

localhostと127.0.0.1は違います

ホスト名の指定ですが、localhost127.0.0.1は一緒ではありません。
ホスト名の指定に、localhostを使うと、socket通信を行います。
ホスト名の指定に、127.0.0.1を使うと、TCP通信を行います。

"group" というカラムを作るとハマります

limitorderなども同様です。これらは、SQL文の命令に使うため、カラム名に使ってしまうとエラーが発生します。しかし、"`"で、カラム名を括ると、エラーを回避することができます。

Discussion