mysqlから5件取得したらその5件の下から、5件を取得させるようにループさせたいんですがどうしたらいいのでしょうか?5件は取得させることはできますがそのまた下の5件がなかなかうまくいきません。
foreach文とcount関数など使ってますが苦労してます。ご教授よろしくお願いします。
1234
4568
4532
1254
1236←最初にここまでを表示
1452←次はここから表示
1235
7895
1125
1478
追記です。
説明不足ですみません。
実現したいことはamazon APIにasinコードでリクエストし情報が返ってくるようにしたいんですが、asinコードのリクエストが最大10件なのでとりあえず5件ずつリクエストし情報を取得させたい感じです。
なのでデーターベースから5件ずつを最後までループするような感じに取得できないかと考えていました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
- 最初の5件は「LIMIT 0,5」
- 次の5件は「LIMIT 5,5」
かならずORDER BY 句で表示順を確定してください
投稿2016/08/30 03:54
総合スコア114839
0
MySQLのLIMIT関数を使用すると解決するかと思われます。
sql
1// 上から5件 2SELECT * FROM [テーブル名] LIMIT 5; 3// 5件目から5件 4SELECT * FROM [テーブル名] LIMIT 5, 5; 5// 10件目から5件 6SELECT * FROM [テーブル名] LIMIT 10, 5;
PHP側で動的にLIMITの後ろを変えるといいかもしれません。
投稿2016/08/30 03:59
総合スコア295
0
「SQLで」と言うことであれば、既にご回答されている方の内容で実現してください。
ただし、発行するSQLの内容によっては、SQLの発行の間でレコードが挿入・削除されると、前回取得したレコードが再度取得されたり、取得していないレコードがスキップされたりすることに気を付けてください。それが許容できるのであれば問題ありません。
許容できない場合についてですが、mysqliでmysqlにアクセスされていると言うことでよろしいですか?
相違なく、検索結果がそれほど大きくないものでしたら、いったん検索結果をmysqli_result::fetchAll()で全て取り出してセッション情報に保持し、リクエストの度に保持した検索結果からarray_slice()で取り出すと言う方法もあります。
最初の検索結果は
php
1array_slice(検索結果, 0, 5);
次の検索結果は
php
1array_slice(検索結果, 5, 5);
といった具合です。
検索結果がとても大きい場合は、mysqli_resultをセッション情報に保持し、リクエストの度に必要なレコード数分(今回の場合は5件)だけ、mysqli_resultのfetch_array()もしくはfetch_object()で取得すると言う方法もあります。
ただし、mysqli_resultをセッション情報に保持すると、mysqlのリソースを消費し続けることになりますので、
- 不要になったら削除する
- 1セッションあたりに保持するmysqli_resultは1つに制限する
- 場合によってはセッションのタイムアウトを短くする
と言った考慮が必要です。
サンプルコード
Amazonへ投げるための処理と言うことですので、
- テーブルの検索結果を1件づつ取り出して、5件取り出したらAmazonを呼び出す
と言う流れでサンプルを示します。
mysqliは非推奨とのことですのでPDOを使ったMySQLのアクセスで示します。
php
1<?php 2 //アマゾンのAPIを呼び出す処理(適宜修正してください) 3 function toAmazon($requestObjects) { 4 $results = array(); 5 foreach($requestObjects as $resultObject) { 6 array_push($results, $resultObject->variable); 7 } 8 return $results; 9 } 10 11 //MySQLに接続 12 $con = new PDO('mysql:host=<ホスト名>;dbname=<データベース名>;charset=utf8', '<ユーザ名>', '<パスワード>'); 13 14 //SQLの準備 15 $stmt = $con->prepare('select * from test0001'); 16 17 //SQLの実行 18 $stmt->execute(); 19 20 //オブジェクト格納用配列 21 $requestObjects = array(); // Amazonへ投げるオブジェクト(テーブルのレコード)の配列 22 $resultAmazon = array(); // Amazonからの取得したオブジェクトの配列 23 24 while($rowObj = $stmt->fetchObject()) { 25 // 検索結果から1行づつオブジェクト(テーブルレコード)を取りだす 26 // 条件式は「=」で正しい。fetchObject()の戻り値がFALSEだったらループを抜ける。 27 array_push($requestObjects, $rowObj); 28 // Amazonへ投げるオブジェクトの配列に追加 29 if(count($requestObjects) == 5) { 30 // Amazonへ投げるオブジェクトの配列が5個になったらAmazon呼び出し 31 $resultAmazon = array_merge($resultAmazon, toAmazon($requestObjects)); 32 $requestObjects = array(); 33 // Amazonへ投げるオブジェクトの配列を空にする。 34 } 35 } 36 if(count($requestObjects) != 0) { 37 // Amazonへ投げるオブジェクトの配列がに要素が残っていたらAmazon呼び出し 38 $resultAmazon = array_merge($resultAmazon, toAmazon($requestObjects)); 39 $requestObjects = array(); 40 } 41 var_dump($resultAmazon); 42?> 43
- 「could not find driver」と言うエラーが出力された場合は、php-pdo_mysqlパッケージを追加してください。(例: sudo yum install php-pdo_mysql)
- while文の条件式で検索結果から1行づつオブジェクト(レコード)を取得しています。オブジェクトからカラムの値は「$rowObj->カラム名」で参照できます。
- 今回は、取得したオブジェクトをarray_push($requestObjects, $rowObj)で配列に1つづつ追加しています。
- if(count($requestObjects) == 5)で$requestObjectsに要素が5つ貯まったか判断を行い、貯まっていたらAmazonを呼び出します。
- Amazonからの結果は、$resultAmazon = array_merge($resultAmazon, toAmazon($requestObjects))で$resultAmazonに追加します。
- エラー判定処理や、クリーンナップ処理(データベース切断処理)などは割愛しています。
投稿2016/08/30 06:33
編集2016/08/30 09:26総合スコア125
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/30 06:35
2016/08/30 07:25
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/30 06:05
2016/08/30 06:11
2016/08/30 06:23
2016/08/30 07:21
2016/08/30 07:25
2016/08/30 07:33
2016/08/30 08:17
2016/08/30 08:18
2016/08/30 08:50 編集