猿问

使用 mysql 和 php 搜索和过滤数据

我刚刚开始学习 php 和 mysql,并且正在使用 php 和 mysql 创建一个项目。我在搜索和过滤数据库中的数据时卡住了。搜索基本上是根据用户输入组合搜索和过滤数据。

这是我的代码:


public function filterSearch(Request $request){

    $new  =  $request->get('new');

    $used  =  $request->get('used');

    $registered  =  $request->get('registered');

    $make = $request->get('make');

    $model = $request->get('model');

    $price = $request->get('price');

    $city =  $request->get('city');

    $registration = $request->get('firstRegistration');


    $query =  DB::select("SELECT  * FROM ads WHERE vehicleCond LIKE '".$new."' OR vehicleCond LIKE '".$used."' OR vehicleCond LIKE '".$registered."' ");

    $decode =  json_decode(json_encode($query),true);

    $finalArr = array();

    for($i=0; $i<count($decode); $i++){

        if($make || $model || $registration){

            if(($decode[$i]['make'] == $make) || ($decode[$i]['model'] == $model) ||  ($decode[$i]['registration'] == $registration)){

                array_push($finalArr,$decode[$i]);

            }

        }else{

            array_push($finalArr,$decode[$i]);

        }   

    }

    return response()->json(['success'=>$finalArr], 200);


   }

结果不正确...对于单一选择,它工作正常。当我使用组合时,结果不正确。


摇曳的蔷薇
浏览 122回答 4
4回答

守候你守候我

我假设你需要你的查询/过滤器是动态的。您的 html 脚本可以遵循以下模式/格式:<input type="checkbox" name="filter1" value="new"><input type="checkbox" name="filter1" value="used"><input type="checkbox" name="filter1" value="pre-registered"><select name="filter2" id="">...</select><select name="filter3" id="">...</select>在 Php 文件中,您可以使用一些条件来附加查询条件/过滤器:$criteria = "";if($request->get('filter1')){&nbsp; &nbsp; $criteria .= " AND `filter1` = '".addslashes($request->get('filter1'))."'";}if($request->get('filter2')){&nbsp; &nbsp; $criteria .= " AND `filter2` = '".addslashes($request->get('filter2'))."'";}//and so on...//output$query =&nbsp; DB::select("SELECT * FROM your_table WHERE 1 = 1 {$criteria}");笔记:您可能需要谨慎地形成$criteria,因为它可能仍然有机会使用DB::select方法进行 Sql 注入,但我相信您可以使用相同的逻辑来适应使用 Laravel Eloquent 方法。

陪伴而非守候

我会改变这个:$new&nbsp; =&nbsp; $request->get('new');$used&nbsp; =&nbsp; $request->get('used');$registered&nbsp; =&nbsp; $request->get('registered');$make = $request->get('make');$model = $request->get('model');$price = $request->get('price');$city =&nbsp; $request->get('city');$registration = $request->get('firstRegistration');对此:&nbsp; &nbsp; $new&nbsp; =&nbsp; (empty($request->get('new')) ? "%" : $request->get('new');&nbsp; &nbsp; $used&nbsp; =&nbsp; (empty($request->get('used')) ? "%" : $request->get('used');&nbsp; &nbsp; $registered&nbsp; =&nbsp; (empty($request->get('registered')) ? "%" : $request->get('registered');&nbsp; &nbsp; $make = (empty($request->get('make')) ? "%" : $request->get('make');&nbsp; &nbsp; $model = (empty($request->get('model')) ? "%" : $request->get('model');&nbsp; &nbsp; $price = (empty($request->get('price')) ? "%" : $request->get('price');&nbsp; &nbsp; $city =&nbsp; (empty($request->get('city')) ? "%" : $request->get('city');&nbsp; &nbsp; $registration = (empty($request->get('firstRegistration')) ? "%" : $request->get('firstRegistration');

绝地无双

这是您的问题的解决方案    public function filterSearch(Request $request){        $make = $request->get('make');        $model = $request->get('model');        $price = $request->get('price');        $city =  $request->get('city');        $registration = $request->get('firstRegistration');        $searchFields = [            'new',            'used',            'registered'        ];        $query =  DB::table('ads')->where(function ($query) use ($searchFields, $request) {                collect($searchFields)->each(function($field) use($likeCriteria, $query) {                    $likeCriteria = $request->get($field);                    if ($likeCriteria === '') {                        $likeCriteria = '%';                    }                    $query->orWhere($field, 'like', '%' . $likeCriteria . '%');                });            })->get();        $decode =  json_decode(json_encode($query),true);        $finalArr = array();        for($i=0; $i<count($decode); $i++){            if($make || $model || $registration){                if(($decode[$i]['make'] == $make) || ($decode[$i]['model'] == $model) ||  ($decode[$i]['registration'] == $registration)){                    array_push($finalArr,$decode[$i]);                }            }else{                array_push($finalArr,$decode[$i]);            }           }        return response()->json(['success'=>$finalArr], 200);    }首先,将要搜索的所有变量移动到数组中,$searchFields这样我们就可以避免代码重复并使用干净的代码。更改您的数据库查询,以便我们可以使用带有查询功能的table方法where来移动其中的所有逻辑,并避免 SQL 注入。

繁星点点滴滴

我会尝试将查询存储到一个变量,然后使用三元条件或三元条件添加选择(如果 isset 或不为空)$query=""SELECT&nbsp; * FROM ads WHERE 1=1 ";$query.=(isset($new) && $new!='' ? " OR vehicleCond LIKE '%" . $new . "%'" : "");$query.=(isset($used) && $used!='' ? " OR vehicleCond LIKE '%" . $used. "%'" : "");$query.=(isset($registered) && $registered!='' ? " OR vehicleCond LIKE '%" . $registered. "%'" : "");//and so on depends on your selection variables//after that$query =&nbsp; DB::select($query);干杯
随时随地看视频慕课网APP
我要回答