为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
摇曳的蔷薇 2023-03-26 16:04:25
我刚刚开始学习 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);   }结果不正确...对于单一选择,它工作正常。当我使用组合时,结果不正确。
查看完整描述

4 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

我假设你需要你的查询/过滤器是动态的。


您的 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'))

{

    $criteria .= " AND `filter1` = '".addslashes($request->get('filter1'))."'";

}


if($request->get('filter2'))

{

    $criteria .= " AND `filter2` = '".addslashes($request->get('filter2'))."'";

}


//and so on...


//output

$query =  DB::select("SELECT * FROM your_table WHERE 1 = 1 {$criteria}");

笔记:


您可能需要谨慎地形成$criteria,因为它可能仍然有机会使用DB::select方法进行 Sql 注入,但我相信您可以使用相同的逻辑来适应使用 Laravel Eloquent 方法。


查看完整回答
反对 回复 2023-03-26
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

我会改变这个:


$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');

对此:


    $new  =  (empty($request->get('new')) ? "%" : $request->get('new');

    $used  =  (empty($request->get('used')) ? "%" : $request->get('used');

    $registered  =  (empty($request->get('registered')) ? "%" : $request->get('registered');

    $make = (empty($request->get('make')) ? "%" : $request->get('make');

    $model = (empty($request->get('model')) ? "%" : $request->get('model');

    $price = (empty($request->get('price')) ? "%" : $request->get('price');

    $city =  (empty($request->get('city')) ? "%" : $request->get('city');

    $registration = (empty($request->get('firstRegistration')) ? "%" : $request->get('firstRegistration');



查看完整回答
反对 回复 2023-03-26
?
绝地无双

TA贡献1946条经验 获得超4个赞

这是您的问题的解决方案



    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 注入。


查看完整回答
反对 回复 2023-03-26
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

我会尝试将查询存储到一个变量,然后使用三元条件或三元条件添加选择(如果 isset 或不为空)


$query=""SELECT  * 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 =  DB::select($query);

干杯


查看完整回答
反对 回复 2023-03-26
  • 4 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信