🥳
アクセスカウンター:MySQLデータベース編
この記事について
この記事は、アクセスカウンターの連載です。
この記事の対象者
- 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は違います
ホスト名の指定ですが、localhost
と127.0.0.1
は一緒ではありません。
ホスト名の指定に、localhost
を使うと、socket
通信を行います。
ホスト名の指定に、127.0.0.1
を使うと、TCP
通信を行います。
"group" というカラムを作るとハマります
limit
やorder
なども同様です。これらは、SQL文の命令に使うため、カラム名に使ってしまうとエラーが発生します。しかし、"`"で、カラム名を括ると、エラーを回避することができます。
Discussion