我有一个应用程序,其中包含一个名为项目的表,我希望能够搜索到这些项目。我更喜欢使用现有方法来调用模型来获取查询结果。所以我刚才的URL格式是example.com/projects/id/slug,所有项目只是example.com/projects。我想要一个搜索表单,将关键字作为字符串传递给方法。
我知道CI默认情况下不允许$ _GET:
从CodeIgniter的手册中了解安全性:
GET,POST和COOKIE数据
GET数据是完全不允许的 CodeIgniter自系统使用以来 URI段而不是传统的 URL查询字符串(除非你有 启用查询字符串选项 在你的配置文件中)。 Input类未设置全局GET数组 在系统初始化期间。
我的问题是如何使用多个关键字以这种方式使用URI细分?
我可以执行搜索/关键字+ secondkeyword + thirdkeyword之类的操作吗?
无论如何,使用表单将文本框中的关键字转换为上述格式?
谢谢,
比利
答案 0 :(得分:3)
如果你想这样做......
你可以做这样的事情,假设有多个帖子输入并且它们仅用于搜索,它可能看起来像这样
function search(){
$url = $this->uri->segment(2);
if(empty($url)){
if((isset($_POST) && (!empty($_POST))
{
$search_seg = '';
foreach($_POST as $k => $v){
// I always make sure to use the CI post w/
// TRUE set in the second param so as to XSS filter the user input
$var = $this->input->post($k, TRUE);
// Just incase the user input had a plus in it?
$var = str_replace('+', '%20', $var)
// Concatenate the search string
$search_seg .= $var . '+';
}
// Make the url, use substr() to strip the last + off the end
$search_seg = 'search/' . substr($search_seg, 0, -1);
/* Make sure CI's URL helper is enabled
$this->load->helper('url'); if it hasn't been loaded
This will give the illusion that the form post went to this URL,
thus doing what you're looking for... */
redirect($search_seg, 'location');
}else{
// There was no post, do whatever
}
}else{
$search_arr = explode('+', $url);
}
上面应该完全按照你的描述进行操作,尽管有很多方法可以重新创建$ _GET数组并仍然使用CI样式的URL,尽管这有点复杂
附加信息:
如果只有一个搜索输入字段,比如说,这些术语是用空格分隔的,那么你可能想这样做(可能有一些正则表达式过滤)...用foreach($_POST as $k => $v)...
循环替换这样:
$keywordinput = $this->input->post('keywords', TRUE);
$keywordinput = trim($keywordinput);
$keywords = explode(' ', $keywordinput);
foreach($keywords as $word){
if(!empty($word)){
$word = str_replace('+', '%20', $var)
$search_seg .= $word . '+';
}
}
答案 1 :(得分:0)
使用$ _POST可能是复杂查询的更好选择,但这可能有效,但要求URI具有特定的参数顺序(可能有更好的方法)
/*controller/method/params = search/do_search/Ross/Red/Male */
function do_search($name, $colour, $gender)
{
$this->db->or_where('name', $name);
$this->db->or_where('colour', $colour);
$this->db->or_where('gender', $gender);
// etc
}
不是非常可扩展或灵活,但对于简单的搜索,这可能就足够了。
答案 2 :(得分:0)
如果你想让你的网址像这样 -
search/keyword+secondkeyword+thirdkeyword?
并且还希望它是可收藏的,然后使用javascript只是我猜的选项。
使用javascript你可以在#之后在url中设置搜索参数,所以最终的网址将是这样的 -
search#keyword+secondkeyword+thirdkeyword
如果你使用这种方法,这意味着你将通过ajax加载你的搜索结果,即每当遇到一个网址时,你将通过javascript从网址哈希后得到搜索关键字。通过ajax加载结果并显示结果。如果更改了搜索条件,则每次需要使用javascript将哈希后的新关键字附加到网址时。
在#之后获取url参数的基本javascript代码如下 -
var parameters = window.location.hash;