やりたいこと
PHPでDBからデータを取得したり、逆に操作したりするようなSQLを投げたい。
環境
PHP 5.5.9
MySQL 14.14
やり方
色々手法はあるみたいですが、SQLインジェクション対策を意識したやり方で実現することに。
接続情報の設定
まずは接続するDBの情報を持たせる。
$dsn = 'mysql:host=localhost;dbname=bbs;charset=utf8';
$user = 'user01';
$password = 'password';
1行目は接続先のホスト名、DB名の指定。
2、3行目はDBに接続するユーザー名、パスワード。
接続
$db = new PDO($dsn,$user,$password);
$db->setAttribute(PDO::ATTR_EMULATE_PREPAES,false);
PDOはPHPとDBとの間に入る抽象化レイヤー。
先程宣言したDB情報とユーザー名、パスワードを指定してインスタンス化。
2行目は静的プレースホルダを使用するために必要な設定。
プリペアドステートメントの設定
$stmt = $db->prepare("SELECT * FROM T_TEST WHERE id = :id");
$stmt->bindparam(':id', $id ,PDO::PARAM_INT);
$stmt->execute();
prepareで発行したいSQLを指定する。
この際、何かしら変数をSQL文に埋め込む場合(今回の例だとID)、直接変数で指定するのではなく、bindparamを噛ませてデータを渡してあげる。
渡す値にクォーテーションなどが紛れて、意図しないSQLの動作を防げる。
最後にexecuteで実行。
DBから取得したデータは$stmtに連想配列で格納されるので、そこからfetchするなりなんなりで扱っていく。
ちなみに連想配列に設定されるIDはDBのカラム名と同じになる。