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文を変数に格納する」の記事を参照してください。
テーブルを参照する
今回下記のテーブルを作成したとします。
DB名:mydatabase テーブル名:users
id | name | score |
---|---|---|
1 | user_1 | 47 |
2 | user_2 | 24 |
3 | user_3 | 44 |
4 | user_4 | 44 |
今回はusersテーブルに、4人のユーザーが登録しているデータベースを使用します。
- fetch
- fetchAll
fetchとfetchAllの違い
fetchとfetchAllの違いは、 初めに抽出された1つを取得するか、全てを抽出するかです!
fetchとfetchAllの基本構文は下記です。
$変数= $prepareかqueryで実行した変数->fetch(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::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人が一次元配列で入っています。
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つ配列になっています。
配列から値を取り出す
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];
[0][“name”]は初めのKeyが「name」で「user_3」になります。[1][0]は2番目の中の0番目で「user_4」になります。
fetchAllの場合2次元配列になるので、表示の仕方に注意してください。
PDOのfetchやfetchAllで値を抽出するのまとめ
今回はPDOでDBに接続して、データベースの値をfetchを使用して抽出して見ました。
抽出した後の表示のやり方と注意点もお伝えしました。
fetchやfetchAllを使用してデータベースを有効活用出来たら楽しいですし、やれる事が増えます。
更なる高みを目指す方は以下の「プログラミングスクールおすすめランキング」からスクールに通うのもお勧めです。
PDOの定数を指定する事で、様々な取得の仕方があるので、状況に応じて変えて見て下さい。