我正在使用CodeIgniter创建一个电子商务网站.
我该如何获取查询字符串?
我正在使用Saferpay支付网关.网关响应将如下所示:
http://www.test.com/registration/success/?DATA=&SIGNATURE=bc8e253e2a8c9ee0271fc45daca05eecc43139be6e7d486f0d6f68a356865457a3afad86102a4d49cf2f6a33a8fc6513812e9bff23371432feace0580f55046c
要处理响应,我需要获取查询字符串数据.
对不起,我没有清楚地解释这个问题.我在收到付款后从付款网站获得回复时收到"找不到页面"错误.
我曾尝试与启用uri_protocol = 'PATH_INFO'
,并enable_query_strings = 'TRUE'
在config.php
.谷歌搜索我发现如果我使用htaccess重写这将无法正常工作.
我已经尝试更改配置条目,但它不起作用.
你可以这样得到它:
$this->input->get('some_variable', TRUE);
有关详细信息,请参阅此
我已经使用CodeIgniter超过一年了.在大多数情况下,我真的很喜欢它(我在论坛上做出贡献并在我能做的每一个实例中使用它)但我讨厌手册中该声明的弊端:
销毁全局GET数组.由于CodeIgniter不使用GET字符串,因此没有理由允许它.
在CodeIgniter应用程序中永远不需要GET的假设是asinine!在短短几天内,我不得不处理来自PayPal和ClickBank的帖子后页(我确信还有一百万人.)猜猜看,他们使用GET!
有一些方法可以阻止这种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)进行测试.查看哪个URI Protocol选项显示您的GET变量并使用它.
就我而言,我可以在REQUEST_URI中看到我需要的东西
// defeat stupid CI GET squashing! parse_str($_SERVER['REQUEST_URI'], $_GET);
这会将您的查询字符串放回到该页面实例的$ _GET超级全局中(您不必使用$ _GET,它可以是任何变量.)
编辑
发布后我发现在使用REQUEST_URI时,除非你删除所有内容,否则你将丢失第一个查询字符串数组键.例如,像/ controller/method?one = 1&two = 2这样的URL将在此示例中使用array('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']); } }
如果您想要未解析的查询字符串:
$this->input->server('QUERY_STRING');
打开application/config/config.php并设置以下值:
$config['uri_protocol'] = "PATH_INFO"; $config['enable_query_strings'] = TRUE;
现在查询字符串应该正常工作.
// 98% functional parse_str($_SERVER['REQUEST_URI'], $_GET);
这实际上是处理CodeIgniter中缺少对$ _GET查询字符串的支持的最佳方法.我实际上是自己想出了这个,但很快就意识到了Bretticus所做的同样的事情,你必须稍微修改一下你处理第一个变量的方式:
// 100% functional parse_str(substr(strrchr($_SERVER['REQUEST_URI'], "?"), 1), $_GET);
我自己做到这一点只是时间问题,但使用这种方法是一个更好的单行解决方案,其中包括修改现有的URI库,仅隔离到控制器所在的位置.适用,并且无需对默认配置进行任何更改(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 )