質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

5535閲覧

PHP+mySQLでwhile文でレコード毎に出力

ybit

総合スコア8

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/03/26 20:57

PHPを勉強中です。
PHPからPDOを使ってmySQLに接続してレコード毎に出力を行おうとしています。

###前提・実現したいこと
SELECTしたテーブルを全件出力したい。

###発生している問題・エラーメッセージ

PHP

1$db = connect(); //DB接続関数 2$stmt = $db->prepare('SELECT * FROM hoge'); 3$stmt->execute(); 4$row = $stmt->fetch(PDO::FETCH_ASSOC); 5 6while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 7 print $row['id']; 8}

上記のコードでhogeテーブルにあるidをレコード毎に出力した際に
最初のレコードが出力されずに2行目から出力されます。
ORDER BYで順番を入れ替えても並び替え後の1行目が出てきません。

最初に出てこなかったレコード(A)は並び替え後には出力されました。
並び替え後に1行目になるレコード(B)は並び替え前は出力され、
並び替え後には出力されなくなりました。

DBの内容に関わらず1番目レコードが出力されないっぽいですが、
原因が分からず詰まっています。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

最初の

$row = $stmt->fetch(PDO::FETCH_ASSOC);

で1行目を読み飛ばしているから

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){

で2行目移行しか出力されないのでは?

PHP while

while文は、式の値がTRUEである間、 入れ子の文を繰り返し実行することをPHPに指示します。 式の値は各反復処理の開始時にチェックされるので、ループ内の文の実行により この値が代わった場合でもループ実行は各ループを終るまで終わりません。

どの言語でもマニュアルをきちんと確認する習慣を身に付けましょう。

投稿2018/03/26 22:04

編集2018/03/26 23:22
Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ybit

2018/03/27 09:08

初歩的なミスで大変失礼しました! 無事意図した挙動になりました。ありがとうございます! while文の外でfetchしているのは完全に見落としてました…。
guest

0

そもそも、使用しているメソッドが何をしているか確認したほうが良いですよ。
PHP のマニュアルは優秀なので。
コピペで使用していても、使えるようにならないです。

PDOStatement::fetch

PDOStatement::fetch — 結果セットから次の行を取得する

あわせて読みたい
PDOフェッチパターン大全

投稿2018/03/26 23:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/03/27 00:16

フェッチパターン大全 いいですね。こういうまとめ記事を書ける人は本当にすごいと思うし、非常に助かります。
退会済みユーザー

退会済みユーザー

2018/03/27 00:23

まぁ、個人的にはwhile()でfetchする手法が直観的ではなく古臭過ぎるのにそういった解説が初心者向けに大々的に紹介されている事が悪いんだと思っています。 $result = $stmt->fetchAll(PDO::FETCH_OBJ); して foreach($result as $row){} じゃないかなぁ… 普通、PHP思考的には。
退会済みユーザー

退会済みユーザー

2018/03/27 00:51

> mts10806 さん PHP の学習はじめて、mpyw さんの記事には大変お世話になりました(いや、まだ現在進行系だわw) イイですよね。 > lucker さん fetchALL が楽でいいですね。 while のアレってなんでよく紹介されているんだろ。。。
退会済みユーザー

退会済みユーザー

2018/03/27 00:54

たぶん、PHP4頃のmysql関数で勉強した人が成長とまってて、その脳で記事書いてるんですよね。 大体PHP関連の書籍は情報が古いので初心者はなかなか大変そうです。
退会済みユーザー

退会済みユーザー

2018/03/27 01:05

へぇ~ mysql 関数の世代の使い方なんですね。 PDO しか触ったこと無いんで、勉強になりました。
退会済みユーザー

退会済みユーザー

2018/03/27 02:59

ん? 取ってきて終わりじゃないですか? そのサンプルだと。 そんなシステムあるんですか?
退会済みユーザー

退会済みユーザー

2018/03/27 05:18

> sazi さん 弊害ではなく、「限定的状況において、工夫が必要」ぐらいじゃないですかね? @ShibuyaKosuke さんの記事のコメント欄のとおりだと思います。 必要になるのはバッチ処理とかだと思いますが相当にレアケースかと。 下のブログは、ちょっと全体像が見えなくて、参考にならないです。 > limit句で相当数絞ってからfetchAllを利用してもNG この理由が気になりますが、モヤッとしたままですね^^; メモリとか気にしなくてはならない程のデータの場合は、結果セット自体が大きなものになると思いますが、このへんって気にしなくていいんですかね?csv ファイルを一行づつ読むぜぃ!ってのと違って、結果セットはメモリ上に持っている気がするのですが、どうなんでしょうか? コメント欄で質問するのもナンですが、もしサクッと回答いただけるようなものであれば、コメントください^^
ybit

2018/03/27 09:24

te2jiさん、URLありがとうございます! 複数個所で変数名を変えてステートメントやフェッチをしていたので 横着してすでに書いたところからコードを持ってきたのが悪かったようです。 また、コメント欄でのやり取りも非常に参考になります! PDOの解説系は言葉が難しくて理解が大変ですが、 教えていただいたURLと合わせて調べていこうと思います。 luckerさんのおっしゃる通り、書籍で勉強してましたがwhile文のfetchが一般的だと思ってました。 fetchALLしてforeach回す方法もあるのは知らなかったです…! 非常に参考になりました!
sazi

2018/03/27 10:57

>te2ji さん phpもmysqlも詳しくは無いのですが、以下マニュアル(バッファクエリと非バッファクエリ)によると、 http://php.net/manual/ja/mysqlinfo.concepts.buffering.php デフォルト(バッファクエリ)の状態でのfetchもfetchallもphp側では問い合わせしたデータ分のメモリを消費し、fetchallの場合は使用する側分も合わせると問い合わせのデータ量の2倍を消費することになるのではないかと。 問い合わせの条件が同じであっても、条件に合うデータ件数によって消費量は変動するので、消費量を一定にするには、非バッファクエリによるfetchかlimit指定ということになりそうです。 > limit句で相当数絞ってからfetchAllを利用してもNG の記事については少し古いですし、見なかったことにしようかなw
退会済みユーザー

退会済みユーザー

2018/03/27 12:46

> sazi さん コメントありがとうございます。 消費量は、要件によって要検証ですね。
退会済みユーザー

退会済みユーザー

2018/03/28 01:16

saziさんは、“SQLの外出し”の時もそうなんですが、現実を度外視して情報だけ語る感じなのがダメなところなのかなぁ…。
sazi

2018/03/28 01:53 編集

レアなものであっても、起こりうるものは情報提供して、受け手の選択肢を増やしてあげた方が良いと思っています。 受け手が初心者であれば、混乱するだろうから、そこまではしませんけども。 後から気付く情報の痛手が大きい事を知っているが故の老婆心が過ぎるのかもしれませんが。 間違った情報を提供している場合は、是非(質問者に対するようにやさしく)指摘下さい。 #質問や回答に関係のない話で申し訳ありません >質問者様、回答者様
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問