PHP アドバンス

PHP MySQL データの取得 (SELECT)

1. MySQLデータベースからのデータ選択

MySQLからデータを取得するには、SQLの SELECT コマンドを使用します。

テーブルから特定のカラムを選択する場合は、以下の構文を使用します。

SELECT column1, column2, column3 FROM table_name

すべてのカラムを選択する場合は、アスタリスク(*)を使用します。

SELECT * FROM table_name

2. MySQLiを使用したデータの取得

以下の例では、MyGuests テーブルから idfirstnamelastname カラムを取得し、ページに表示します。

2.1 MySQLi オブジェクト指向での実装例

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// 接続の作成
$conn = new mysqli($servername, $username, $password, $dbname);
// 接続の確認
if ($conn->connect_error) {
  die("接続に失敗しました: " . $conn->connect_error);
}

$sql = "SELECT id, firstname, lastname FROM MyGuests";
// SQLクエリの実行
$result = $conn->query($sql);

// 結果セットの処理
if ($result->num_rows > 0) {
  // 各行のデータを出力
  while($row = $result->fetch_assoc()) {
    echo "id: " . $row["id"]. " - 名前: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
  }
} else {
  echo "結果は0件です";
}

$conn->close();
?>

2.2 コードの解説

まず、MyGuests テーブルから idfirstnamelastname カラムを選択するSQLクエリを作成します。

次の行の $conn->query($sql) でクエリを実行し、取得したデータを $result という変数に格納します。

その後、$result->num_rows > 0 を使用して、返された行が0より多い(データが存在する)かどうかを確認します。

データが存在する場合、fetch_assoc() 関数が結果セットを連想配列(Associative array)に変換し、ループ処理が可能になります。while() ループによって結果セットを順次処理し、各カラムのデータを出力していきます。

3. MySQLi 手続き型での実装例

上記と同じ処理を手続き型(Procedural)で記述すると以下のようになります。

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// 接続の作成
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 接続の確認
if (!$conn) {
  die("接続に失敗しました: " . mysqli_connect_error());
}

$sql = "SELECT id, firstname, lastname FROM MyGuests";
// SQLクエリの実行
$result = mysqli_query($conn, $sql);

// 結果セットの処理
if (mysqli_num_rows($result) > 0) {
  // 各行のデータを出力
  while($row = mysqli_fetch_assoc($result)) {
    echo "id: " . $row["id"]. " - 名前: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
  }
} else {
  echo "結果は0件です";
}

mysqli_close($conn);
?>

4. 結果をHTMLテーブルに出力する

実務ではデータを表形式で表示することが多いため、結果をHTMLの <table> タグに出力する例を見てみましょう。

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// 接続の作成
$conn = new mysqli($servername, $username, $password, $dbname);
// 接続の確認
if ($conn->connect_error) {
  die("接続に失敗しました: " . $conn->connect_error);
}

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  echo "<table><tr><th>ID</th><th>名前</th></tr>";
  // 各行のデータを出力
  while($row = $result->fetch_assoc()) {
    echo "<tr><td>".$row["id"]."</td><td>".$row["firstname"]." ".$row["lastname"]."</td></tr>";
  }
  echo "</table>";
} else {
  echo "結果は0件です";
}

$conn->close();
?>

5. PDOを使用したデータの取得

最後に、PDO(PHP Data Objects)を使用してデータを取得し、HTMLテーブルに表示する例です。

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

try {
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  // PDOのエラーモードを例外に設定
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
  die("接続できませんでした。 " . $e->getMessage());
}

try {
  $sql = "SELECT id, firstname, lastname FROM MyGuests";
  // SQLクエリの実行
  $result = $conn->query($sql);
  
  // 結果セットの処理
  if ($result->rowCount() > 0) {
    echo "<table><tr><th>ID</th><th>名</th><th>姓</th></tr>";
    // 各行のデータを出力
    while($row = $result->fetch()) {
      echo "<tr>";
      echo "<td>" . $row['id'] . "</td>";
      echo "<td>" . $row['firstname'] . "</td>";
      echo "<td>" . $row['lastname'] . "</td>";
      echo "</tr>";
    }
    echo "</table>";
    unset($result);
  } else {
    echo "レコードが見つかりませんでした。";
  }
} catch(PDOException $e) {
  echo "エラー: " . $e->getMessage();
}

$conn = null;
?>