1

我有一个搜索框,我让用户输入他们想要搜索的关键词。提交时,我将输入框中的单词(如果有多个)拆分为一个数组,并对每个单词执行查询。使用 SQL,我可以获得至少具有一个值的结果,问题是我只想获取至少在一列或另一列中具有所有参数的行。

public function employeeSearchAction()
    {
        if ($this->user_permissions < 1) {
            return 0;
        }
        // split search string into array based on spaces
        if ($this->data != '') {
            $searchParams = explode(' ', trim($this->data));
            // get any rows with any one of these values in them
            foreach ($searchParams as $s) {
                $this->db->orWhere('user_firstname', '%'.$s.'%', 'like');
                $this->db->orWhere('user_lastname', '%'.$s.'%', 'like');
                $this->db->orWhere('user_email1', '%'.$s.'%', 'like');
                $this->db->orWhere('user_phn_1', '%'.$s.'%', 'like');
                $this->db->orWhere('user_phn_2', '%'.$s.'%', 'like');
                $this->db->orWhere('user_phn_3', '%'.$s.'%', 'like');
                // $this->db->orWhere('user_address1', '%'.$s.'%', 'like');
                $this->db->orWhere('user_position', '%'.$s.'%', 'like');
                $this->db->orWhere('user_type', '%'.$s.'%', 'like');
                $this->db->orWhere('user_division', '%'.$s.'%', 'like');
                // $this->db->orWhere('user_position', $s);
                // $this->db->orWhere('user_type', $s);
                // $this->db->orWhere('user_division', $s);
            }
            $this->db->having('owner_id', $this->owner_id);
            $binaryArray = array_fill(0, sizeof($searchParams), 0);
            $results = $this->db->get('tblusers');
            $filtered = [];
            // filter rows to ensure that all rows have every parameter
            foreach ($results as $r) {
                $binaryArray = array_fill(0, sizeof($searchParams), 0);
                foreach ($binaryArray as $key=>$b) {
                    if (strpos(strtolower($r['user_firstname']), strtolower($searchParams[$key])) !== false ||
                  strpos(strtolower($r['user_lastname']), strtolower($searchParams[$key])) !== false ||
                  strpos($r['user_email1'], strtolower($searchParams[$key])) !== false ||
                  strpos($r['user_phn_1'], strtolower($searchParams[$key])) !== false ||
                  strpos($r['user_phn_2'], strtolower($searchParams[$key])) !== false ||
                  strpos($r['user_phn_3'], strtolower($searchParams[$key])) !== false ||
                  strpos(strtolower($r['user_position']), strtolower($searchParams[$key])) !== false ||
                  strpos(strtolower($r['user_type']), strtolower($searchParams[$key])) !== false ||
                  strpos(strtolower($r['user_division']), strtolower($searchParams[$key])) !== false
                  // strpos($r['user_address1'], strtolower($searchParams[$key])) !== false
                ) {
                        $binaryArray[$key] = 1;
                    }
                }
                if (!in_array(0, $binaryArray)) {
                    $filtered[] = $r;
                }
            }
        } else {
            $this->db->where('owner_id', $this->owner_id);
            $filtered = $this->db->get('tblusers');
        }
        foreach ($filtered as $r) {
            $user_phn_1 = $r['user_phn_1'] == '' ? 'N/A' : '<a href="tel:+1'.$r['user_phn_1'].'">'.preg_replace("/[^0-9]/", "", $r['user_phn_1']).'</a>';
            $user_phn_2 = $r['user_phn_2'] == '' ? 'N/A' : '<a href="tel:+1'.$r['user_phn_2'].'">'.$r['user_phn_2'].'</a>';
            $user_position = $r['user_position'] == '' ? 'N/A' : $r['user_position'];
            $user_type = $r['user_type'] == '' ? 'N/A' : $r['user_type'];
            $user_division = $r['user_division'] == '' ? 'N/A' : $r['user_division'];
            $user_email1 = $r['user_email1'] == '' ? 'N/A' : '<a href="mailto:'.$r['user_email1'].'">'.$r['user_email1'].'</a>';
            $user_address1 = $r['user_address1'] == '' ? 'N/A' : '<a href="https://maps.google.com/maps?q='.$r['user_address1'].'">'.$r['user_address1'].'</a>';
            $user_firstname = $r['user_firstname'] == '' ? 'N/A' : $r['user_firstname'];
            $user_lastname = $r['user_lastname'] == '' ? 'N/A' : $r['user_lastname'];
            $r['is_ready'] != 1 ? $user_firstname .=  ' <i title="Employee is not ready to work." class="orange fas fa-exclamation-triangle"></i>' : '';
            echo "
            <div class='search-form_row-container'>
              <div class='col-xs-6 col-sm-6'>
                 <i class='fas fa-file-signature'>
                 <span class='results-text results-text--name'>$user_lastname $user_firstname</span>
                 </i>
              </div>
              <div class='col-xs-6 col-sm-6'>
               <i class='fas fa-phone'>
                <span class='results-text results-text--phone'>{$user_phn_1}</span>
               </i>
              </div>
              <div class='col-xs-6 col-sm-6'>
                <a href='/includes/sql/store/users/curr_user.php?id={$r['user_id']}&goto=/users/user_profile_main.php'>
                 <i class='fas fa-link'>
                 <span class='results-text results-text--edit'>View Profile</span>
                 </i>
                </a>
              </div>
              <div class='col-xs-6 col-sm-6'>
                 <i class='fas fa-suitcase-rolling'>
                 <span class='results-text results-text--position'>$user_position</span>
                 </i>
              </div>
              <div class='col-xs-6 col-sm-6'>
                 <i class='fas fa-map-marker-alt'>
                 <span class='results-text results-text--type'>$user_type</span>
                 </i>
              </div>
              <div class='col-xs-6 col-sm-6'>
                 <i class='fas fa-i-cursor'></i>
                 <span class='results-text results-text--division'>$user_division</span>
                 </i>
              </div>
          </div>
        ";
        }
    }

我拥有应有的功能,但我不禁注意到它的丑陋和低效程度令人难以置信。查看代码你会知道我没有使用原始查询,我使用的是https://github.com/ThingEngineer/PHP-MySQLi-Database-Class Mysqlidb。如果您想放弃以这种格式表达您的答案,那很好,这个库可以使用原始查询。任何帮助表示赞赏。我只是宁愿只检索包含所有参数的记录,而不是至少包含一个参数的记录,然后用 PHP 过滤掉它们。

编辑:我的意图是能够使用这个 SQL

4

1 回答 1

0

您需要运行一个为所有用户获取数据的查询。对于每个用户,您需要检查该用户的数据是否包含每个关键字。如果用户数据包含所有关键字,则该用户可以包含在搜索结果中。

所以你需要有嵌套循环。外循环检查每个用户。内部循环检查用户数据中的每个关键字。如果用户数据包含所有关键字,则将用户包括在搜索结果中。如果用户数据中不存在其中一个关键字,则中断内部循环并检查下一个用户。

于 2019-06-28T04:33:50.380 回答