サイトアイコン スグブログ

【PHP基礎】PDOのfetchやfetchAllで値を抽出する

script

Green binary code on a black background.

fetchとはPHPでデータベースにアクセスして、値を抽出する時に使用するメソッドです。

fetchを使用しDBの値を抽出して、利用しましょう。

fetchを使いこなしDBを使用すればコードも綺麗になり、やれる事が大幅にアップします。

私もfetchを使用してから、コードが単純で綺麗になりました。

あなたもfetchを使いこなしてPHPで出来る事を増やしましょう!

ではやってみます。

この記事で理解出来る事
  • DBの値を抽出する「fetch」について、理解できる
  • fetchを使用して抽出した結果を見る事が出来る
  • DBの値を抽出して、やりたい事の幅を広げる事が出来る

PDOのfetchやfetchAllで値を抽出する

抽出するfetchメソッドとは

fetchとは「抽出する」という意味があります。

fetchを使用するには、DBに接続してSQL文でデータを変数に格納する必要があります。

fetchで抽出する為に、DBアクセスとSQL構文を準備する

DBにアクセスするPDOを使用して、新しいインスタンスを作成し、変数に格納します。

そのコードが下記になります。

<?php
try{
 $DB_DATABASE = 'mydatabase';
 $DB_USERNAME = 'root';
 $DB_PASSWORD = '';
 $DB_OPTION = 'charset=utf8';
 $PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION;
 $db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD,
 [   PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 ]);
 echo 'DB接続成功</br>';
 $stmt = $db->prepare("select name from users where score=?");
 $stmt->bindValue(1,44,PDO::PARAM_INT);
 $stmt->execute();
 } catch(PDOException $e){
 echo 'DB接続失敗';
}
?>

上記のコードの詳しい説明は、下記の「DBにアクセスする時の構文を理解する」と「PDOのprepareとqueryでSQL文を変数に格納する」の記事を参照してください。

「users」というテーブルの「score」が「44」の「name」を抽出しようとしています。

テーブルを参照する

今回下記のテーブルを作成したとします。

DB名:mydatabase テーブル名:users

id name score
1user_147
2user_224
3user_344
4user_444
mydatabaseのusersテーブル

今回はusersテーブルに、4人のユーザーが登録しているデータベースを使用します。

メソッドのfetchには2種類あります。
  1. fetch
  2. fetchAll

fetchとfetchAllの違い

fetchとfetchAllの違いは、 初めに抽出された1つを取得するか、全てを抽出するかです!

fetchとfetchAllの基本構文は下記です。

$変数= $prepareかqueryで実行した変数->fetch(PDO::定数);

PDO::定数は後で説明します。

fetch

初めに抽出された1つを取得する。

先程のコードにfetch構文を追記して、ページにアクセスして見ましょう。

 <?php
try{
 $DB_DATABASE = 'mydatabase';
 $DB_USERNAME = 'root';
 $DB_PASSWORD = '';
 $DB_OPTION = 'charset=utf8';
 $PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION; #DSN データソースネームmysqlの場合
 $db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD, #接続するにはまずインスタンスを作成
 [   PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 ]);
 echo 'DB接続成功</br>';
 $stmt = $db->prepare("select name from users where score=?");
 $stmt->bindValue(1,44,PDO::PARAM_INT);
 $stmt->execute();
 $score44 = $stmt->fetch(PDO::FETCH_ASSOC);
 print_r($score44);
 } catch(PDOException $e){
 echo 'DB接続失敗';
}
?>

結果は下記となりました。

DB接続成功
Array ( [name] => user_3 )

配列になって変数に格納されています。

Keyが「name」で値が「user_3」という配列が取得できました。

今回はfetchなので「user_3」のみ取得している事に気をつけて下さい。

fetchAll

当てはまるものすべてを取得する。

先程のコードの「fetch」を「fetchAll」変更して、ページにアクセスして見ましょう。

