アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPでプログラムを組み、.htaccessにてRewriteRule設定を
したところ、エラーになってしまい、困っております。

具体的には
list.php
にて商品を10件表示にし、「次のページへ」 「前のページへ」の
リンクで「次のページへ」をクリックすると、次の11件~20件、
「前のページへ」で1件~10件を表示するという、よくある仕様を
設定したページなのですが、
「次のページへ」をクリックした後、「前のページへ」を
クリックするとプラウザが止ってしまいます。

もともと、list.phpはRewrite設定で下記のように
設定しております。
RewriteEngine on
RewriteBase /
RewriteRule ^list.htm$ /list.php?page=$1&rows=$1&category_id=1&query=&sort=item_id+desc [QSA]

元URLはlist.phpですが、list.htmに見せています。
その上でさらに次のページ、前のページへのリンク先も
静的URLに見せるよう、下記のように設定しました。

RewriteEngine on
RewriteBase /
RewriteRule ^list/([0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+).htm$ /list.php?page=$1&rows=$1&category_id=$1&query=&sort=item_id+desc [QSA]

上記で例えば
list.php?page=0&rows=10&category_id=7&query=&sort=item_id+desc
のものを
list/0/10/7.htm
と表示すると読み込みに異常に時間がかかり、プラウザが止ってしまうのです。

list/10/10/7.htm
であれば正常に表示できるのですが・・・。

list.phpには下記のように記述しております。

if ( $_GET['page'] == '' ) $_GET['page'] = 0;
if ( $_GET['rows'] == '' ) $_GET['rows'] = 10;
if ( $_GET['sort'] == '' ) $_GET['sort'] = 'item_id desc';

//
$delta = 3 * $_GET['rows'];

if ( $_GET['page'] - $delta < 0 ) $s = 0; else $s = $_GET['page'] - $delta;
if ( $_GET['page'] + $delta > $num_rows ) $e = $num_rows; else $e = $_GET['page'] + $delta;

<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center"><span class="x12"><? if ( $_GET['page'] >= $_GET['rows'] ) { ?>
<a href="list/<?= $_GET['rows'] - $_GET['page'] ?>/<?= $_GET['rows'] ?>/<?= $_GET['category_id'] ?>.htm">≪前のページ</a>
<? } ?>
<? for ( $m = $s; $m <= $e; $m = $m + $_GET['rows']) { ?>
<a href="list/<?= $_GET['rows'] - $_GET['page'] ?>/<?= $_GET['rows'] ?>/<?= $_GET['category_id'] ?>.htm">
<? if ( $m == $_GET['page']) echo "$color" . (( $m / $_GET['rows'] ) + '1') . "</font>"; else echo ( $m / $_GET['rows'] + 1 ) ?></a>
<? } ?>
<? if ( $num_rows > $_GET['page'] + 1 ){ ?>
<a href="list/<?= $_GET['page'] + $_GET['rows'] ?>/<?= $_GET['rows'] ?>/<?= $_GET['category_id'] ?>.htm">次のページ≫</a>
<? } ?></span></td>
</tr>
</table>

どなたかお分かりになられる方がいらっしゃいましたら是非とも
御教授いただけますと大変たすかります。

足りない点などございましたらご指摘いただけますと幸いです。
早急に追記、回答させていただきます。

何卒、よろしくお願いいたします。

A 回答 (3件)

遅くなる原因は良く解らないのですが、



RewriteRule ^list/([0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+).htm$ /list.php?page=$1&rows=$2&category_id=$3&query=&sort=item_id+desc [QSA]

と書くべきじゃないでしょうか。
また、勘ですがRewriteBaseは書かなくて良い気がします。

RewriteEngine on
RewriteRule ^list/([0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+).htm$ list.php?page=$1&rows=$1&category_id=$1&query=&sort=item_id+desc [QSA]

こんなのでいいんじゃないでしょうか
    • good
    • 0
この回答へのお礼

お教えいただきまして誠にありがとうございました。
おっしゃるとおりでした。
単純なミスで誠に申し訳ありません。

お教えいただいたコードで書くと、正常に遷移できるようになりました。
本当にありがとうございました。

お礼日時:2009/02/23 02:23

回答1と回答2を勝手に合わせると


rows=$1 には 0 が入るので無限ループとなる、でFAですかね。

入力値をそのまま繰り返し構文に入れるのは危ないという結果です。
if ($rows > 0) など判定しないとね。
    • good
    • 0
この回答へのお礼

なるほど、やはりrows=$1 に 0 が入るのは 危険ですね。
該当箇所も修正するようにしました。

アドバイスいただきまして本当にありがとうございました!

お礼日時:2009/02/23 02:26

単純に無限ループしているのでは?


for ( $m = $s; $m <= $e; $m = $m + $_GET['rows']) {}
$m は $s から $e までですけどインクリメントされる $_GET['rows'] が
0 と見なされると終わりませんよね。
一方、生の $_GET['rows'] が '0' (Stringになる) だと
if ( $_GET['rows'] == '' ) $_GET['rows'] = 10;
これは通らないので '0' のままとなります。

具体的な解決方法ではないですが参考までに。
    • good
    • 0
この回答へのお礼

分かりやすいご説明ありがとうございました!

結果私の単純なコードの書き方ミスのようでしたが、
参考にさせていただきます。誠にありがとうございます。

本当に皆さんありがとうございました。

お礼日時:2009/02/23 02:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!