PHP通过单独的表单字段

时间:2015-07-06 15:57:43

标签: php mysql search foreach explode

所以我有一个问题,一个非常基本但看起来很棒的人!我已经用PHP开发多年了,而且似乎在知识上的进步很慢。

我正在建立一个工作网站,我在查询空缺查询时遇到了麻烦..

我的表格就像这样......

<form class="form-search-list" action="search" method="get">
            <div class="row">
              <div class="col-sm-5 col-xs-6">
                <div class="form-group">
                  <label class="color-white">What</label>
                  <input type="hidden" name="type" value="basic">
                  <input class="form-control" name="keywords" style="text-transform: capitalize;">
                </div>
              </div>
              <div class="col-sm-5 col-xs-6">
                <div class="form-group">
                  <label class="color-white">Where</label>
                  <input class="form-control" name="location" style="text-transform: capitalize;">
                </div>
              </div>
              <div class="col-sm-2 col-xs-12">
                <div class="form-group">
                  <label class="hidden-xs">&nbsp;</label>
                  <button class="btn btn-block btn-theme  btn-success">Search</button>

                </div>
              </div>
            </div>
            <p class="text-right"><a href="#modal-advanced" data-toggle="modal" class="link-white">Advanced Search</a></p>
          </form>

正如您所看到的,我正在使用$_GET['']从我选择的数据库表中获取数据,在本例中为vacancies

所以到search.php

    if(!isset($_GET['type'])){
    header("Location: jobsearch");
}

if($_GET['type']=='basic'){

        $keywords = $_GET['keywords'];
        $location = $_GET['location'];

$query = mysql_query("SELECT * FROM vacancies WHERE UNIX_TIMESTAMP() < `expires` AND jobtitle LIKE '%" .$keywords. "%' AND location LIKE '%" .$location. "%' AND active='1' ORDER BY id DESC");
$suffix = "SELECT COUNT(id) FROM vacancies WHERE UNIX_TIMESTAMP() < `expires` AND jobtitle LIKE '%" .$keywords. "%' AND location LIKE '%" .$location. "%' AND active='1'";  
$result = mysql_query($suffix) or die(mysql_error()); 
foreach(mysql_fetch_array($result) as $totjobs);
$suffixFT = ($totjobs != 1) ? 's' : '';

if(mysql_num_rows($query) == 0){
     $resultsterm = "Sorry, we couldn't find any job listings based on your search!"; 
    } else {
        if($_GET['keywords'] == "" AND $_GET['location'] == ""){
            $resultsterm = "We found <strong>" . mysql_num_rows($query) . "</strong> job listing" . $suffixFT . " throughout the UK.";
        } else {
            if($_GET['keywords'] == TRUE AND $_GET['location'] == ""){
                $resultsterm = "We found <strong>" . mysql_num_rows($query) . "</strong> job listing" . $suffixFT . " for <strong>$keywords</strong> throughout the UK.";
            } else {
                if($_GET['keywords'] == "" AND $_GET['location'] == TRUE){
                    $resultsterm = "We found <strong>" . mysql_num_rows($query) . "</strong> job listing" . $suffixFT . " in <strong>$location</strong>.";
                } else {
                    if($_GET['keywords'] == TRUE AND $_GET['location'] == TRUE){
                        $resulsterm = "We found <strong>" . mysql_num_rows($query) . "</strong> job listing" . $suffixFT . " for <strong>$keywords</strong> in <strong>$location</strong.";
                    }
                }
            }
        }
    }



}

我的数据库设置为(jobtitlelocation)我需要能够使用explode函数将我的搜索与这两个字段进行比较,以搜索多个短语。

例如,我在我的表格中存在一个名为“测试空缺&#39;当我搜索&#39; 测试&#39;或者&#39; 空缺&#39;它将计数显示为一个,这意味着它已经找到了结果,但是如果我搜索“测试工作”。它不会显示结果!

这让我很困惑。我花了8个小时试图弄清楚这一个,我无法理解它!

