PHP初心者向け完全ガイド|PDOでMySQL接続・SQL・実務のお作法まで解説

2026年5月19日火曜日

PHP バックエンド プログラミング

t f B! P L

PHP初心者向け完全ガイド|PDOでMySQL接続・実務レベルの基礎を旅行中プログラマが解説

旅先のカフェでMacを開いてコードを書く。
バックパックの中には最低限の荷物だけ。
でも、サーバーエラーだけは最低限じゃ済まされない。

PHPは「古い」と言われることもありますが、実際の現場では今でも圧倒的に使われています。
WordPress、Laravel、ECサイト、業務システム。世界中のWebの裏側で普通に動いています。

そしてPHPを学び始めると、かなり高確率でぶつかるのがこれ。

  • DB接続ができない
  • SQLエラーで画面が真っ白
  • プリペアドステートメントって何?
  • PDOとmysqliの違いが分からない
  • XSS?SQLインジェクション?怖そう

この記事では、PHPの基本構文からMySQL接続、実務で本当に重要な「お作法」までを、現場視点でまとめます。


PHPとは?なぜ今でも現場で使われるのか

PHPはWeb開発に特化したサーバーサイド言語です。

ブラウザで見える画面の裏側で、

  • データベース接続
  • ログイン処理
  • 会員登録
  • 記事投稿
  • 決済処理

などを担当しています。

特にWordPress系案件では今でもPHPスキルの需要がかなり高いです。


PHPの基本構文をまず押さえる

PHPタグ

まずは最小構成。


<?php
echo "Hello, World!";

最初は「echo地獄」になります。
でも全員そこから始まります。


変数


$name = "Suzuki";
$age = 30;
$isActive = true;
  • 変数は $ から始まる
  • PHPは動的型付け
  • 型宣言は後からでもOK

JavaやC系から来ると最初はかなり自由に感じます。


定数


define("APP_NAME", "SampleApp");

const VERSION = "1.0";

設定値や固定値には定数を使うのが定番です。


配列


// インデックス配列
$colors = ["red", "blue"];

// 連想配列
$user = [
    "name" => "Suzuki",
    "age" => 30
];

PHPは配列が超重要。
実務ではJSONレスポンスやDB取得データを大量に扱います。


条件分岐


if ($age >= 20) {
    echo "adult";
} elseif ($age >= 13) {
    echo "teen";
} else {
    echo "child";
}

ログイン制御や権限管理でも頻繁に使います。


ループ処理


// for
for ($i = 0; $i < 5; $i++) {
    echo $i;
}

// foreach
foreach ($user as $key => $value) {
    echo "$key: $value";
}

特に foreach は現場で毎日見るレベルで使います。


関数


function add(int $a, int $b): int {
    return $a + $b;
}

最近のPHPは型宣言もかなり強くなっています。


クラス


class User {

    public string $name;

    public function __construct(string $name) {
        $this->name = $name;
    }

    public function greet(): string {
        return "Hello " . $this->name;
    }
}

Laravelなどのフレームワークに進むならクラス理解は必須です。


PHPでファイル分割する理由

コードを1ファイルに全部書くと、数日後には自分でも読めなくなります。


require "config.php";
include "util.php";
  • require → 必須ファイル
  • include → 任意ファイル

現場では設定ファイル、DB接続、共通関数などを分離します。


PDOでMySQL接続する方法【超重要】

PHP学習で最重要ポイントの一つ。

昔はmysqliも使われていましたが、今ならPDOが基本です。

PDO接続サンプル


$dsn = "mysql:host=localhost;dbname=test_db;charset=utf8mb4";
$user = "dbuser";
$password = "password";

$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

$pdo = new PDO($dsn, $user, $password, $options);

ここが実務で重要

  • ERRMODE_EXCEPTION は必須級
  • utf8mb4 を使う
  • FETCH_ASSOC で扱いやすくする

旅先で深夜にDBエラーを追うと、この設定のありがたみが分かります。


SELECT文でデータ取得


$stmt = $pdo->query("SELECT * FROM users");
$rows = $stmt->fetchAll();

foreach ($rows as $row) {
    echo $row['name'];
}

データベースから一覧取得する基本形です。


プリペアドステートメントは絶対覚える

これは本当に重要。

SQLインジェクション対策の基本になります。


