忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/22 13:04 |
EC-CUBE LC_Page::sendRedirect()に引数を渡せない
通常のURLからSSLに移動を行いたいときなど、LC_Page::sendRedirect()にURLを渡せば自動的にセッションIDを付加した上で転送を行ってくれます。
ところが転送先URLに
hoge.php?id=100
とか書いても、転送先では$_REQUEST['id']を取得できなかったりします(取得できる場合もある)。

転送先URLの作成などはPear::Net_URLを使用しています。
URLにセッションID等を付加する処理は以下のようになっています。

1
2
3
4
5
6
7
8
9
    $netURL = new Net_URL($url);
    if (!empty($_SERVER['QUERY_STRING'])) {
        $netURL->addRawQueryString($_SERVER['QUERY_STRING']);
    }
    $session = SC_SessionFactory::getInstance();
    if ($isMobile || $session->useCookie() == false) {
        $netURL->addQueryString(session_name(), session_id());
    }
    $netURL->addQueryString(TRANSACTION_ID_NAME, $this->getToken());

どこが問題なのかというと、ここです。

1
2
3
    if (!empty($_SERVER['QUERY_STRING'])) {
        $netURL->addRawQueryString($_SERVER['QUERY_STRING']);
    }

単にURLにリクエストパラメータを追加しているようにしか見えませんが、実はNet_URL::addRawQueryString()「追加」ではなく「上書き」です。
ちなみに同じような名前のNet_URL::addQueryString()は追加です。
なにこの罠。

従って、何かひとつでもリクエストパラメータがあった場合にLC_Page::sendRedirect($url)を使用すると、$urlに引き渡したGETパラメータは全て消え失せてしまいます。
これはNet_URLのバグだと思うのですが中の人はバグじゃないとか言っています。
だったら名前どうにかしろよと。

仕方ないのでこちらでどうにかしましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function sendRedirect($url, $isMobile = false ) {
    $netURL = new Net_URL($url);
    
    //GETパラメータを保存しておく
        $queryStringArray=$netURL->querystring;
    
    //今までの処理
        if (!empty($_SERVER['QUERY_STRING'])) {
            $netURL->addRawQueryString($_SERVER['QUERY_STRING']);
        }
        $session = SC_SessionFactory::getInstance();
        if ($isMobile || $session->useCookie() == false) {
            $netURL->addQueryString(session_name(), session_id());
        }
        $netURL->addQueryString(TRANSACTION_ID_NAME, $this->getToken());
 
    //GETパラメータを追加
        if(is_array($queryStringArray)){
            foreach($queryStringArray as $key=>$val){
                $netURL->addQueryString($key, $val);
            }
        }
    
    //リダイレクト
        header("Location: " . $netURL->getURL());
        exit();
}

できました


EC-CUBEの記事
PR


2010/04/19 23:27 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<==NOVEL PHILOSOMA== 11 | HOME | 買ったものリスト 2010/04/18>>
忍者ブログ[PR]