<?php
try{
 $DB_DATABASE = 'mydatabase';
 $DB_USERNAME = 'root';
 $DB_PASSWORD = '';
 $DB_OPTION = 'charset=utf8';
 $PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION; #DSN データソースネームmysqlの場合
 $db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD, #接続するにはまずインスタンスを作成
 [   PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
 ]);
 echo 'DB接続成功</br>';
 $stmt = $db->prepare("select name from users where score=?");
 $stmt->bindValue(1,44,PDO::PARAM_INT);
 $stmt->execute();
 $score44 = $stmt->fetchAll(PDO::FETCH_ASSOC);
 print_r($score44);
 } catch(PDOException $e){
 echo 'DB接続失敗';
}
?>

結果は下記となりました。

DB接続成功
Array ( [0] => Array ( [name] => user_3 ) [1] => Array ( [name] => user_4 ) )

配列0にKey「name」値「user_3」と1に Key「name」値「user_4」が格納されています。

fetchでは最初の1つが配列として取得されました。fetchAllでは当てはまる全てが配列として取得されました。

fetchとfetchAl使用時のPDOメソッド

先程のコードでfetchメソッドを実行した時にPDO::定数がありました。よく使用するのは下記ぐらいです。

PDO::定数
  • PDO::FETCH_BOTH ・・・デフォルト
  • PDO::FETCH_ASSOC
  • PDO::FETCH_NUM
  • PDO::FETCH_COLUMN
  • PDO::FETCH_KEY_PAIR

今回は「PDO::FETCH_ASSOC」としましたが、今度は「PDO::FETCH_BOTH」と変更して実行して見ます。

PDO::FETCH_BOTH

fetchで定数PDO::FETCH_BOTHを行います。

$score44 = $stmt->fetch(PDO::FETCH_BOTH);
DB接続成功
Array ( [name] => user_3 [0] => user_3 )

先程の結果に0番目に値が「user_3」の配列が追加されています。

fetchAllで定数PDO::FETCH_BOTHを行います。

$score44 = $stmt->fetchAll(PDO::FETCH_BOTH);
DB接続成功
Array ( [0] => Array ( [name] => user_3 [0] => user_3 ) [1] => Array ( [name] => user_4 [0] => user_4 ) )

先程の結果の0番目の配列に0番目で値「user_3」、1番目の配列に0番目で値「user_4」が追加されています。

初めに行ったASSOCの方は、Keyがカラムになっています。

二回目のBOTHの方は、Keyがカラムと数字と両方配列に入ってますね。

PDO::FETCH_NUM

ではfetchで定数PDO::FETCH_NUMに変更して見ましょう。もうお分かりですね。

$score44 = $stmt->fetch(PDO::FETCH_NUM);
DB接続成功
Array ( [0] => user_3 )

Keyの「name」がなくなり、数字のみになっています。0番目に値が「user_3」の配列になっております。

続いてfetchAllで定数PDO::FETCH_NUMに変更して見ましょう。

$score44 = $stmt->fetchAll(PDO::FETCH_NUM);
DB接続成功
Array ( [0] => Array ( [0] => user_3 ) [1] => Array ( [0] => user_4 ) )

0番目の0番目に値「user_3」、1番目の0番目に値「user_4」が入った配列を抽出していますね。

PDO::FETCH_COLUMN

では定数PDO::FETCH_COLUMNに変更して見ましょう。

 $score44 = $stmt->fetch(PDO::FETCH_COLUMN);
DB接続成功
user_3

配列ではなく、値のみ入っていますね。

fetchAllの定数PDO::FETCH_COLUMNに変更して見ましょう。

$score44 = $stmt->fetchAll(PDO::FETCH_COLUMN);
DB接続成功
Array ( [0] => user_3 [1] => user_4 )

(PDO::FETCH_NUM)に比べてスッキリしていますね。ユーザー2人が一次元配列で入っています。

先程は2次元配列でした。

PDO::FETCH_KEY_PAIR

定数PDO::FETCH_KEY_PAIRに変更して、ページにアクセスして見ましょう。

$score44 = $stmt->fetch(PDO::FETCH_KEY_PAIR);

