PHP fetchAllメソッドって何で使うんですか?
- 評価
- クリップ 4
- VIEW 17K+
なんでfetchAllメソッド使うんですか?
SBCreativeのPHP超入門になんどもfetchAllで取得してforeachでまわしてる文が出てくるんですけど未だに理解してません。
fetchAll()→該当する全てのデータを配列として返す
という意味みたいなんですが、
該当するデータなんて一件ぐらいしかないのになんで
わざわざ全てのデータを配列として返すfetchAllを使うんですか?
なんども
foreach ( $stmt->fetchAll () as $row ) {
がでてきて意味が解りません。
foreach ( $stmt->fetchAll () as $row ) {
$_SESSION ['customer'] = array (
// idというキーで$row['id']を入れる
'id' => $row ['id'],
'name' => $row ['name'],
'address' => $row ['address'],
'login' => $row ['login'],
'password' => $row ['password']
);
}
<?php require 'menu.php'; ?>
<?php
session_start ();
// unset→指定した変数を破棄する
unset ( $_SESSION ['customer'] );
$pdo = new PDO ( 'mysql:host=localhost;dbname=takahashi1;charset=utf8', 'takahashi', 'takahashi' );
$stmt = $pdo->prepare ( 'select * from customer where login=? and password=?' );
// var_dump($stmt);
$stmt->execute ( array (
$_POST ['login'],
$_POST ['password']
) );
// foreachは配列とオブジェクトをループして使うための構文
// 配列ではないが使いやすくするために特別にforeachの反復処理で使えるように作られている
// $rowという変数に入れる
// $rows = $stmt->fetchAll ();
// var_dump($rows)
foreach ( $stmt->fetchAll () as $row ) {
// foreach ( $rows as $row ) {
// 連想配列$_SESSION['customer']にキーを指定して追加し、値として連想配列を代入
$_SESSION ['customer'] = array (
// idというキーで$row['id']を入れる
'id' => $row ['id'],
'name' => $row ['name'],
'address' => $row ['address'],
'login' => $row ['login'],
'password' => $row ['password']
);
}
if (isset ( $_SESSION ['customer'] )) {
echo 'いらっしゃいませ、', $_SESSION ['customer'] ['name'], 'さん。';
} else {
echo 'ログイン名またはパスワードが違います。';
}
?>
なんでここではfetchじゃなくてfetchAllなのでしょうか。
fetchとfetchAllの使い分けもできません。
fetch→一行づつ取得
fetchAll→全データを配列に変換。全ての結果行を含む配列を返す
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+5
どうしてfoeach($stmt->fetchAll() as $row)なんて訳のわからない書き方してるんだろうと先日から不思議に思ってたのだが、
その本のせいだったか。
https://teratail.com/questions/67446
https://teratail.com/questions/68380
https://teratail.com/questions/68529
戻りが1行だけならfetch()で問題ないし、
複数行ならそもそもPDOStatementをそのままforeachすればいい。
単純にその本が駄目ってことでいいんじゃないですかね。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+5
たとえば、PHPのマニュアルには次のような記述があります。
PDO::query() を次にコールする前に 結果セット内の全てのデータを取得しない場合、そのコールは失敗します。 PDOStatement::closeCursor() をコールし、 次に PDO::query() をコールする前に PDOStatement オブジェクトに関連付けられたリソースを解放してください。
--- PDO::query
fetch()を使って1行だけ取得すると、問い合わせが複数の行を返した場合に、この罠にはまります。
本の執筆者の気持ちになって考えると、fetchAll()を使っておけば複数の行が返されても安心だし、2種類のやりかたを説明するより簡単になります。
「『超』入門」と銘打った本に、なんでも書いてあるはずがないです。試読版の目次をみると、データベース操作には80ページほどを割いているのがわかりますが、この分量で細かい解説までできるはずもありません。
同書の最後のほうには「PHPの学習方法」という節もあるので、読んでみると参考になることが書いてあるのではないでしょうか。
そこにもおそらく書いてあるでしょうけれど、わからないことがあったらまずPHPのマニュアルを調べるようにして下さい。PHPというプログラミング言語の情報のほとんどすべては、これに書いてあります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
fetchAllしたら全データが抜き出せるんですから、
別のライブラリに渡すときには便利ですよね
現行ステートメント文がforeachで回せるようになっているので
全データ得なくても細かく処理はしやすいですよね
$stmt = $pdo->query('SELECT * FROM Entry');
foreach ($stmt as $row) {
print_r($row);
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
+1
fetchAllで取得した配列をあとで使いまわすなら意味があるけど、今回のコードではforeach内で使っていて配列自体はどこにも格納していないので、意味がないですね。
ご指摘の通り、単なるfetchの方が適切かと思います。
また抽出されるレコード数が巨大な場合、一旦配列として受け取るので、レスポンスの面でも不安があります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
記述方法が適正かどうかは置いておいて、
fetchAll()→該当する全てのデータを配列として返す
という意味みたいなんですが、
該当するデータなんて一件ぐらいしかないのになんで
わざわざ全てのデータを配列として返すfetchAllを使うんですか?
該当するデータが一件ではなくって複数件ある場合があるから、
その場合のデータの処理の仕方を記述しようとしているのだと思います。
例えば、
データベースには学年全員分のデータがあって、その中から3組の生徒だけ取得する
というようなケースの場合は数十人分の結果を取得するSQLを記述して、
その結果を全部扱いたいときに今回の様な記述が使えます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/03/13 20:49
本がだめなんですね
この本毎日使ってるんですが><。。。
2017/03/13 20:50
確かな力が身につくPHP「超」入門
愛読してました><
2017/03/14 17:52
2017/03/15 09:58
また、「入門」レベルの書籍にどのようなことを求めるのか、という観点もあると思います。
2017/03/15 14:09
SBCreativeに問い合わせてみます!
while ( $row = $stmt->fetch ( PDO::FETCH_ASSOC ) ) {
の意味が未だにわからない私ってなんなのでしょうか。。。
昨日に引き続き一日中調べてますがわかりません。。
窓際族になってきました。
2017/03/15 14:22
中身が無くなったらfetchの返り値がfalseになってループを抜ける感じです。
2017/03/15 16:52
$rowにfetchで取れたid name address login passwordなどの中身が代入されて、$rowの中身がある限りの間繰り返すということでしょうか。
2017/03/15 21:44
2017/03/16 14:02
↓
松浦と申します。
『確かな力が身につくPHP「超」入門』をお読み頂き誠にありがとうございます。
情報を頂きありがとうございます。
本書のサンプルにおいて、
foreach ($sql->fetchAll() as $row) {
のように記述している箇所は、
foreach ($sql as $row) {
のように、簡潔に記述することができます。
検索結果をいったん配列として保存し、後で色々な
処理を加える場合には
fetchAllメソッドが使えますが、本書のサンプルでは検索結果をforeachで一度処
理すれば済むので、より簡潔な後者の記述が適していたと存じます。
(whileとfetchを使う方法もありますが、本書の場合には上記の後者が妥当かと
存じます。)
お手数をおかけして誠に申し訳ございません。
どうぞ宜しくお願い申し上げます。