我试图弄清楚如何使用爆炸函数$keywords$location我知道如何使用爆炸函数并将其放入foreach循环中变量但是还没有找到尝试使用这两个变量的起点。

如果你们中的一个可爱的人会非常友好地帮助我,那么我就会知道该怎么做,我将不胜感激。

更新

我构建了以下代码块,这种代码块有用......

$keywords = $_GET['keywords'];
$jobkeywords = explode(' ',$keywords);

$location = $_GET['location'];
$lockeywords = explode(' ',$location);

$searchColumns1 = array("jobtitle");
$searchCondition1 = '';
$searchColumns2 = array("location");
$searchCondition2 = '';
  for($i = 0; $i < count($searchColumns1); $i++)
    {
        $searchFieldName1 = $searchColumns1[$i];
        $searchCondition1 .= "$searchFieldName1 LIKE '%" . implode("%' OR $searchFieldName1 LIKE '%", $jobkeywords) . "%'";
        if($i+1 < count($searchColumns1)) $searchCondition1 .= " OR ";
     }
    for($i = 0; $i < count($searchColumns2); $i++)
    {
        $searchFieldName2 = $searchColumns2[$i];
        $searchCondition2 .= "$searchFieldName2 LIKE '%" . implode("%' OR $searchFieldName2 LIKE '%", $lockeywords) . "%'";
        if($i+1 < count($searchColumns2)) $searchCondition2 .= " OR ";
     }

$query = mysql_query("SELECT * FROM vacancies WHERE $searchCondition1 AND $searchCondition2");
$suffix = "SELECT COUNT(id) FROM vacancies WHERE $searchCondition1 AND $searchCondition2";  

然而,在检查和从表中获取方面它不是很严格。 我,e ..如果我有一份工作,例如名称&#39; Test Vacancy&#39;它的位置是&#39;伦敦,英国&#39;但我寻找其他工作&#39; in&#39;伦敦,英国&#39;它仍然显示出一个结果,即测试空缺&#39;因为那位于伦敦!我不希望它这样做,相反,如果一个职位名称不匹配,那么它将显示“没有找到结果&#39;它就好像它自己使用位置字段而不是关键字和位置一起工作来检查是否匹配。

有什么想法吗?

进一步更新

感谢您输入和帮助LinesofCode,感谢您帮助我分配的努力!

让我们看看我是否可以更清楚地了解我想要实现的目标,我之前的问题在阅读之后似乎有点含糊不清。

我的表单上有两个字段,第一个是关键字..第二个是位置.. 所以用户可以输入“测试职位空缺”。在关键字框中,然后在他们想要的位置。在我的空缺数据库表中它包括表格中的关键字与之比较的作业标题,然后是我在其中的测试空缺的位置字段,如下所示jobtitle =&#39;测试空置率&#39; location =&#39; Southport Merseyside英国&#39;理想情况下,我想要做的是使用工作标题的爆炸功能(表单上的关键字)来匹配“测试”和“测试”。或者&#39;空缺&#39;同样位于英国Southport Merseyside的工作,现在用户可以输入他们喜欢的任何地方..我无法控制,他们可以搜索“测试工作”#39 ; in&#39; Southport United Kingdom&#39;所以我需要脚本才能获得“测试空缺”。通过使用爆炸功能来匹配单词&#39;测试&#39;但同时对搜索位置要求非常严格。我从经验中知道,在关键字和位置上使用爆炸功能会导致分配不需要的数据,用户可以搜索“管理员”。在伦敦&#39;而不只是显示伦敦的管理职位,它将显示在伦敦的所有列表。

这是一个我需要写的相当混乱和复杂的脚本,我只是不知道从哪里开始!

进一步更新

@Linesofcode这个块似乎实现了我想要的东西,但是有一个小问题..请看块然后我会解释问题

$keywords = explode(" ", $_GET['keywords']);
$location = explode(" ", $_GET['location']);

