こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

得られた処理結果を、その前の時点で使いたい。

echo "項目数".$number; //「下記のwhile文を繰り返した回数」と同値
echo "<br>";

//項目表の作成開始(テーブル形式)
echo "<table>";

if($db = sqlite_open($db_pass)){
$query = "SELECT id FROM tbl_test ORDER BY id DESC";
$result = sqlite_query($db, $query);
$i = 0;
while($data = sqlite_fetch_array($result)){
echo "<tr><td>項目".$data."</td></tr>";
$i++;
}
sqlite_close($db);
}
else{die("$dbオープンエラー");}

echo "</table>"; //項目表作成完了

$number = $i; //while文を繰り返した回数を変数$numberに格納

//ここで得られた$numberを「項目表」の上で使いたい!

/*========================================================
イメージとして、上のようなコードを書きましたが、実際には上のコードでは、言うまでもなくエラーとなります。
項目表を作成する前の時点では、$numberの中身は空っぽなのですから。

なお、ここでは例として、while文の中の処理を簡単なものにしていますが、実際には、100段くらいの長いコードになっています。

現状では、カウントするためだけに短くwhile文を書いて、カウント数を得てそれを使っていますが(以下参照)、賢い方法とは思えないので、質問しました。
========================================================*/

//カウント用(カウントのみ行う。データ抽出・出力はしない)
if($db = sqlite_open($db_pass)){
$query = "SELECT id FROM tbl_test ORDER BY id DESC";
$result = sqlite_query($db, $query);
$i = 0;

//カウントのみ行うので「$i++;」だけ書く。
while($data = sqlite_fetch_array($result)){
$i++;
}
sqlite_close($db);
}
else{die("$dbオープンエラー");}

$number = $i;
echo "項目数".$number;

/*========================================================
そして、ここから、項目表を作るコードを書き始める。
つまり、データベースを開いて、データを抽出する処理を2度も繰り返しているわけです。
私が希望しているのは、1度に、データ抽出とカウントをまとめて行い、カウントで得た数値を、そのカウントの前の時点で使いたいということです。
=========================================================*/

//ここから、項目表の作成開始(テーブル形式)
echo "<table>";

//データのみ抽出・出力(カウントは済んでいるため、する必要なし。)
if($db = sqlite_open($db_pass)){
$query = "SELECT id FROM tbl_test ORDER BY id DESC";
$result = sqlite_query($db, $query);

while($data = sqlite_fetch_array($result)){
echo "<tr><td>項目".$data."</td></tr>";
}
else{die("$dbオープンエラー");}

echo "</table>"; //項目表作成完了

/*========================================================
質問内容は以上です。
質問文が長い割には、中身は至ってシンプルです。(笑)

どのようなアドバイスを頂けるか分かりませんが、
「参照渡し」などで解決できるのかな??なんて思っています。
どなたか、賢い方法を教えて下さい。お願いします。
========================================================*/

投稿日時 - 2009-06-17 10:44:53

QNo.5050958

困ってます

質問者が選んだベストアンサー

テーブルタグのなかでwhileで回してechoしていますが、
これをテーブルタグの前で変数に入れ込んでしまえばどうでしょう?


while(・・・){
$table.="・・・";
$i++;
}

print <<<eof
項目数:{$i}<br>
<table>
{$table}
</table>
eof;

まぁ$iでカウンタをとらなくても行数は数えられそうですが。

http://www.php.net/manual/ja/function.sqlite-num-rows.php

投稿日時 - 2009-06-17 11:12:02

補足

いつも、お世話になっております。

>これをテーブルタグの前で変数に入れ込んでしまえばどうでしょう?

なるほど!
つまり、テーブル処理をwhileの中では出力せずに、そこでは変数に入れ込むだけに留めておき、と同時にカウントを済ませておき、whileから抜けた後、先にカウント値を出力させてから、テーブル処理を入れ込んだ変数を出力するというわけですね。
とても素直な方法ですね。笑
私の中では、なかなかの方法だな、という印象です。

次に、
>$iでカウンタをとらなくても行数は数えられそうですが

そうなんですよね~。
データベースのクエリでカウントする方法もあるにはあるのですが、
すみません、PHPのバージョンを書き忘れてしまっていますが、私の使用バージョンはPHP4なので、どうもこの「sqlite-num-rows」は使えないようなんです。

でも、1つ、方法が得られましたので、満足です。^^
もう少し、他に良策が出てこないか、回答を待ってみますが、
とても助かりました。ありがとうございます!

投稿日時 - 2009-06-17 11:53:04

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

SQLにカウントさせてみたり。SQLITEで試した事はないですが。。

SELECT
(SELECT COUNT(*)
FROM tbl_test B
WHERE A.id >= B.id) as no ,
A. id
from tbl_test A
ORDER BY id DESC

投稿日時 - 2009-06-17 11:40:10

補足

アドバイスありがとうございます。

>SELECT COUNT(*) FROM

SQLの中でカウントするという視点ですね!
sqlite> select count(*) from なんたら~
というのを早速ネット上から見つけてきました。

sqliteでも、そういう構文はあるようですが、「処理が遅い!」という記事もチラホラ確認できたりして、いや~な空気が漂っちゃいました。(笑)

でも、こちらも検討してみたいと思います!
結果的に速い処理ならば、どんな方法でも良いと思っているので!

投稿日時 - 2009-06-17 12:11:47

あなたにオススメの質問