【问题标题】:Php - Codeigniter url spacesPHP - Codeigniter url 空间
【发布时间】:2016-09-20 16:38:18
【问题描述】:

我想要做的是当我点击我的特定产品时,我想输入产品的名称,而不是我的产品的 id 会出现在我的 url 中。 我今天做的是base_url/controller/method/id

我想做的是 base_url/controller/method/product-name 或 base_url/controller/method/product_name

但是在我的代码中发生的事情是在我的产品名称中,所有空格都被 %20 占据了我应该怎么做才能用下划线或破折号或任何安全的方式在 url 中调用产品名称来替换 %20。

无论我在那个 $name(product_name) 上得到什么,我都会把它传递给我的模型。

我的控制器

public function details($name){


    $prod_row = $this->PromoModel->getpromorow($name);
    $data['promodetail'] = $prod_row;

    $data['promo'] = $this->PromoModel->get_promo();

    $data['message']= "<h1> NO PROMOS AVAILABLE</h1>";
    $this->load->view('include/header',$data);
    $this->load->view('include/nav');
    $this->load->view('promo/PromoDetail', $data);
    $this->load->view('include/footer');
}

我的模特

public function getpromorow($name) {
    $this->db->where('name', $name);
    $query = $this->db->get('promo');
    return $query->row();
}

public function get_promo(){
    $query = $this->db->get('promo');
    return $query->result();
}

我的看法

<a href="<?= base_url(). 'promos/details/' . $promo_row->name ?>"> </a>

【问题讨论】:

  • str_replace(' ', '_', $promo_row-&gt;name)str_replace(' ', '-', $promo_row-&gt;name),在将其放入 url 之前执行此操作。
  • @ArtisticPhoenix 为您提供最佳创意,您也可以在此处使用urlencode()

标签: php codeigniter uri


【解决方案1】:

这应该可行,

  <a href="<?= base_url(). 'promos/details/' . str_replace(' ', '_', $promo_row->name); ?>"> </a>

至于- vs _,如果您要路由到它们,例如说产品名称成为您控制器中的方法,我认为 PHP 不允许在方法名称中使用 -,但它不会'也不允许空格.. 你可以使用 __call() 作弊,但那是另一回事了。

如果它是一个参数,那么它应该没那么重要。只要它是一个方法/函数名称。

-注意-这不是特定于 CI 的错误,请查看任何 url,告诉我您是否在其中看到空格。

更新日期: 作为建议,处理此问题的最佳方法是使用专用于 url 名称的字段(例如 slug 或此类),并且在制作新产品时只需执行改变名字。然后它是您可以控制的可编辑数据。例如,如果您的产品名称中包含-,该怎么办。这可能会导致问题。您可以通过单独的数据来避免这种情况,它甚至可以像 SKU 编号等。设置工作量更大,但从长远来看更易于维护。

【讨论】:

  • 我尝试了您发布的代码并且它可以工作,当涉及到控制器时,我反之亦然 $url = str_replace(' -', ' ', $name);然后我将其解码为 $decode = urldecode($url) 并将其传递给可能模型 $prod_row = $this->PromoModel->getpromorow($decode);所以我可以在我的模型中传递确切的名称,我将获得该特定产品的所有信息。我不知道这是否是正确或安全的方式,或者您对此有何建议。但谢谢你帮助我。
  • 删除链接本身的空格可能会更好,因为您依赖浏览器的行为,将它们留在里面。如果我理解正确的话 ^。您可以随时使用str_replace('-', ' ', $product ) 删除它们,但请确保不要将- 放在产品名称中。
  • 另一种更好的方法是在产品中添加一个名为 slug 的字段并将该字段用作 url 名称,您可以在添加新产品时自动创建它,但因为它是可编辑,您可以更好地控制它。
  • 注意!我只是注意到在我的评论中它的 str_replace('-' , ' ', $name) 但在我的代码中它的下划线没有破折号,所以这是一个小的更正。但谢谢你的建议,我把它放在我的笔记里。
  • 当然很高兴我能帮上忙。我真的建议在产品中创建一个单独的字段,我不知道您是否自己构建了所有产品内容。但是对于它为您提供的控制,我值得付出努力。
【解决方案2】:

聚会迟到了。但最好是使用urldecode($value)。由于“%20”中的“%”再次被编码为“%25”,我们可能不得不使用urldecode 两次。在这种情况下 - urldecode(urldecode($promo_row-&gt;name))

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2016-11-12
    • 2016-02-17
    • 1970-01-01
    相关资源
    最近更新 更多