if (!empty($keywords) && count($keywords) > 0) {

    $query = "SELECT COUNT(id) FROM vacancies WHERE";

foreach($keywords as $keyword) {
    $keyword = mysql_real_escape_string($keyword);
    $query .= " jobtitle LIKE '%{$keyword}%' OR";
}

foreach($location as $loc) {
    $loc = mysql_real_escape_string($loc);
    $query .= " location LIKE '%{$loc}%' OR";
}

$query = rtrim($query, 'OR');

    }

$result = mysql_query($query) or die(mysql_error());
foreach (mysql_fetch_array($result) as $totrows);

echo $query;

此块将输出

SELECT COUNT(`id`) FROM vacancies WHERE jobtitle LIKE '%test%' OR jobtitle LIKE '%vacancy%' **OR** location LIKE '%southport%' OR location LIKE '%pr9%' OR location LIKE '%0tl%'

正如你在sql输出中看到的那样,我做了一个粗体的OR语句,需要将其改为AND看起来像这样

SELECT COUNT(`id`) FROM vacancies WHERE jobtitle LIKE '%test%' OR jobtitle LIKE '%vacancy%' **AND** location LIKE '%southport%' **OR** location LIKE '%pr9%' OR location LIKE '%0tl%'

是否可以使用我构建的块?

进一步更新

所以构造的块类工作..

$keywords = explode(" ", $_GET['keywords']); $location = explode(" ", $_GET['location']);

if (!empty($keywords)) {        $query = "SELECT * FROM vacancies WHERE";

foreach($keywords as $keyword) {
    $keyword = mysql_real_escape_string($keyword);
    $query .= " jobtitle LIKE '%{$keyword}%' OR"; }

$query = preg_replace('/OR$/', 'AND', $query);

foreach($location as $loc) {
    $loc = mysql_real_escape_string($loc);
    $query .= " location LIKE '%{$loc}%' OR"; }

$query = rtrim($query, 'OR');

echo $query;

echo "<p></p>";

$result = mysql_query($query) or die(mysql_error()); while ($row = mysql_fetch_assoc($result)){     echo "" . $row['jobtitle'] . ""; }

    }

然而,当我认为我的foreach循环混淆了我的while循环以显示数据库的结果时..

我正在寻找测试空缺&#39;在伦敦&#39; (我的数据库中的实际位置是&#39; Southport&#39;但是当我搜索伦敦的“测试”时,它仍然会显示,但它没有显示它应该做什么,它看起来像虽然当输入两个关键字时它正在播放,但是当只输入一个关键字时它正常工作..任何想法?该代码看起来没问题吗?

2 个答案:

答案 0 :(得分:0)

LIKE '%Test Job%'Test Job作为单个实心字符串进行处理。 MySQL不会无意识地考虑每个单词。如果您需要考虑个人工作,那么您必须将条件写为

(foo LIKE '%Test%') OR (foo LIKE '%Job%')

请注意,%...%匹配效率非常低,并且不能使用任何索引。如果您确实想要使用搜索词组找到单个词,请考虑使用FULLTEXT搜索。

答案 1 :(得分:0)

首先,locations我认为是一个固定值,如果是这样,它会更容易。请注意,这只是一个算法示例。

$keywords        = 'Test Vacancy';
$locations       = 'London, Manchester, Liverpool';

$listOfKeywords  = explode(' ', $keywords);
$listOfResults   = array();

foreach($listOfKeywords as $keyword)
{
   /*
    * This should reproduce something like:
    *  
    * SELECT * FROM vacancies WHERE jobtitle LIKE %Test% AND location IN(London, Manchester, Liverpool)
    * SELECT * FROM vacancies WHERE jobtitle LIKE %Vacancy% AND location IN(London, Manchester, Liverpool)
    *
    */
   $strQuery = "SELECT * FROM vacancies WHERE jobtitle LIKE '%" . $keyword . "' AND location IN(" . $locations . ")";

   $query    = mysqli_query($yourConnection, $strQuery);

   while($row = mysqli_fetch_array($query))
   {
      $listOfResults[] = array('id'        => $row['id'], 
                               'jobtitle'  => $row['jobtitle']);
   }
}

if(count($listOfResults) == 0)
   echo 'Nothing found..'
else
   echo 'We found ' . count($listOfResults) . ' results';