Как передать параметры в функции индекса в codeigniter

вот пример URL: http://www.example.com/search/search-keyword

Я пытаюсь сделать эту работу, я удалил index.php, используя .htaccess, search – это контроллер, и я хочу передать параметр в методе индекса.

в настоящее время это выглядит так:

class Search extends CI_Controller{ function index($param){ echo $param; } } 

какие-либо предложения? Я не могу заставить его работать

  • Вам нужен index сегмент http://www.mysite.com/search/index/search-keyword .
  • Или вам нужно использовать маршрут $route['search/(:any)'] = 'search/index/$1';
  • Или вы можете посмотреть переназначение

Помните, что не доверяйте пользовательскому вводу, особенно когда вы бросаете его в свой URL. Последняя версия CI теперь поддерживает переменные $_GET , поэтому вы можете захотеть изучить это или flashdata . Исходный термин, столь же простой, как O' Brien , даст вам фатальную ошибку («В URI, который вы отправили, были запрещены символы.»).

 class Search extends CI_Controller{ function _remap($param) { $this->index($param); } function index($param){ echo $param; } } 

Затем вы сможете получить доступ к этому как: / search / 123123: и страница будет выводить «123123» или все, что вы ставите вместо этого.

 function _remap($parameter){ $this->_index($parameter); } 

Попробуй и расскажи, как это получилось.

Большинство из этих решений будут работать, только если у вас есть только одна функция index() в вашем контроллере. Если у вас есть это на ваших маршрутах:

 $route['search/(:any)'] = 'search/index/$1'; 

С приведенным выше в ваших маршрутах, что произойдет, так это то, что ваша функция поиска будет работать, но если вы добавите какие-либо другие функции к тому же контроллеру, все они будут перенаправлены на /search/index/$1 .

Единственное решение, о котором я могу думать, позволяет вам использовать нужный URL-адрес, сохраняя возможность добавления каких-либо других функций в ваш контроллер поиска, – это добавить своего рода беспорядочное условие для вашего файла маршрутов. Вот как он будет выглядеть и что он делает:

$request = $_SERVER['REQUEST_URI']; // Only add this for readability if(!strpos($request, 'search/another_function') || !strpos($request, 'search/more_functions')) { $route['search/(:any)'] = 'search/index/$1'; }

То, что это делает, в основном говорит: «Если запрошенный URL не содержит имени какой-либо из моих функций контроллера поиска, то он должен быть предназначен для индекса, поэтому мы активируем правило маршрута для индекса».

Это позволит вам без проблем получать запросы на search/any_other_functions_you_have и только активировать правило для скрытия индексной функции, когда URI запроса не соответствует ни одному из них.

Одним из побочных эффектов этого является то, что вы никогда не получите 404. Например, если кто-то вводит URL-адрес, например «yourdomain.com/search/something», и они ожидают, что он покажет страницу результатов без поиска, они не получат 404, предупреждая их о том, что такой страницы нет, и вместо этого приложение будет считать, что они набрали, это поисковый запрос. Тем не менее, похоже, что это не большая проблема для вас, и я не вижу, чтобы это было настолько ужасно, что один контроллер был неабелем, чтобы вернуть 404s.

Вам нужно понять, как работают коды воспламенителя кода, в основном так:

http://www.mysite.com/ {controller} / {function}

Итак, что ваш url на самом деле ищет функцию под названием «ключевое слово» в вашем контроллере поиска.

У вас есть несколько вариантов. Самый простой способ – просто изменить URL-адрес:

http://www.mysite.com/search/result/keyword

Тогда это должно работать отлично:

 class Search extends CI_Controller{ function result($param){ echo $param; } } 

Если вы действительно хотите использовать URL-адрес, как у вас, вы можете использовать тот же фрагмент кода, что и выше, но также открыть «application / config / routes.php» и добавить его в нижнюю часть.

 $route['search/(:any)'] = "search/result"; 

Альтернативно, если вы хотите продолжить использование функции индекса, вы можете изменить ее на эту

  $route['search/(:any)'] = "search/index"; 

И измените свой класс на что-то вроде этого:

 class Search extends CI_Controller{ function index($param=FALSE){ if($param == FALSE) { //Show search box } else { //Show search results } } } 

Не забудьте обновить свой ответ, если вы сами это выясните или согласитесь, что некоторые из них ответят, если он ответит на него 🙂

Я только что начал CI, и вот мое решение и реализовало его на моем сайте. Пока это работает для меня, и мои поисковые запросы были проиндексированы Google как ссылки

 Class Search extends CI_Controller{ function index(){ $search_item = $this->input->post('search_box'); // this is from the input field redirect(base_url()."search/q/".url_title($search_item)); } // i've redirected it to the "search" controller then : function q($search_item = null){// process search // load the view here with the data } } 

Это мое решение:

Из CI userGuide

 public function _remap($method) { if ($method == 'some_method') { $this->$method(); } else { $this->default_method(); } } 

Поэтому я создал свой контроллер таким образом:

 class Shortener extends CI_Controller { function shortener() { parent::__construct(); } function index($getVar) { echo "Get var: " . $getVar; } function config() { echo "another function"; } function _remap($method) { if($method == "config") { $this->$method(); } else { $this->index($method); } } } 

Надеюсь, это может быть полезно кому-то …

BUG: если вы вызываете / сокращаете функцию _remap, переходите «index» к функции index () … ее можно решить, добавив условие if или что-то еще

Вы должны использовать CI URI Class. http://codeigniter.com/user_guide/libraries/uri.html

 class Search extends CI_Controller{ function index($param){ //echo the search-keyword echo $this->uri->segment(2); } } 

Самый простой способ – просто использовать сегменты uri :

 class Search extends CI_Controller{ function index(){ $param=$this->uri->segment(2); echo $param; } } 

Или, как сказал Мадмартиган, используйте маршруты, которые, вероятно, лучший способ сделать это.

Мне также нужно было проверить, прошла ли какая-либо переменная или нет, поэтому вот решение, которое я принял.

 <?php defined('BASEPATH') OR exit('No direct script access allowed'); class Story extends CI_Controller{ function story() { parent::__construct(); } function _remap($parameter){ $this->_index($parameter); } public function _index($story_id) { if($story_id == 'index'){ //No variable passed redirect('auth', 'refresh'); }else{ $data['title'] = "Story"; $this->load->view('story', $data); } } } 

Надеюсь, это поможет кому-то!

Я, наконец, нашел обходное решение, так как я не могу просто поместить переменные post в URL.

То, что я сделал, это создать другую функцию, а затем перенаправить ее на эту функцию.

  class Search extends CI_Controller{ function index(){ $search_item = $this->input-post('search_item'); redirect("search/q/".url_title($search_item)); } function q($key){ // process search } }