我需要将此http://mysite.com/store/store-name
之类的网址重定向到http://mysite.com/stores/products/store-id
。请注意,我需要从数据库中获取商店ID。那么是否可以在routes.php中执行db操作?
在文档中,语法为$route['store/:any']
。如何获取第二个参数的值,其中提到:any
。
答案 0 :(得分:4)
通过路由运行数据库查询并没有什么好的或简单的方法。但是,您可以在控制器功能的开头进行验证。
我认为你的store-name
是产品的某种slu ??基本上,您可以验证值是否为数字,如果没有找到slug然后重定向。
<强>配置/ routes.php文件强>
$route["store/(.*)"] = 'stores/products/$1';
/* () and $1 together passes the values */
<强>控制器/ stores.php 强>
/* Class etc. */
function products($mix) {
if (is_numeric($mix))
$int_id = $mix;
else {
$row = $this->get_where('products', array('slug' => $mix))->row();
$this->load->helper('url');
redirect("stores/products/{$row->id}");
}
/* Do stuff with the $int_id */
}
这假设你有:
store-name
答案 1 :(得分:1)
我可能会迟到一点,但我可能有其他建议。
我的路线使用以下内容:
http://mysite.com/store/1/store-name
原因是...根据您的方法,如果您创建
http://mysite.com/store/store-name
但是经过一段时间(毫无疑问Google已将您的网页编入索引)后,您决定将商店名称更改为“精彩商店名称”的原因,您自然会将链接更改为
http://mysite.com/store/wonderful-store-name
这会杀死你的搜索引擎优化和任何索引链接。
我使用http://mysite.com/store/1/store-name的解决方案意味着您可以将store-name
更改为您想要的任何内容,但它始终会引用1
,这意味着用户仍会看到相关页面。
答案 2 :(得分:1)
任何。一切都在你编码的方式。 CI中的路由真正灵活。除了标准CI通配符(:any)(:num)之外,您还可以使用正则表达式。如果您不得不喜欢,您甚至可以为路径变量添加前缀或后缀:
$route['store/(:any)'] = "redircontroller/redirfunction/$1";
// for instance the namelookup method of the mystores controller
$route['stores/products/(:any)'] = "mystores/namelookup/$1";
通过定义路径值中的变量来获取第二个参数(以及第三个等等),这些变量将传递给您定义的控制器方法。如果您的新网址中的“产品”也是变体,则应该在那里开始使用通配符表达式。您还可以使用URI类($ this-&gt; uri-&gt; segment(n))从网址中提取参数。
但是,您不在routes.php中执行数据库操作。您在路由到的控制器中执行数据库操作。我的猜测是你必须使用查询中url中使用的任何内容来匹配商店ID。 在任何情况下,您使用路径文件的路径是用户将看到的路径。要进行重定向,您必须接受原始路径,然后将用户重定向到新路径,如下所示:
// in some controller that's attached to the original url
public function redirfunct($var){
$this->load->helper('url');
redirect(base_url('stores/products/' . $var));
}
我希望这会对你有所帮助。
答案 3 :(得分:0)
是的,这很容易,您只需要显示ID而不是名称, 你必须像storeName&gt;点击查看详细信息
将其设为
STOREID&GT;点击查看详细信息
当你将参数传递给数据库时,更改mysql的检查,将其更改为id而不是name,这可能有点像 “从table_name中选择yourRequiredColumn,其中id =”。参数。“
由于