【これだけ】PHPからPDOでMySQLを操作する方法【現役エンジニアが解説】

PROGRAM

今回は、PHPからPDOでMySQLを操作する方法について、SELECT文とDML文の場合に分け、簡単に解説していきます。

PHPからPDOでMySQLにSELECT文を実行

PHPからMySQLに接続する際はPDOクラスを使うことが一般的です。

PDOを使って、PHPからMySQLにSELECT文を実行するコードは以下のとおりです。

$pdo = new PDO("mysql:host={host};dbname={dbname}", "{user}", "{password}");
$sql = "SELECT user_id, name FROM users";
$stmt = $pdo->query($sql);
foreach($stmt as $row) {
    echo "ユーザID:".$row['user_id']."のユーザ名は".$row['name']."です。";
}

ここではエラーは一切考慮しておらず、取得したレコードごとにデータの出力を行っています。

PHPからPDOでMySQLにDML文を実行

PHPからPDOでMySQLにDML文を実行する際は、少しコードの書き方が変わってきます。

DML文とは、データを操作するSQL文のことで、INSERT文やUPDATE文、DELETE文を指します。

$pdo = new PDO("mysql:host={host};dbname={dbname}", "{user}", "{password}");
$sql = "INSERT INTO users (name) VALUES ('{name}')";
$pdo->exec($sql);

DML文を実行する際は、上記のようなコードとなります。

エラーを考慮する場合には$pdo->exec($sql)の戻り値を見る必要があります。

バインドによる脆弱性対策

詳しくは割愛させて頂きますが、実務ではSQLインジェクション対策を行う必要があります。

これは開発者にとってはやや面倒なことですが、PHPではbindValue関数を利用することで簡単に対策することができます。

$pdo = new PDO("mysql:host={host};dbname={dbname}", "{user}", "{password}");
$sql = "SELECT user_id, name from users WHERE name = :name";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":name", "{name}", PDO::PARAM_STR);
$stmt->execute();
foreach($stmt as $row) {
    echo "ユーザID:".$row['user_id']."のユーザ名は".$row['name']."です。";
}

上記のコードはSELECT文をバインドによって脆弱性対策したものになります。

一方で、以下のコードはINSERT文等のDML文をバインドで脆弱性対策したコードです。

$pdo = new PDO("mysql:host={host};dbname={dbname}", "{user}", "{password}");
$sql = "INSERT INTO users (name) VALUES (:name)";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":name", "{name}", PDO::PARAM_STR);
$stmt->execute();

自前で対策を行うとなるとhtmlspecialchars関数等で特定文字をエスケープする必要がありますが、バインドを使えばその手間が一切なくなるのでかなり楽になります。