Как сделать рабочую форму поиска PHP/HTML?

Итак, в основном я делаю проект для колледжа, и единственное, чего не хватает в моем проекте, - это работающая форма поиска, но я не знаю, как это сделать. Все мои продукты создаются и заносятся в базу данных.

Мои маршруты:

Route::get('/', [
    'uses' => 'ProductsController@getIndex',
    'as'=> 'product.index'
 ] //tenho de meter um . porque nao é uma diretoria global, index ta dentro 
duma pasta shop
 );

мой стол:

  Schema::create('products', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->string("imagePath");
        $table->string("title");
        $table->text("description");
        $table->integer("price");
    });

моя структура формы:

   <form action = "" method = "post" class = "navbar-form navbar-left " role = "search">
            <div class = "form-group">
                <input type = "text"  class = "form-control" placeholder = "Search">
            </div>
            <button type = "submit" class = "btn btn-default">Search</button>
        </form>

мой контроллер продуктов:

   public function getIndex(){
    $products = Products::all();
    return view('shop.index', ['products' => $products]);
}

Я видел много руководств о том, как сделать один, но я не могу заставить его фильтровать те, которые у меня есть, например, если у меня есть 3 ботинка и 5 ботинок в магазине, если я напишу «ботинок» в поиске , я хочу, чтобы появлялись только 3 ботинка

Вы создали маршрут поиска

Shailendra Gupta 18.01.2019 20:47

да, Route::post('/', [ 'uses' => 'ProductsController@searchProducts', 'as'=>'product.search' ]);

Diogo Cruz 18.01.2019 21:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
770
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

ты можешь это сделать

html

       <form action = "/search" method='post' class = "navbar-form navbar-left " role = "search">
                <div class = "form-group">
                    <input type = "text"  class = "form-control" placeholder = "Search" name = "search">
                </div>
                <button type = "submit" class = "btn btn-default">Search</button>
            </form>


    PHP

    public function search(Request $request)
    {
        $products = Product::where('title', 'LIKE', '%'.request->search.'%')->get();

        return view('search', ['products' => $products]);
    }

Измените только то представление, которое вы хотите вернуть, и создайте его в файле route/web.php.

существует МНОЖЕСТВО разных способов приблизиться к чему-то вроде поиска... от простого до очень сложного, но базовым методом будет поиск в полях заголовка и описания по ключевому слову, такому как «загрузка».

Вы захотите добавить пару вещей... Во-первых, добавьте новый маршрут для обработки поискового запроса:

Route::post('/results', [
  'uses' => 'ProductsController@searchProducts', 
  'as'=>'product.search'
]);

Затем добавьте имя в свой html-ввод, например «ключевое слово», вместе с ярлыком блейда для поля токена CSRF:

<form action = "/results" method = "post" class = "navbar-form navbar-left " role = "search">
  @csrf
  <div class = "form-group">
    <input type = "text"  class = "form-control" placeholder = "Search" name = "keyword">
  </div>
  <button type = "submit" class = "btn btn-default">Search</button>
</form>

Затем добавьте в контроллер функцию для обработки запроса:

public function searchProducts(Request $request){
  $results = Product::where('title', 'like', '%'.$request->search.'%')
    ->orWhere('description', 'like', '%'.$request->search.'%')
    ->orderBy('title', 'desc')
    ->get();

  return view('search_results', ['results'=>$results, 'keyword'=>$request->keyword]);
}

Наконец, создайте новый файл с именем search_results.blade.php и поместите его в каталог представлений. Это будет использоваться для отображения результатов поиска пользователю.

<h2>Search Results for {{$keyword}}</h4>
<table>
    <thead>
        <tr>
            <th>Product</th>
            <th>Description</th>
            <th>Price</td>
        </tr>
    </thead>
    <tbody>
        @forelse($results as $result)
            <tr>
                <td>{{$result->title}}</td>
                <td>{{$result->description}}</td>
                <td>{{$result->price}}</td>
            </tr>
        @empty
            <tr>
                <td colspan = "3">
                    No Products Found
                </td>
            </tr>
        @endforelse
    </tbody>
