読み込み中...

PHPでデータを操作する!独学でもわかるSQLクエリの結果取得10選

PHPを使ってSQLクエリの結果を取得するイラスト PHP
この記事は約16分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

WebサイトやWebアプリケーションの開発において、データベースとの連携は避けて通れない道です。

データベースから情報を取り出したり、新しいデータを追加したりするためには、SQLという特殊な言語を用いるのが一般的です。

しかしながら、SQLクエリをうまく活用するためには、その結果を適切に受け取り、プログラム内で利用できるようにすることが不可欠です。

この記事を読めば、初心者でもPHPを使ってSQLクエリの結果を取得する10の方法が身につくでしょう。

その際に必要となる具体的なサンプルコードとそれぞれの詳細な解説を共有します。

これにより、PHPとデータベースとの間でスムーズなデータのやりとりが可能となり、より高度なWeb開発が可能となるでしょう。

●PHPとは

PHPは、「Personal Home Page Tools」の略称から名付けられたプログラミング言語の一つです。

1995年に初版がリリースされ、その後も改良が重ねられ、今日では世界中のWeb開発者に広く利用されています。

PHPは、HTMLの中に直接埋め込んで使うことが可能で、そのためWebページの動的な部分を制御するのに非常に適しています。

また、データベースとの連携も容易なため、動的なWebサイトやWebアプリケーションを作るのによく用いられます。

●SQLクエリとは

○基本的なSQLクエリ

SQL(Structured Query Language:構造化クエリ言語)は、リレーショナルデータベース管理システム(RDBMS)と呼ばれる種類のデータベースを操作するための言語です。

データの検索、挿入、更新、削除などを行うために使われます。

基本的なSQLクエリには次のようなものがあります。

  • SELECT:データベースからデータを取得します。
  • INSERT:データベースに新しいデータを追加します。
  • UPDATE:既存のデータを更新します。
  • DELETE:データを削除します。

これらのクエリを組み合わせて、データベース上のデータを自由自在に操作することが可能となります。

●PHPでSQLクエリを実行する方法

PHPからSQLクエリを実行するには、まずデータベースへの接続を確立する必要があります。

そのためには、PHPが提供するMySQLiやPDOといったデータベース接続拡張を使用します。

次に、実行したいSQLクエリを文字列として準備し、データベース接続オブジェクトのメソッドを通じてクエリを実行します。

このときの戻り値として、SELECTクエリの場合は結果セットが、INSERTやUPDATE、DELETEクエリの場合は成功したかどうかを示す真偽値が返されます。

そして最後に、SELECTクエリの結果セットから具体的なデータを取り出すための方法が必要となります。

この結果の取得方法が本記事のメインテーマとなります。

これから10種類の方法を具体的なサンプルコードとともに紹介していきますので、それぞれの方法の特性を理解し、自分のプログラムに最適な方法を見つけてみてください。

●クエリ結果の取得方法10選

これから10種類の方法を具体的なサンプルコードとともに紹介していきます。

それぞれの方法について、その特性や使用方法を詳しく解説します。

あなたが抱えている課題や開発環境に最も合った方法を選んでいきましょう。

○サンプルコード1:mysql_fetch_array関数を使う

このコードでは、PHPのmysql_fetch_array関数を用いてSQLクエリの結果を取得する方法を紹介します。

この関数を利用すると、結果セットの行を配列として取得することができます。

//データベースに接続
$link = mysql_connect('localhost', 'dbuser', 'dbpass');

//データベースを選択
mysql_select_db('dbname', $link);

//SQLクエリを実行
$result = mysql_query('SELECT name, age FROM users', $link);

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    printf("名前: %s 、 年齢: %s\n", $row[0], $row[1]);
}

mysql_free_result($result);

上記の例では、mysql_fetch_array関数にMYSQL_NUMという定数を渡しています。

これにより、フィールド(カラム)のインデックスを数値で参照することが可能になります。

例えば、$row[0]は「name」フィールド、$row[1]は「age」フィールドを指しています。

この方法の利点は、コードがシンプルで分かりやすいことです。

欠点は、フィールド名を覚えておく必要があること、そしてmysql関数はPHP 7.0以降で非推奨となっており、新しいコードではPDOまたはMySQLiを使用することが推奨されています。

○サンプルコード2:mysql_fetch_row関数を使う

次に、mysql_fetch_row関数を使用した方法を解説します。

この関数は、mysql_fetch_array関数と同様に、SQLクエリの結果セットから1行を配列として取得します。

ただし、この関数が返す配列は数値インデックスのみとなります。

//データベースに接続
$link = mysql_connect('localhost', 'dbuser', 'dbpass');

//データベースを選択
mysql_select_db('dbname', $link);

//SQLクエリを実行
$result = mysql_query('SELECT name, age FROM users', $link);

while ($row = mysql_fetch_row($result)) {
    printf("名前: %s 、 年齢: %s\n", $row[0], $row[1]);
}

mysql_free_result($result);

この例では、mysql_fetch_row関数を用いて結果セットから1行を取得し、その行の各フィールドに数値インデックスでアクセスしています。

