会員サイト、データベースを使用したサイトは、MySQLをPHPから操作したくなることがしばしばあります。今回は、難しいことは考えず、簡単なPHPコードからMySQLを使用するテンプレートを書いていきたいと思います。コピペだけでほぼ使用可能なコードを書くつもりなので、是非ご利用ください。
スポンサーリンクデータベース接続初期設定部分
データベースに接続するために必ず読み込む部分を書いていきます。なお、万が一のPHPが生の状態で出力される事態に対応するため、ユーザー名、パスワードは、外部から見えないディレクトリに配置することをお勧めします。というか、そうしないとどうなってしまうか分かりません。PHPから以下のPHPコードを、requireを用いて引っ張ってくる感じになります。
$dsn = 'mysql:host=ホストのアドレス(localhostなど);dbname=データベース名';
$username = 'データベースのユーザーネーム';
$password = 'データベースのパスワード';
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4', PDO::ATTR_EMULATE_PREPARES => false);
try {
$pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
//$error = $e->getMessage(); などお好きなように
}
これでちゃんと接続されます。以降は$pdoを使ってSQL文を実行していく形になります。
SQL実行部分
SQLインジェクションによる攻撃を防ぐための機能が備わっているので、ありがたく使わせてもらいます。先に文の形を入力(prepare)して、そのあとに変数を代入、実行(execute)していくような感じになります。prepare段階では、変数を?(半角ハテナ)として入れておきます。
$number = 1;
$state = 2;
$sql = $pdo->prepare('SELECT * FROM テーブル名 WHERE number = ? && state = ?');
$sql->execute(array($number, $state));
また、先ほど書いたdsn.phpから$eが出てきます。例外が発生していないかどうか、確認する必要があります。例外の有無の確認をあとでしっかり実装しておきます。
SELECT時の行データ取得
INSERT文など、データが返ってこない文では、これは必要ありません。
$rowという配列に行データを入れることにします。$row['列名']で、お望みのデータを取得することができるようになります。一行ごと取得していくので、while文にすると、すべてのデータを得ることができます(複数行が存在した場合)。一行だけだとわかっている場合は、if文で十分だと思います。
if($row = $sql->fetch(PDO::FETCH_ASSOC)){
echo (string)$row['列名'];
}else{
echo 'エラー';
}
まとめる
全体の雰囲気を一応書いておきます。
//dsn.php
$dsn = 'mysql:host=ホストのアドレス(localhostなど);dbname=データベース名';
$username = 'データベースのユーザーネーム';
$password = 'データベースのパスワード';
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4', PDO::ATTR_EMULATE_PREPARES => false);
try {
$pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
//$error = $e->getMessage(); などお好きなように
}
//hoge.php
require '../外部から見えないディレクトリ/dsn.php';
if(empty($e)){
try{
$number = 1;
$state = 2;
$sql = $pdo->prepare('SELECT * FROM テーブル名 WHERE number = ? && state = ?');
$sql->execute(array($number, $state));
if($row = $sql->fetch(PDO::FETCH_ASSOC)){
echo (string)$row['列名'];
}else{
echo 'エラー';
}
} catch (PDOException $e) {
echo 'エラー';
}
} else {
echo 'エラー';
}
何かヘンなところがありましたら、コメントをよろしくお願いします。
ありがとうございました。
更新履歴
コメントをいただきました通り、
PDO::ATTR_EMULATE_PREPARES => false
SET NAMES utf8mb4
に変更しました。
「データベース名」と書かれていた部分を「テーブル名」と修正しました。
コメント
PDOの$optionsには、
PDO::ATTR_EMULATE_PREPARES => false
を追加しておいたほうが、PDOのプレースホルダのバインド処理に脆弱性があっても安全になりますよ。
(サーバーでSQLをコンパイルしてから値をバインドするのでSQLインジェクションの余地がなくなる)
あと、文字コードはutf8mb4にしないと寿司ビール問題が起こるので要注意ですw