</table>

С этой основой вы действительно можете пойти дальше и добавить параметры фильтрации, сортировки, ранжирования и многое другое. Надеюсь, это поможет вам двигаться вперед!

Прежде всего, спасибо за помощь. Во-вторых, я получаю сообщение об ошибке «419: Извините, срок действия вашего сеанса истек. Пожалуйста, обновите и повторите попытку». Любые идеи?

Diogo Cruz 18.01.2019 21:05

Ааа, извините... В Laravel встроены функции для защиты от подделки межсайтовых запросов (CSRF). Каждый раз, когда вы отправляете форму, она проверяет, был ли добавлен к запросу специальный токен... поэтому вам нужно включить это. Самый простой способ — просто добавить @csrf где-нибудь в форме. По сути, это просто ярлык блейда, который добавляет скрытый ввод формы с токеном. Никаких других изменений не требуется.

AndyChern 18.01.2019 21:10

но его {{csrf_token}} или {{csrf_field}}? И я добавляю его прямо рядом с </form> ?

Diogo Cruz 18.01.2019 21:18

Laravel предлагает несколько способов сделать это, но из шаблона блейда (представления) вы можете использовать ярлык @csrf. Технически вы можете разместить его в любом месте внутри тегов формы, но я обычно добавляю его прямо вверху. Я обновил свой ответ, включив в него токен. {{csrf_field()}} тоже работает... тот же вывод, другой синтаксис.

AndyChern 18.01.2019 21:26

К вашему сведению: csrf_token() даст вам только значение токена. csrf_field() предоставит вам полное поле формы с заполненным токеном.

AndyChern 18.01.2019 21:31

Я поставил его в конце, прежде чем вы ответили, и, похоже, он имеет такое же применение. Теперь было то, что «Просмотр [search_results] не найден.». И я должен заменить его на «shop.index» или «/», чтобы перейти на главную страницу, но с перечисленными товарами. Но если я это сделаю, это выдаст мне ошибку файла, который я даже не трогал для этой проблемы.

Diogo Cruz 18.01.2019 21:32

В моем примере вам нужно создать новый файл представления с именем search_results.blade.php для отображения результатов. Вы также можете повторно использовать одно и то же представление, добавив проверку, чтобы увидеть, установлена ​​ли переменная $results и условно отображать раздел результатов. Множество различных опций в зависимости от того, как вы хотите, чтобы поиск работал.

AndyChern 18.01.2019 21:57
Ответ принят как подходящий

ваш HTML будет

<form action = "{{ route('product.search') }}" method = "post" class = "navbar-form navbar-left " role = "search">
    @csrf
    <div class = "form-group">
        <input type = "text"  class = "form-control" name = "search" placeholder = "Search">
    </div>
    <button type = "submit" class = "btn btn-default">Search</button>
</form>

в вашей функции searchProduct

для подобного запроса, где он может выполнять поиск по заголовку, и если присутствует ключевое слово, он вернет все продукты с таким же заголовком, который вы ищете

public function searchProducts(Request $request){
    $products = Product::where('title', 'like', '%'.$request->search.'%')->get();
    return view('shop.index', ['products' => $products]);
}

для точно такого же результата заголовка

public function searchProducts(Request $request){
    $products = Product::where('title',$request->search)->get();
    return view('shop.index', ['products' => $products]);
}

это не дает мне никаких ошибок, но показывает страницу shop.index с любыми фильтрами того, что я помещал в поле поиска. Все мои продукты по-прежнему отображаются

Diogo Cruz 18.01.2019 21:42

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

Shailendra Gupta 18.01.2019 21:44

Это не сработало, потому что у меня есть 2 имени в моей форме (имя = «поиск» и имя = «ключевое слово»)

Diogo Cruz 18.01.2019 21:47

Другие вопросы по теме