エラー発生

DB接続成功
DB接続失敗

PDO::FETCH_KEY_PAIRエラーの原因とは?

例外が出ました。 定数PDO::FETCH_KEY_PAIR はKeyもDBの値にします。

先程はカラムと番号がKeyになってましたが、今回はKeyも指定しなければエラーになります。

PDO::FETCH_KEY_PAIRのエラーを解決するには?

SQL構文でKeyと値を指定しましょう。つまりカラムから2つ選びましょう。

複数選ぶ時は「,」で区切るのでしたね。

今回はKeyを「id」にします。下記のコードに変更してください。

$stmt = $db->prepare("select id,name from users where score=?");

これで再度、ページにアクセスして見ます。

$score44 = $stmt->fetch(PDO::FETCH_KEY_PAIR);
DB接続成功
Array ( [3] => user_3 )

idがKey、nameが値の配列になっていますね。

fetchAllでFETCH_KEY_PAIRを行います!

 $score44 = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
DB接続成功
Array ( [3] => user_3 [4] => user_4 )

先程指定した「id」と「name」がペアになっています。idがKey、nameが値のデータが2つ配列になっています。

配列から値を取り出す

1次元配列や2次元配列になったりしていたので、おさらいしながら配列の取り方も見ておきます。

fetchの定数PDO::FETCH_BOTHから値を表示して見ます。

fetchメソッド構文は下記でした。

$score44 = $stmt->fetch(PDO::FETCH_BOTH);

fetchのPDO::FETCH_BOTHメソッドの結果は下記でした。

DB接続成功
Array ( [name] => user_3 [0] => user_3 )

phpファイルに下記のコマンドを追記して、ページを更新して見ます。

echo $score44[name];

配列から抽出でエラー発生

下記のエラーが出ました。

Fatal error: Uncaught Error: Undefined constant "name" in ・・・・・・

エラー構文をみるとnameという定数がありません。というメッセージが出てます。

エラーの原因

nameは文字列なので、「”」で囲わなければいけないですね。

エラーを解決する

では先程のコードを下記に変更して、ページを更新して見ます。

 echo $score44["name"] . "</br>";
 echo $score44[0];
コードの説明
  • nameは文字列なので「”」で囲みました
  • 文字列をつなげる為に「.」を付けました
  • 改行したいので「”</br>”」をつけました
  • 下にはもう一つの配列の番号のコードも付け足しました、こちらは番号なので「”」は不要です

更新すると、結果は下記になりました。

結果は思い通りのものになりました。

fetchAllの定数PDO::FETCH_BOTHから値を表示して見ます。

fetchAllメソッド構文は下記でした。

$score44 = $stmt->fetchAll(PDO::FETCH_BOTH);

fetchAllメソッドの結果は下記でした。

DB接続成功
Array ( [0] => Array ( [name] => user_3 [0] => user_3 ) [1] => Array ( [name] => user_4 [0] => user_4 ) )

phpファイルに下記のコマンドを追記して、ページを更新して見ます。

 echo $score44[0]["name"] . "</br>";
 echo $score44[1][0];

fetchAllのPDO::FETCH_BOTHの場合は、2次元配列になっています。

[0][“name”]は初めのKeyが「name」で「user_3」になります。[1][0]は2番目の中の0番目で「user_4」になります。

想定通りの結果となりました。

fetchAllの場合2次元配列になるので、表示の仕方に注意してください。

PDOのfetchやfetchAllで値を抽出するのまとめ

今回はPDOでDBに接続して、データベースの値をfetchを使用して抽出して見ました。

抽出した後の表示のやり方と注意点もお伝えしました。

fetchやfetchAllを使用してデータベースを有効活用出来たら楽しいですし、やれる事が増えます。

更なる高みを目指す方は以下の「プログラミングスクールおすすめランキング」からスクールに通うのもお勧めです。

PDOの定数を指定する事で、様々な取得の仕方があるので、状況に応じて変えて見て下さい。

モバイルバージョンを終了