こちらもmysql_fetch_array関数同様にmysql関数はPHP 7.0以降で非推奨となっていますので、新しいプロジェクトではPDOまたはMySQLiを使用することが推奨されています。

○サンプルコード3:mysql_fetch_assoc関数を使う

mysql_fetch_assoc関数を使用すると、フィールド名をキーとした連想配列として結果セットから1行を取得することができます。

この方法は、フィールド名で直接データにアクセスできるため、フィールドの順序を覚えておく必要がないという利点があります。

//データベースに接続
$link = mysql_connect('localhost', 'dbuser', 'dbpass');

//データベースを選択
mysql_select_db('dbname', $link);

//SQLクエリを実行
$result = mysql_query('SELECT name, age FROM users', $link);

while ($row = mysql_fetch_assoc($result)) {
    printf("名前: %s 、 年齢: %s\n", $row['name'], $row['age']);
}

mysql_free_result($result);

このコードでは、結果セットの行を連想配列として取得しています。

そのため、$row[‘name’]で「name」フィールドの値に、$row[‘age’]で「age」フィールドの値にアクセスしています。

こちらもmysql関数はPHP 7.0以降で非推奨となっていますので、新しいプロジェクトではPDOまたはMySQLiを使用することが推奨されています。

○サンプルコード4:mysql_fetch_object関数を使う

mysql_fetch_object関数を使用すると、フィールド名をプロパティとしたオブジェクトとして結果セットから1行を取得することができます。

この方法は、連想配列に似ていますが、フィールドへのアクセスがオブジェクトのプロパティを通じて行われる点が異なります。

//データベースに接続
$link = mysql_connect('localhost', 'dbuser', 'dbpass');

//データベースを選択
mysql_select_db('dbname', $link);

//SQLクエリを実行
$result = mysql_query('SELECT name, age FROM users', $link);

while ($row = mysql_fetch_object($result)) {
    printf("名前: %s 、 年齢: %s\n", $row->name, $row->age);
}

mysql_free_result($result);

この例では、$rowがオブジェクトになり、フィールド名がそのプロパティとなります。

そのため、$row->nameで「name」フィールドの値に、$row->ageで「age」フィールドの値にアクセスしています。

こちらもmysql関数はPHP 7.0以降で非推奨となっていますので、新しいプロジェクトではPDOまたはMySQLiを使用することが推奨されています。

○サンプルコード5:PDOのfetch関数を使う

PHP Data Objects(PDO)はPHPで提供されているデータベース抽象化ライブラリで、多くのデータベースに対応しています。

PDOのfetch関数を使用すると、結果セットから1行を取得することができます。

下記のコードでは、PDOを使用してMySQLデータベースに接続し、結果セットから1行を取得しています。

//データベースに接続
$dsn = 'mysql:host=localhost;dbname=dbname;charset=utf8';
$user = 'dbuser';
$password = 'dbpass';
$pdo = new PDO($dsn, $user, $password);

//SQLクエリを実行
$sql = 'SELECT name, age FROM users';
$stmt = $pdo->query($sql);

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    printf("名前: %s 、 年齢: %s\n", $row['name'], $row['age']);
}

このコードではPDO::FETCH_ASSOCという定数を指定して、結果セットの行を連想配列として取得しています。

そのため、$row[‘name’]で「name」フィールドの値に、$row[‘age’]で「age」フィールドの値にアクセスしています。

○サンプルコード6:PDOのfetchAll関数を使う

fetchAll関数は、結果セットの全行を一度に取得することができます。

この関数は大量のデータを取り扱う場合には注意が必要ですが、データ量が少ない場合や、一度に全てのデータを取得したい場合には便利です。

下記のコードでは、PDOを使用してMySQLデータベースに接続し、結果セットの全行を一度に取得しています。

//データベースに接続
$dsn = 'mysql:host=localhost;dbname=dbname;charset=utf8';
$user = 'dbuser';
$password = 'dbpass';
$pdo = new PDO($dsn, $user, $password);

//SQLクエリを実行
$sql = 'SELECT name, age FROM users';
$stmt = $pdo->query($sql);

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($rows as $row) {
    printf("名前: %s 、 年齢: %s\n", $row['name'], $row['age']);
}

このコードではfetchAll関数を使用して結果セットの全行を一度に取得しています。取得した全行は$rows配列に格納され、その後foreachループを使用して各行を処理しています。

○サンプルコード7:PDOのfetchColumn関数を使う

PDOのfetchColumn関数は、結果セットから指定したカラムの値を1つだけ取得します。

これは特定のカラムの値のみが必要なときや、データセットが1行しかないときに便利です。

下記のコードでは、PDOを使用してMySQLデータベースに接続し、結果セットから’name’カラムの値を1つ取得しています。

//データベースに接続
$dsn = 'mysql:host=localhost;dbname=dbname;charset=utf8';
$user = 'dbuser';
$password = 'dbpass';
$pdo = new PDO($dsn, $user, $password);

//SQLクエリを実行
$sql = 'SELECT name FROM users';
$stmt = $pdo->query($sql);

$name = $stmt->fetchColumn();
printf("名前: %s\n", $name);

