CodeIgniter を使用してeコマースサイトを作成しています。
クエリ文字列を取得する方法
Saferpay 支払いゲートウェイを使用しています。ゲートウェイの応答は次のようになります。
http://www.test.com/registration/success/?DATA=<IDP+MSGTYPE%3D"PayConfirm"+KEYID%3D"1-0"+ID%3D"KI2WSWAn5UG3vAQv80AdAbpplvnb"+TOKEN%3D"(unused)"+VTVERIFY%3D"(obsolete)"+IP%3D" 123.25.37.43"+IPCOUNTRY%3D"IN"+AMOUNT%3D"832200"+CURRENCY%3D"CHF"+PROVIDERID%3D"90"+PROVIDERNAME%3D"Saferpay+Test+Card"+ACCOUNTID%3D"99867-94913159"+ECI%3D"2"+CCCOUNTRY%3D"XX"%2F>&SIGNATURE=bc8e253e2a8c9ee0271fc45daca05eecc43139be6e7d486f0d6f68a356865457a3afad86102a4d49cf2f6a33a8fc6513812e9bff23371432feace0580f55046c
応答を処理するには、クエリ文字列データを取得する必要があります。
申し訳ありませんが、問題を明確に説明していません。支払い後に支払いサイトから応答を取得中に「ページが見つかりません」というエラーが表示されます。
uri_protocol = 'PATH_INFO'
でenable_query_strings = 'TRUE'
とconfig.php
を有効にしてみました。グーグル検索中に、htaccess書き換えを使用すると、これが機能しないことがわかりました。
構成エントリを変更しようとしましたが、機能しません。
CodeIgniterを1年以上使用しています。ほとんどの場合、私はそれが本当に好きです(フォーラムに貢献し、できる限りすべてのインスタンスで使用しています)が、マニュアルのその声明の嫌悪感は嫌いです。
グローバルGET配列を破棄します。 CodeIgniterはGET文字列を使用しないため、許可する理由はありません。
CodeIgniterアプリケーションでGETが必要になることは決してないという仮定は、驚くべきものです!すでにほんの数日で、PaypalとClickBankからのポストバックページを処理しなければなりませんでした(他にも100万人いると確信しています)。
このGETスカッシュを停止する方法はありますが、それらは他のものを台無しにする傾向があるものです。聞きたくないのは、クエリ文字列を有効にし、リンクが壊れているため、すべてのビューを再コーディングする必要があるということです。そのオプションについてはマニュアルを注意深く読んでください!
私が気に入っているもの(ただし、config.phpでREQUEST_URIを設定するとサイトが壊れたため機能しませんでした)はInputクラスを拡張しています:
class MY_Input extends CI_Input
{
function _sanitize_globals()
{
$this->allow_get_array = TRUE;
parent::_sanitize_globals();
}
}
しかし、最善のナンセンスな方法は、GET変数が必要なURLでprint_r($ _ SERVER)でテストすることです。 GET変数を表示するURIプロトコルオプションを確認して使用します。
私の場合、REQUEST_URIで必要なものを確認できます
// defeat stupid CI GET squashing!
parse_str($_SERVER['REQUEST_URI'], $_GET);
これにより、クエリ文字列がそのページインスタンスの$ _GETスーパーグローバルに戻されます($ _GETを使用する必要はありません。任意の変数を使用できます)。
編集
これを投稿してから、REQUEST_URIを使用すると、?の前のすべてを削除しない限り、最初のクエリ文字列配列キーが失われることがわかりました。たとえば、/ controller/method?one = 1&two = 2のようなURLは、この例の$ _GET配列にarray( 'method?one' => 1、 'two' => 2)を設定します。これを回避するために、次のコードを使用しました。
parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);
私は例を提供すべきだったと思うので、ここに行きます:
class Pgate extends Controller {
function postback() {
parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);
$receipt = $this->input->xss_clean($_GET['receipt']);
}
}
未解析のクエリ文字列が必要な場合:
$this->input->server('QUERY_STRING');
// 98% functional
parse_str($_SERVER['REQUEST_URI'], $_GET);
実際、これはCodeIgniterでの$ _GETクエリ文字列のサポート不足を処理する最良の方法です。私は実際に自分でこれを思いつきましたが、最初の変数の処理方法をわずかに変更する必要があるという点で、ブレティカスが行ったことと同じことをすぐに実現しました。
// 100% functional
parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);
自分でやるのは時間の問題でしたが、このメソッドを使用することは、既存のURIライブラリの変更を含む他のすべてのものに対する優れた1行のソリューションであり、それが存在するコントローラのみに隔離されます適用可能で、デフォルト構成(config.php)に変更を加える必要がなくなります
$config['uri_protocol'] = "AUTO";
$config['enable_query_strings'] = FALSE;
これにより、次のものを自由に使用できます。
/controller/method?field=value
/controller/method/?field=value
結果を確認します。
print_r($_GET); // Array ( [field] => value )
Application/config/config.phpを開き、次の値を設定します。
$config['uri_protocol'] = "PATH_INFO";
$config['enable_query_strings'] = TRUE;
これで、クエリ文字列は正常に機能するはずです。
Mod.rewriteを使用してindex.phpファイルを削除する場合、次のコードを使用してGET変数を取得できます($ this-> input-> get()を使用)。デフォルトの構成を想定して、ファイルにMY_Input.phpという名前を付け、application/librariesディレクトリに配置します。
使用法:$ this-> input-> get()
class MY_Input extends CI_Input {
function My_Input()
{
parent::CI_Input();
// allow GET variables if using mod_rewrite to remove index.php
$CFG =& load_class('Config');
if ($CFG->item('index_page') === "" && $this->allow_get_array === FALSE)
{
$_GET = $this->_get_array();
}
}
/**
* Fetch an item from the GET array
*
* @param string $index
* @param bool $xss_clean
*/
function get($index = FALSE, $xss_clean = FALSE)
{
// get value for supplied key
if ($index != FALSE)
{
if (array_key_exists(strval($index), $_GET))
{
// apply xss filtering to value
return ($xss_clean == TRUE) ? $this->xss_clean($_GET[$index]) : $_GET[$index];
}
}
return FALSE;
}
/**
* Helper function
* Returns GET array by parsing REQUEST_URI
*
* @return array
*/
function _get_array()
{
// retrieve request uri
$request_uri = $this->server('REQUEST_URI');
// find query string separator (?)
$separator = strpos($request_uri, '?');
if ($separator === FALSE)
{
return FALSE;
}
// extract query string from request uri
$query_string = substr($request_uri, $separator + 1);
// parse query string and store variables in array
$get = array();
parse_str($query_string, $get);
// apply xss filtering according to config setting
if ($this->use_xss_clean === TRUE)
{
$get = $this->xss_clean($get);
}
// return GET array, FALSE if empty
return (!empty($get)) ? $get : FALSE;
}
}
他のすべてのポスターに感謝します。これが私にとってスポットになったものです:
$qs = $_SERVER['QUERY_STRING'];
$ru = $_SERVER['REQUEST_URI'];
$pp = substr($ru, strlen($qs)+1);
parse_str($pp, $_GET);
echo "<pre>";
print_r($_GET);
echo "</pre>";
意味、私は今できる:
$token = $_GET['token'];
.htaccessで変更する必要がありました:
RewriteRule ^(.*)$ /index.php/$1 [L]
に:
RewriteRule ^(.*)$ /index.php?/$1 [L]
構成ファイルを設定します
$config['index_page'] = '';
$config['uri_protocol'] = 'AUTO';
$config['allow_get_array'] = TRUE;
$config['enable_query_strings'] = FALSE;
および.htaccessファイル(ルートフォルダー)
<IfModule mod_rewrite.c>
Options +FollowSymLinks
Options -Indexes
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ index.php [L]
</IfModule>
これで使用できます
http://example.com/controller/method/param1/param2/?par1=1&par2=2&par3=x
http://example.com/controller/test/hi/demo/?par1=1&par2=2&par3=X
サーバ側:
public function test($param1,$param2)
{
var_dump($param1); // hi
var_dump($param2); // demo
var_dump($this->input->get('par1')); // 1
var_dump($this->input->get('par2')); // 2
var_dump($this->input->get('par3')); // X
}
これが最近のやり方です。それが役に立てば幸い
<?php
//adapt this code for your own use
//added example.com to satisfy parse_url
$url="http://www.example.com".$_SERVER["REQUEST_URI"];
$url=parse_url($url);
//I'm expecting variables so if they aren't there send them to the homepage
if (!array_key_exists('query',$url))
{
redirect('/'); exit;
}
$query=$url['query'];
parse_str($query,$_GET); //add to $_GET global array
var_dump($_GET);
?>
呼び出す:http://www.mydomain.com/mycontroller/myfunction/?somestuff=x&morestuff=y
.htaccessにルールを作成して、MOD_REWRITEがその特定のページで起動しないようにすることができます。これにより、_GETを使用できます。
以下は、JROXプラットフォームのように、Codeignitorでクエリ文字列を許可する方法の完全な実例です。これをconfig.phpファイルに追加してください:
/system/application/config/config.php
そして、あなたは単に通常のようにクエリ文字列を取得することができます$ _GETまたは以下のクラスを使用して
$yo = $this->input->get('some_querystring', TRUE);
$yo = $_GET['some_querystring'];
すべてを機能させるコードは次のとおりです。
/*
|--------------------------------------------------------------------------
| Enable Full Query Strings (allow querstrings) USE ALL CODES BELOW
|--------------------------------------------------------------------------*/
/*
|----------------------------------------------------------------------
| URI PROTOCOL
|----------------------------------------------------------------------
|
| This item determines which server global should
| be used to retrieve the URI string. The default
| setting of 'AUTO' works for most servers.
| If your links do not seem to work, try one of
| the other delicious flavors:
|
| 'AUTO' Default - auto detects
| 'PATH_INFO' Uses the PATH_INFO
| 'QUERY_STRING' Uses the QUERY_STRING
| 'REQUEST_URI' Uses the REQUEST_URI
| 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO
|
*/
if (empty($_SERVER['PATH_INFO'])) {
$pathInfo = $_SERVER['REQUEST_URI'];
$index = strpos($pathInfo, '?');
if ($index !== false) {
$pathInfo = substr($pathInfo, 0, $index);
}
$_SERVER['PATH_INFO'] = $pathInfo;
}
$config['uri_protocol'] = 'PATH_INFO'; // allow all characters
$config['permitted_uri_chars'] = ''; // allow all characters
$config['enable_query_strings'] = TRUE; // allow all characters
parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);
楽しい :-)
Pre_systemフックを作成できます。作成するフッククラスで、目的のクエリパラメータを取得し、通常のCI処理のためにそれらを$ _POSTに追加できます。 jQuery Ajaxヘルパーのためにこれを行いました。
例えば:
(このファイルにautocomplete.phpという名前を付けるか、フックにファイル名として入力した名前を付けます)
<?php
/*
By Brodie Hodges, Oct. 22, 2009.
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Make sure this file is placed in your application/hooks/ folder.
*
* jQuery autocomplete plugin uses query string. Autocomplete class slightly modified from excellent blog post here:
* http://czetsuya-tech.blogspot.com/2009/08/allowing-url-query-string-in.html
* Ajax autocomplete requires a pre_system hook to function correctly. Add to your
* application/config/hooks.php if not already there:
$hook['pre_system'][] = array(
'class' => 'Autocomplete',
'function' => 'override_get',
'filename' => 'autocomplete.php',
'filepath' => 'hooks',
'params' => array()
);
*
*
*/
class Autocomplete {
function override_get() {
if (strlen($_SERVER['QUERY_STRING']) > 0) {
$temp = @array();
parse_str($_SERVER['QUERY_STRING'], $temp);
if (array_key_exists('q', $temp) && array_key_exists('limit', $temp) && array_key_exists('timestamp', $temp)) {
$_POST['q'] = $temp['q'];
$_POST['limit'] = $temp['limit'];
$_POST['timestamp'] = $temp['timestamp'];
$_SERVER['QUERY_STRING'] = "";
$_SERVER['REDIRECT_QUERY_STRING'] = "";
$_GET = @array();
$url = strpos($_SERVER['REQUEST_URI'], '?');
if ($url > -1) {
$_SERVER['REQUEST_URI'] = substr($_SERVER['REQUEST_URI'], 0, $url);
}
}
}
}
}
?>