CodeIgniter PHP框架 – 需要获取查询string

我使用CodeIgniter创build电子商务网站。

我应该如何得到查询string?

我正在使用一个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 

为了处理响应,我需要获取查询string数据。


对不起,我没有清楚解释这个问题。 付款后,我从付款网站收到回复时收到“Page not found”错误。

我已经试过在config.php使用uri_protocol = 'PATH_INFO'enable_query_strings = 'TRUE' 。 虽然谷歌search,我发现这将无法正常工作,如果我使用htaccess重写。

我已经尝试更改configuration条目,但它不起作用。

你可以这样得到它:

 $this->input->get('some_variable', TRUE); 

看到这个更多的信息。

我已经使用CodeIgniter一年多了。 在大多数情况下,我真的很喜欢它(我为论坛做出了贡献,并在所有可能的情况下使用它),但是我在手册中讨论了这个陈述的ARROGANCE:

销毁全局GET数组。 由于CodeIgniter不使用GETstring,所以没有理由允许它。

在CodeIgniter应用程序中,您永远不需要GET的推定是asinine! 在短短的几天里,我不得不处理PayPal和ClickBank的后期页面(我敢肯定还有一百万个)。猜猜看,他们使用GET !!!

有办法阻止这个GET挤压,但他们是倾向于其他事情的东西。 你不想听到的是,你必须重新编码所有的意见,因为你启用querystrings,现在你的链接被打破了! 请仔细阅读该选项!

一个我喜欢(但没有工作,因为在config.php中设置REQUEST_URI打破了我的网站)正在扩大input类:

 class MY_Input extends CI_Input { function _sanitize_globals() { $this->allow_get_array = TRUE; parent::_sanitize_globals(); } } 

但是最好的方法是在需要GETvariables的URL上使用print_r($ _ SERVER)进行testing。 看看哪个URI协议选项显示你的GETvariables并使用它。

就我而言,我可以看到我需要在REQUEST_URI

 // defeat stupid CI GET squashing! parse_str($_SERVER['REQUEST_URI'], $_GET); 

这将您的查询string放回该页面实例的$ _GET超级全局(您不必使用$ _GET,它可以是任何variables)。

编辑

自从发布这个我发现,使用REQUEST_URI时,你会失去你的第一个查询string数组的关键,除非你删除之前的一切? 例如,像/ controller / method?one = 1&two = 2这样的URL将在这个例子中用数组('method?one'=> 1,'two'=> 2)填充$ _GET数组。 为了解决这个问题,我使用了下面的代码:

 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']); } } 

如果你想要未经parsing的查询string:

 $this->input->server('QUERY_STRING'); 

打开application / config / config.php并设置下列值:

 $config['uri_protocol'] = "PATH_INFO"; $config['enable_query_strings'] = TRUE; 

现在查询string应该工作正常。

 // 98% functional parse_str($_SERVER['REQUEST_URI'], $_GET); 

这实际上是处理缺less对CodeIgniter中的$ _GET查询string的支持的最佳方式。 我实际上自己想出了这个,但很快就意识到了Bretticus做的同样的事情,你必须稍微修改你处理第一个variables的方式:

 // 100% functional parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET); 

在我自己find之前,这只是一个时间问题,但是使用这种方法是一个更好的单线解决scheme,包括修改现有的URI库,只隔离到它所在的控制器适用,并且无需对默认configuration(config.php)进行任何更改

 $config['uri_protocol'] = "AUTO"; $config['enable_query_strings'] = FALSE; 

有了这个,你现在有以下你的处置:

 /controller/method?field=value /controller/method/?field=value 

validation结果:

 print_r($_GET); // Array ( [field] => value ) 

如果你使用mod_rewrite去除index.php文件,你可以使用下面的代码来获取GETvariables(通过$ this-> input-> get())。 假设默认configuration,命名文件MY_Input.php并将其放置在您的应用程序/库目录中。

用法:$ 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] 

设置你的configuration文件

 $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 } 

你可以在你的.htaccess中制定一个规则来防止你的MOD_REWRITE在特定的页面上触发。 这应该允许你使用_GET。

这是我最近怎么做的。 希望它有帮助

 <?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 : http://www.mydomain.com/mycontroller/myfunction/?somestuff=x&morestuff=y x& http://www.mydomain.com/mycontroller/myfunction/?somestuff=x&morestuff=y

你可以创build一个pre_system钩子。 在创build的钩子类中,可以获取所需的查询参数并将它们添加到$ _POST以进行正常的CI处理。 我为一个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); } } } } } ?> 

下面是一个完整的工作示例,介绍如何在Codeignitor中允许查询string,就像在JROX平台上一样。 只需将其添加到位于以下位置的config.php文件:

 /system/application/config/config.php 

然后你可以像使用$ _GET或下面的类一样简单地得到querystrings

 $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); 

请享用 :-)