$stmt = $pdo->prepare(
    "SELECT * FROM users WHERE id = :id"
);

$stmt->execute([
    'id' => 1
]);

$user = $stmt->fetch();

なぜ必要?

もし直接SQL文字列を組み立てると危険です。


$sql = "SELECT * FROM users WHERE id = $id";

これ、実は攻撃される可能性があります。

現場では「プリペアド使ってないSQL」はかなり嫌がられます。


INSERT・UPDATE・DELETEの基本

INSERT


$stmt = $pdo->prepare(
    "INSERT INTO users (name, email)
     VALUES (:name, :email)"
);

$stmt->execute([
    'name' => 'Suzuki',
    'email' => 'test@example.com'
]);

UPDATE


$stmt = $pdo->prepare(
    "UPDATE users
     SET name = :name
     WHERE id = :id"
);

$stmt->execute([
    'name' => 'Tanaka',
    'id' => 1
]);

DELETE


$stmt = $pdo->prepare(
    "DELETE FROM users WHERE id = :id"
);

$stmt->execute([
    'id' => 1
]);

CRUD(Create・Read・Update・Delete)は毎日使います。


トランザクションを理解すると一気に実務感が出る

例えば銀行送金。

  • A口座から減額
  • B口座へ加算

片方だけ成功したら大事故です。

そこで使うのがトランザクション。


try {

    $pdo->beginTransaction();

    $pdo->exec(
        "INSERT INTO users (name) VALUES ('A')"
    );

    $pdo->exec(
        "INSERT INTO users (name) VALUES ('B')"
    );

    $pdo->commit();

} catch (Exception $e) {

    $pdo->rollBack();

    echo "失敗:" . $e->getMessage();
}

実務ではかなり重要です。


現場でよく見るPHPのお作法

SQLとロジックを分離する

ControllerにSQLを直書きすると地獄化します。

  • SQL → Repository層
  • 画面制御 → Controller

役割分離が重要です。


DB接続を共通化する


// db.php

function getPDO(): PDO {

    static $pdo = null;

    if ($pdo === null) {
        $pdo = new PDO(...);
    }

    return $pdo;
}

複数回接続を防げます。


.envで環境変数管理

接続情報をGitHubに上げる事故、初心者時代にやりがちです。


$dsn = $_ENV['DB_DSN'];

本番環境では必須レベル。


XSS対策


echo htmlspecialchars(
    $user['name'],
    ENT_QUOTES,
    'UTF-8'
);

ユーザー入力は信用しない。

これ、Web開発の鉄則です。


例外ベースで統一

  • try-catchで統一
  • 戻り値でエラー判定しない

コードの見通しがかなり良くなります。


strict_typesを使う


declare(strict_types=1);

型バグを減らせます。

PHP8系では特に重要。


PHP初心者がハマりやすいポイント

  • 文字コード問題
  • SQLインジェクション
  • NULLエラー
  • requireパス問題
  • 本番だけ動かない問題

これ、本当にあるあるです。

海外の安宿Wi-Fiでサーバー確認してる時に限って発生します。


実務ベースのPHPチェックリスト

  • ✅ PDOを使う
  • ✅ プリペアドステートメント必須
  • ✅ 例外モードON
  • ✅ DB接続共通化
  • ✅ トランザクション使用
  • ✅ htmlspecialcharsでXSS対策
  • ✅ .envで接続情報管理
  • ✅ strict_typesを使う

まとめ|PHPは「基礎」が強い人ほど伸びる

派手なフレームワークを触る前に、

  • PDO
  • プリペアドステートメント
  • 例外処理
  • XSS対策
  • トランザクション

この辺りを理解しておくと、後で本当に楽になります。

Laravelを学ぶ時も、 「なぜその書き方なのか」が理解できるようになります。

旅先でコードを書く時も、
結局最後に助けてくれるのは基礎力です。

PHPは地味に見えるけど、現場ではかなり強い。
そして、ちゃんと学ぶと想像以上に奥が深い言語です。

このブログを検索

Blog Archive

Welcome



旅するWebライター「Hide」のブログへようこそ!

2年間の世界一周を終え、今は旅の思い出を言葉にしながら、AIやプログラミングという新しい冒険を楽しんでいます。最新技術を味方につけて、もっと自由でクリエイティブな発信を続けていきます!

人気の投稿

QooQ