このコードはfetchColumn関数を使用して’name’カラムの値を取得しています。

取得した’name’カラムの値は$name変数に格納され、後にprintf関数を使用して出力されています。

○サンプルコード8:PDOのfetchObject関数を使う

fetchObject関数は結果セットの行をオブジェクトとして取得します。

これはオブジェクト指向プログラミングを用いたときに特に有用です。

下記のコードでは、PDOを使用してMySQLデータベースに接続し、結果セットの行をオブジェクトとして取得しています。

//データベースに接続
$dsn = 'mysql:host=localhost;dbname=dbname;charset=utf8';
$user = 'dbuser';
$password = 'dbpass';
$pdo = new PDO($dsn, $user, $password);

//SQLクエリを実行
$sql = 'SELECT name, age FROM users';
$stmt = $pdo->query($sql);

while ($obj = $stmt->fetchObject()) {
    printf("名前: %s 、 年齢: %s\n", $obj->name, $obj->age);
}

このコードではfetchObject関数を使用して結果セットの行をオブジェクトとして取得しています。

そのため、$obj->nameで「name」フィールドの値に、$obj->ageで「age」フィールドの値にアクセスしています。

○サンプルコード9:mysqliのfetch_array関数を使う

MySQL Improved(mysqli)はPHPからMySQLデータベースにアクセスするための別の方法で、PDOとは異なるAPIを提供します。

mysqliのfetch_array関数は、結果セットから1行を配列として取得します。

下記のコードでは、mysqliを使用してMySQLデータベースに接続し、結果セットから1行を配列として取得しています。

//データベースに接続
$mysqli = new mysqli('localhost', 'dbuser', 'dbpass', 'dbname');

//SQLクエリを実行
$sql = 'SELECT name, age FROM users';
$result = $mysqli->query($sql);

while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
    printf("名前: %s 、 年齢: %s\n", $row['name'], $row['age']);
}

このコードではfetch_array関数を使用して結果セットの行を配列として取得しています。

そして、MYSQLI_ASSOCという定数を指定して連想配列を取得しています。

そのため、$row[‘name’]で「name」フィールドの値に、$row[‘age’]で「age」フィールドの値にアクセスしています。

○サンプルコード10:mysqliのfetch_assoc関数を使う

mysqliのfetch_assoc関数は結果セットの次の行を連想配列として取得します。

この方法はfetch_array関数によく似ていますが、fetch_assoc関数は連想配列だけを返すため、結果セット内のフィールド名を直接指定して値にアクセスすることができます。

下記のコードでは、mysqliを使用してMySQLデータベースに接続し、結果セットの次の行を連想配列として取得しています。

//データベースに接続
$mysqli = new mysqli('localhost', 'dbuser', 'dbpass', 'dbname');

//SQLクエリを実行
$sql = 'SELECT name, age FROM users';
$result = $mysqli->query($sql);

while ($row = $result->fetch_assoc()) {
    printf("名前: %s 、 年齢: %s\n", $row['name'], $row['age']);
}

このコードはfetch_assoc関数を使用して結果セットの行を連想配列として取得しています。

そのため、$row[‘name’]で「name」フィールドの値に、$row[‘age’]で「age」フィールドの値にアクセスしています。

●注意点と対処法

PDOやmysqliを使用してデータベースからデータを取得するときには、いくつかの注意点があります。

  1. エラーハンドリング:SQLクエリの実行が失敗した場合や、データベースへの接続が失敗した場合には、適切なエラーメッセージを表示することで問題を特定しやすくします。
  2. セキュリティ:SQLインジェクション攻撃を防ぐために、ユーザーからの入力を直接SQLクエリに含めないようにします。代わりに、プリペアドステートメントを使用します。
  3. リソース管理:必要ないときはデータベース接続を閉じるとともに、大量のデータを処理する場合は適時メモリを解放します。

●クエリ結果の活用例

データベースからデータを取得した後は、そのデータを適切に活用することが重要です。

例えば、データをHTMLテーブルに表示したり、JSON形式でAPIレスポンスとして返したりすることができます。

また、データをファイルに出力したり、メールで送信したりすることもできます。

まとめ

この記事では、PHPを使用してデータベースからデータを取得する方法をいくつかご紹介しました。

各方法にはそれぞれ利点と欠点があり、使用する状況によって最適な方法が変わります。

たとえば、一般的な目的であればPDOを使用すると良いでしょう。

一方、MySQL専用の高度な機能を使用する必要がある場合は、mysqliを使用すると良いでしょう。

また、データを安全に取得するための注意点と対処法についても触れました。

SQLクエリの実行は、Webアプリケーションのセキュリティに直接影響する重要な作業です。

適切なエラーハンドリングとセキュリティ対策を常に心掛けてください。

最後に、データベースから取得したデータの活用方法についても述べました。

データベースからデータを取得する目的は、そのデータを何らかの形で活用することです。

データを適切に活用することで、より良いユーザー体験を提供することが可能になります。

あなたのプログラミングスキルの向上と、より良いWebアプリケーションの開発に、この記事が少しでも役立てば幸いです。