PG WORKS

PHPやLinux(サーバー)などのノウハウや、便利なツールを紹介していきます。

【PHP&MySQL】手っ取り早くMySQLを使いたい方へ 接続&SELECT編

f:id:zen6a:20170410234701p:plain
PHP5.1以降から導入されたPHP Data Objects(PDO)を使い、手取り早くデータベースへ接続したい方に今回は記事を書いていきたいと思います。

まずは、MySQLへの接続のクラスを紹介。

MySQLサーバへ接続

<?php
	define("HOST"     ,"mysql:dbname=データベース名;host=127.0.0.1");
	define("ACCOUNT"  ,"mysqlのアカウント名");
	define("PASSWORD" ,"パスワード");
	$pdo = new PDO( HOST, ACCOUNT, PASSWORD );
?>

ここで接続できなかった場合、まずは下記の項目をチェックしてみましょう。

  1. PDOの記述間違いがないか確認。
  2. データベースが存在しているか、データベース名に間違っていないか確認。
  3. ホスト名が間違っていないか確認。(サーバが違う場合そのサーバのIPなど指定する。
  4. アカウント名・パスワードが間違っていないか確認。
  5. MySQLサーバがPHPが動いているサーバと別の場合、PHPが動いているサーバからアクセス権があるか確認。

上記の5項目確認しても繋がらない場合、エラー内容で調べてみると知恵袋などに回答が記載されてますので、該当箇所を再度確認してみましょう。

接続ができないと、PHPのエラーが表示されるため、try&catchを使い処理を作成しましょう。

<?php
	define("HOST"     ,"mysql:dbname=データベース名;host=127.0.0.1");
	define("ACCOUNT"  ,"mysqlのアカウント名");
	define("PASSWORD" ,"パスワード");
	try {
	    $pdo = new PDO( HOST, ACCOUNT, PASSWORD );
	} catch(PDOException $e) {
		echo 'データベース接続エラー';
	    die();
	}
?>

データベース内にあるテーブルにアクセスしデータを参照する方法

<?php
	$sql = 'SELECT id, name FROM sample';
	$sth = $pdo->prepare($sql);
	$sth->execute();
	$arySamples = $sth->fetchAll(PDO::FETCH_ASSOC);
?>

sampleテーブルにあるデータを変数「$arySamples」に格納します。
上のクエリーだと、sampleテーブルのすべてのデータを変数に格納しますが、idで指定して1つデータのみ参照する場合は、「$sth->fetchAll(PDO::FETCH_ASSOC);」を「$sth->fetch(PDO::FETCH_ASSOC);」に変えると、$arySamples["id"]な形式でデータを取得することが可能です。

特定のデータのみ参照する

<?php
	$sql = 'SELECT id, name FROM sample WHERE id= :id';
	$sth = $pdo->prepare($sql);
	$sth->bindValue(':id', "1", PDO::PARAM_INT);
	$sth->execute();
	$arySamples = $sth->fetch(PDO::FETCH_ASSOC);
?>

少し記述が変わってますが、「$sth->bindValue(':id', "1", PDO::PARAM_INT);」を使うことで、エスケープ処理も自動でやってくれるため、変数の格納が楽になります。
「$sth->bindValue」を使わなくても、「$sql」変数に直接記述もできますが、エスケープ処理されないため、「$sth->quote($string)」を使い処理しましょう。
PHP: PDO::quote - Manual

bindValueの第3引数について

PDO::PARAM_INT以外にも、いろんな定数があります。
PHP: 定義済み定数 - Manual

よく使うものだと。

  1. PDO::PARAM_INT
  2. PDO::PARAM_STR
  3. PDO::PARAM_NULL

この3つになるでしょうか。
「PDO::PARAM_NULL」の定数ですが、値をNULLにしたいときに利用します。
なので値がある場合、「PDO::PARAM_INT」OR「PDO::PARAM_STR」にしないとエラーになります。

クエリーエラーを確認する方法

<?php
	$sql = 'SELECT id, name FROM sample WHERE id= :id';
	$sth = $pdo->prepare($sql);
	$sth->bindValue(':id', "1", PDO::PARAM_INT);
	if( !$sth->execute() ){
		print_r($sth->errorInfo());
	}
	$arySamples = $sth->fetch(PDO::FETCH_ASSOC);
?>

PDOでは、クエリーエラーが表示されないため、「$sth->errorInfo()」で確認する必要があります。
※特にINSERTやUPDATE時。

エラー内容を保存して通知するような仕組みがあると、メンテナンスやトラブルの調査が楽になると思います。