【问题标题】:CodeIgniter encode string through uri segment?CodeIgniter 通过 uri 段编码字符串?
【发布时间】:2011-09-17 15:10:52
【问题描述】:

我是 codeigniter 的新手,我正在向网站添加搜索功能,并且有两个问题。

  1. 如何提交表单以便将其作为 uri 段(如查询字符串)发送?我之前通过提交帖子并在 uri 段中使用它重定向到一个 url 来做到这一点。但是有更好的方法吗?
  2. 如何通过 uri 段发送字符串(例如搜索查询,完全由用户生成)?我尝试了 urlencode,但仍然有不允许使用的字符。我想保留大部分查询是什么(所以很容易在历史中找到,所以没有base64_encode)。想法?有没有这个或什么的内置函数?

感谢您的帮助, 最大

【问题讨论】:

  • 我不太确定你的问题是什么。您想从 PHP 提交 GET 请求还是希望 PHP 处理 GET 请求?你能解释一下用户如何生成搜索查询吗? PHP 是服务器端,所以它不能是“用户生成的”。如果您可以详细说明您正在尝试做的事情,并可能包含一些您所做的事情的示例,这样会更清楚。
  • 我尽可能地改写了它,这有意义吗?如果没有,我就重写它。
  • 您的搜索表单上有多个字段,还是只有一个搜索框?

标签: php url codeigniter


【解决方案1】:
  1. 是的。使用method="get" 创建一个表单。
  2. 如果按上述方式设置表单,则无需担心对请求进行编码。

例子:

<form action="example.php" method="get">
  <input type="text" name="search" />
  <input type="submit" value="Search" />
</form>

更新:以“CodeIgniter”方式生成表单:

echo form_open('email/send', array('method' => 'get'));

【讨论】:

  • 我专门讨论的是 codeigniter(它在其标准设置中不允许 GET),并且说的是 uri 段,而不是查询字符串
  • @mazzzzz - 我已经更新了我的答案以包含“CodeIgniter”的做法。
  • 你没有使用过codeigniter。它使用 uri 段(例如“search.php/q/some-stuff”)代替查询字符串(例如“?q=some%20stuff”)。如果不调整不应该(imo)调整的约定,就不能将 get 与 codeigniter 一起使用。否则使用 GET 将起作用。
  • @mazzzzz - 我完全误解了你的问题。我被使用“GET”这个词吓倒了,这是你原来问题的一部分。我每天都使用 CodeIgniter,但我只是不知道你的意思是 URL 段。对于像搜索表单这样的东西,分段可能并不理想,尤其是考虑到标点​​、空格和符号实际上并不能正常工作。你有什么理由想这样做而不是仅仅发布一个帖子?
【解决方案2】:

如果你需要使用类似的东西

index.php?c=search&m=search&q=wow

而不是 CI 的默认 URI 段

您必须启用查询字符串。 你可以通过改变一些配置来做到这一点

 application/config.php

找到

$config['enable_query_strings'] = FALSE;

并将其更改为

$config['enable_query_strings'] = TRUE;

然后你就可以使用查询字符串了。

但是 mots CI 的人不喜欢使用查询字符串,我不知道为什么。

【讨论】:

  • 我个人讨厌查询字符串的外观(另外我在传统系统中添加了很多工作(链接等等),所以我不想在这一点上切换),我可以如果它只是搜索查询,则处理它,但现在如果它就是一切。
  • 然后只使用默认的 URI 段 :) ,这样更容易,看起来更干净。
  • 这就是我想做的事情,问题是uri段比查询字符串有更多的限制,我想不出一种方法来编码数据(使其仍然可读)和解码再说一遍。想法?
  • @mazzzzz - 就像我上面说的,如果它是一个搜索查询,你真的不能这样做。即使你对所有字符进行了urlencode,它看起来也会非常难看。例如“这只是一个例子!”会变成example.com/search/It's%20just%20an%20example!。您可以将单词拆分为多个段,但您必须松开符号、标点符号和其他一些字符,这使得无法将这些段转换回原始搜索查询。这种情况下的 url 看起来会更好(即example.com/search/its/just/an/example)。您应该使用 POST。
【解决方案3】:

您可以使用 JavaScript 来形成 URL,如下所示:

<form onsubmit="window.location.href='/search/'+encodeURIComponent(document.getElementById('search_query').value);return false">
    <input id="search_query" type="text" />
    <input type="submit" />
</form>

编辑: 由于 CodeIgniter 的 URI 过滤器,上述答案将不起作用。但是,根据我对 1.7 版的经验,如果您传递了多个 GET 参数,则可以使用 $_REQUEST 数组来检索它们。这将完全绕过 URI 过滤器。这样做:

<form action="/search">
    <input name="x" type="hidden" />
    <input name="q" type="text" />
    <input type="submit" />
</form>

然后使用 $_REQUEST['q'] 获取您的搜索查询。希望这对你有用。

【讨论】:

  • 感谢您的配置选项,我会调查一下
  • 我刚刚做了这个str_replace('%',':',rawurlencode($this-&gt;input-&gt;post('search'))) 进行编码,rawurldecode(str_replace(':','%',$this-&gt;uri-&gt;segment(2))) 似乎工作得很好,并且只对特殊字符进行编码(所以单词仍然可以搜索)。并使用:(因为是用url_encode编码的,所以不会碍事)
  • @Mark Eirich,这是一个很好的方法。您在配置文件选项中引用的设置也可以在here 中找到。一种可能的替代方法是使用控制器方法“参数”——它与使用查询字符串本质上是一样的。
  • 您能否举一个虚拟机管理程序示例,我似乎无法使其工作:/。另外,我使用的是 remap,所以我不需要指定方法(这将是多余的,search/search)有什么想法吗?
  • @mazzzzz 我的代码是否收到 CodeIgniter 的“不允许的字符”错误?还是您有其他问题?
猜你喜欢
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2015-08-25
相关资源
最近更新 更多