/**
  * create a more complex search object
  */
 function buildAdvancedQuery(&$dataarray, $autoredirect = 'auto')
 {
     global $CONF, $imagestatuses, $breakdowns, $sortorders, $USER;
     $dataarray = array_map("strip_tags", $dataarray);
     if (empty($dataarray['distance'])) {
         $dataarray['distance'] = $CONF['default_search_distance'];
     }
     $nearstring = $this->getNearString($dataarray['distance']);
     $searchdesc = '';
     if (!empty($dataarray['placename']) && $dataarray['placename'] != '(anywhere)') {
         //check if we actully want to perform a textsearch (it comes through in the placename beucase of the way the multiple mathc page works)
         if (strpos($dataarray['placename'], 'text:') === 0) {
             $dataarray['searchtext'] = preg_replace("/^text\\:/", '', $dataarray['placename']);
             unset($dataarray['placename']);
             unset($dataarray['location']);
         }
         //check if we actully want to perform a user_search
         if (strpos($dataarray['placename'], 'user:'******'user_id'] = preg_replace("/^user\\:/", '', $dataarray['placename']);
             unset($dataarray['placename']);
             if ($dataarray['old-placename'] == $dataarray['q']) {
                 unset($dataarray['q']);
             }
         }
     }
     if (!empty($dataarray['location']) && $dataarray['location'] != '(anywhere)' && empty($dataarray['placename']) && empty($dataarray['gridref']) && empty($dataarray['postcode'])) {
         $dataarray['placename'] = $dataarray['location'];
     }
     if (!empty($dataarray['q'])) {
         //we coming from multiple - which means there might be a text search stored in a q
         list($q, $placename) = preg_split('/\\s+near\\s+/', $dataarray['q']);
         if (!empty($dataarray['location'])) {
             $dataarray['searchtext'] = $q;
             if (empty($dataarray['placename'])) {
                 $dataarray['placename'] = $dataarray['location'];
             }
         } elseif ($placename && (empty($dataarray['searchtext']) || $dataarray['searchtext'] == $q)) {
             $dataarray['searchtext'] = $q;
             if (empty($dataarray['placename'])) {
                 $dataarray['placename'] = $placename;
             }
         }
     }
     if (!empty($dataarray['placename'])) {
         if (preg_match("/\\b([A-Z]{1,2})([0-9]{1,2}[A-Z]?) *([0-9]?)([A-Z]{0,2})\\b/i", $dataarray['placename'], $pc) && !in_array($pc[1], array('SV', 'SX', 'SZ', 'TV', 'SU', 'TL', 'TM', 'SH', 'SJ', 'TG', 'SC', 'SD', 'NX', 'NY', 'NZ', 'OV', 'NS', 'NT', 'NU', 'NL', 'NM', 'NO', 'NF', 'NH', 'NJ', 'NK', 'NA', 'NB', 'NC', 'ND', 'HW', 'HY', 'HZ', 'HT', 'Q', 'D', 'C', 'J', 'H', 'F', 'O', 'T', 'R', 'X', 'V'))) {
             $dataarray['postcode'] = $dataarray['placename'];
             unset($dataarray['placename']);
         } elseif (preg_match("/\\b([a-zA-Z]{1,3}) ?(\\d{1,5})[ \\.]?(\\d{1,5})\\b/", $dataarray['placename'], $gr)) {
             $dataarray['gridref'] = $dataarray['placename'];
             unset($dataarray['placename']);
         } elseif ($dataarray['placename'] == '(anywhere)') {
             unset($dataarray['placename']);
         }
     }
     if (!empty($dataarray['postcode'])) {
         if (preg_match("/^\\s*([A-Z]{1,2})([0-9]{1,2}[A-Z]?)\\s*([0-9]?)([A-Z]{0,2})\\s*\$/", strtoupper($dataarray['postcode']), $pc)) {
             require_once 'geograph/searchcriteria.class.php';
             $searchq = $pc[1] . $pc[2] . ($pc[3] ? " " . $pc[3] : '');
             $criteria = new SearchCriteria_Postcode();
             $criteria->setByPostcode($searchq);
             if ($criteria->y != 0) {
                 $searchclass = 'Postcode';
                 $searchdesc = ", {$nearstring} postcode " . $searchq;
                 $searchx = $criteria->x;
                 $searchy = $criteria->y;
             } else {
                 $this->errormsg = "Invalid Postcode or a newer Postcode not in our database, please try a different search method";
                 if ($pc[3]) {
                     $this->errormsg .= ", or use just the outcode [ {$pc[1]}{$pc[2]} ]";
                 }
             }
         } else {
             $this->errormsg = "Does not appear to be a valid Postcode";
         }
     } else {
         if (!empty($dataarray['gridref'])) {
             if (preg_match("/\\b([a-zA-Z]{1,3}) ?(\\d{1,5})[ \\.]?(\\d{1,5})\\b/", $dataarray['gridref'], $gr)) {
                 require_once 'geograph/gridsquare.class.php';
                 $square = new GridSquare();
                 $grid_ok = $square->setByFullGridRef($dataarray['gridref'], false, true);
                 if ($grid_ok || $square->x && $square->y) {
                     $searchclass = 'GridRef';
                     $searchq = $dataarray['gridref'];
                     $searchdesc = ", {$nearstring} grid reference " . $square->grid_reference;
                     $searchx = $square->x;
                     $searchy = $square->y;
                 } else {
                     $this->errormsg = $square->errormsg;
                 }
             } else {
                 $this->errormsg = "Does not appear to be a valid Grid Reference";
             }
         } else {
             if (!empty($dataarray['county_id'])) {
                 require_once 'geograph/searchcriteria.class.php';
                 $criteria = new SearchCriteria_County();
                 $criteria->setByCounty($dataarray['county_id']);
                 if (!empty($criteria->county_name)) {
                     $searchclass = 'County';
                     $searchq = $dataarray['county_id'];
                     $searchdesc = ", {$nearstring} center of " . $criteria->county_name;
                     $searchx = $criteria->x;
                     $searchy = $criteria->y;
                 } else {
                     $this->errormsg = "Invalid County????";
                 }
             } else {
                 if (!empty($dataarray['placename'])) {
                     $dataarray['placename'] = trim($dataarray['placename']);
                     require_once 'geograph/searchcriteria.class.php';
                     $criteria = new SearchCriteria_Placename();
                     $criteria->setByPlacename($dataarray['placename']);
                     if (!empty($criteria->placename)) {
                         $searchclass = 'Placename';
                         $searchq = $criteria->placename;
                         $searchdesc = ", {$nearstring} " . $criteria->placename;
                         $searchx = $criteria->x;
                         $searchy = $criteria->y;
                     } else {
                         if ($criteria->is_multiple) {
                             $searchdesc = ", {$nearstring} '" . $dataarray['placename'] . "'";
                         } else {
                             $this->errormsg = "Place not found, you might like to try a placename search";
                         }
                     }
                 } else {
                     if (!empty($dataarray['description']) && !empty($dataarray['searchq'])) {
                         if (!$dataarray['adminoverride']) {
                             $USER->mustHavePerm("admin");
                         }
                         $dataarray['description'] = trim($dataarray['description']);
                         $dataarray['searchq'] = trim($dataarray['searchq']);
                         $searchclass = 'Special';
                         if (!empty($dataarray['searchclass'])) {
                             $searchclass = $dataarray['searchclass'];
                         }
                         $searchq = $dataarray['searchq'];
                         if (preg_match("/;|update |delete |drop |replace |alter |password|email/i", $searchq)) {
                             die("Server Error");
                         }
                         $searchdesc = ", " . $dataarray['description'];
                         if (!empty($dataarray['x']) && !empty($dataarray['y'])) {
                             $searchx = $dataarray['x'];
                             $searchy = $dataarray['y'];
                         }
                     } else {
                         if (!empty($dataarray['all_ind'])) {
                             $searchclass = 'All';
                             $searchq = '';
                         } else {
                             $searchclass = 'All';
                             $searchq = '';
                         }
                     }
                 }
             }
         }
     }
     if (!empty($dataarray['searchtext'])) {
         $dataarray['searchtext'] = trim($dataarray['searchtext']);
         if (!empty($dataarray['ind_exact']) || preg_match('/^=/', $dataarray['searchtext'])) {
             if (preg_match('/^=?~/', $dataarray['searchtext'])) {
                 $searchdesc = ", exactly matching any of [" . preg_replace('/^=?~/', '', $dataarray['searchtext']) . "] " . $searchdesc;
             } else {
                 $searchdesc = ", exactly matching [" . preg_replace('/^=/', '', $dataarray['searchtext']) . "] " . $searchdesc;
             }
         } elseif (preg_match('/^~/', $dataarray['searchtext'])) {
             $searchdesc = ", matching any of [" . preg_replace('/^~/', '', $dataarray['searchtext']) . "] " . $searchdesc;
         } elseif (preg_match('/[~\\+\\^\\$:@ -]+/', $dataarray['searchtext'])) {
             $searchdesc = ", matching [" . $dataarray['searchtext'] . "] " . $searchdesc;
         } elseif (preg_match('/^".*"$/', $dataarray['searchtext'])) {
             $searchdesc = ", matching [\"" . $dataarray['searchtext'] . "\"] " . $searchdesc;
         } elseif (preg_match('/\\+$/', $dataarray['searchtext'])) {
             $searchdesc = ", all about [" . preg_replace('/\\+$/', '', $dataarray['searchtext']) . "] " . $searchdesc;
         } elseif (preg_match('/^\\^/', $dataarray['searchtext'])) {
             $searchdesc = ", matching whole word [" . str_replace('^', '', $dataarray['searchtext']) . "] " . $searchdesc;
         } else {
             $searchdesc = ", containing [" . $dataarray['searchtext'] . "] " . $searchdesc;
         }
     }
     if (!empty($dataarray['ind_exact'])) {
         $dataarray['searchtext'] = "=" . $dataarray['searchtext'];
     }
     if (isset($searchclass)) {
         $db = NewADOConnection($GLOBALS['DSN']);
         if (empty($db)) {
             die('Database connection failed');
         }
         $sql = "INSERT INTO queries SET searchclass = '{$searchclass}'," . "searchuse = " . $db->Quote($this->searchuse) . "," . "searchq = " . $db->Quote($searchq);
         if (isset($dataarray['searchtext'])) {
             $sql .= ",searchtext = " . $db->Quote($dataarray['searchtext']);
         }
         if (isset($dataarray['displayclass'])) {
             $sql .= ",displayclass = " . $db->Quote($dataarray['displayclass']);
         }
         if (isset($dataarray['resultsperpage'])) {
             $sql .= ",resultsperpage = " . $db->Quote(min(100, $dataarray['resultsperpage']));
         } elseif (isset($USER) && !empty($USER->search_results)) {
             $sql .= ",resultsperpage = " . $db->Quote($USER->search_results);
         }
         if (isset($searchx) && !empty($searchx) && !empty($searchy)) {
             $sql .= ",x = {$searchx},y = {$searchy}";
         }
         if (isset($USER) && $USER->registered) {
             $sql .= ",user_id = {$USER->user_id}";
         }
         if (!empty($dataarray['user_name'])) {
             $usercriteria = new SearchCriteria_All();
             $usercriteria->setByUsername($dataarray['user_name']);
             if (!empty($usercriteria->realname)) {
                 $sql .= ",limit1 = " . $db->Quote((!empty($dataarray['user_invert_ind']) ? '!' : '') . $usercriteria->user_id);
                 $searchdesc .= "," . (!empty($dataarray['user_invert_ind']) ? ' not' : '') . " by " . $usercriteria->realname;
                 $dataarray['user_id'] = $usercriteria->user_id;
             }
         } elseif (!empty($dataarray['user_id'])) {
             $sql .= ",limit1 = " . $db->Quote((!empty($dataarray['user_invert_ind']) ? '!' : '') . $dataarray['user_id']);
             $profile = new GeographUser($dataarray['user_id']);
             $searchdesc .= "," . (!empty($dataarray['user_invert_ind']) ? ' not' : '') . " by " . $profile->realname;
         }
         if (!empty($dataarray['moderation_status'])) {
             $sql .= ",limit2 = " . $db->Quote($dataarray['moderation_status']);
             $searchdesc .= ", showing " . $imagestatuses[$dataarray['moderation_status']] . " images";
         }
         if (!empty($dataarray['imageclass'])) {
             if ($dataarray['imageclass'] == '-') {
                 $sql .= ",limit3 = '-'";
                 $searchdesc .= ", unclassifed";
             } else {
                 $sql .= ",limit3 = " . $db->Quote($dataarray['imageclass']);
                 $searchdesc .= ", classifed as " . $dataarray['imageclass'];
             }
         }
         if (!empty($dataarray['reference_index'])) {
             $sql .= ",limit4 = " . $db->Quote($dataarray['reference_index']);
             $searchdesc .= ", in " . $CONF['references'][$dataarray['reference_index']];
         }
         if (!empty($dataarray['gridsquare'])) {
             $sql .= ",limit5 = " . $db->Quote($dataarray['gridsquare']);
             $searchdesc .= ", in " . $dataarray['gridsquare'];
         }
         $this->builddate($dataarray, "submitted_start");
         $this->builddate($dataarray, "submitted_end");
         if (!empty($dataarray['submitted_start']) || !empty($dataarray['submitted_end'])) {
             if (!empty($dataarray['submitted_start'])) {
                 if (preg_match("/0{4}-([01]?[1-9]+|10)-/", $dataarray['submitted_start']) > 0) {
                     //month only
                     $searchdesc .= ", submitted during " . $dataarray['submitted_startString'];
                     $dataarray['submitted_end'] = "";
                 } elseif (preg_match("/0{4}-0{2}-([0-3]?[1-9]+|10|20|30)/", $dataarray['submitted_start']) > 0) {
                     //day only
                     $searchdesc .= ", submitted in the last " . $dataarray['submitted_startDay'] . " days";
                     $dataarray['submitted_end'] = "";
                 } elseif (!empty($dataarray['submitted_end'])) {
                     if ($dataarray['submitted_end'] == $dataarray['submitted_start']) {
                         //both the same
                         $searchdesc .= ", submitted " . (is_numeric($dataarray['submitted_startString']) ? 'in ' : '') . $dataarray['submitted_startString'];
                     } else {
                         //between
                         //if the start date is later than the end then lets swap them!
                         $startdate = vsprintf("%04d%02%02", explode('-', $dataarray['submitted_start']));
                         $enddate = vsprintf("%04d%02%02", explode('-', $dataarray['submitted_end']));
                         if ($startdate > $enddate) {
                             $temp = $dataarray['submitted_startString'];
                             $dataarray['submitted_startString'] = $dataarray['submitted_endString'];
                             $dataarray['submitted_endString'] = $temp;
                             $temp = $dataarray['submitted_start'];
                             $dataarray['submitted_start'] = $dataarray['submitted_end'];
                             $dataarray['submitted_end'] = $temp;
                         }
                         $searchdesc .= ", submitted between " . $dataarray['submitted_startString'] . " and " . $dataarray['submitted_endString'] . " ";
                     }
                 } else {
                     //from
                     $searchdesc .= ", submitted after " . $dataarray['submitted_startString'];
                 }
             } else {
                 //to
                 $searchdesc .= ", submitted before " . $dataarray['submitted_endString'];
             }
             $sql .= ",limit6 = '{$dataarray['submitted_start']}^{$dataarray['submitted_end']}'";
         }
         $this->builddate($dataarray, "taken_start");
         $this->builddate($dataarray, "taken_end");
         if (!empty($dataarray['taken_start']) || !empty($dataarray['taken_end'])) {
             if (!empty($dataarray['taken_start'])) {
                 if (preg_match("/0{4}-([01]?[1-9]+|10)-/", $dataarray['taken_start']) > 0) {
                     //month only
                     $searchdesc .= ", taken during " . $dataarray['taken_startString'];
                     $dataarray['taken_end'] = "";
                 } elseif (preg_match("/0{4}-0{2}-([0-3]?[1-9]+|10|20|30)/", $dataarray['taken_start']) > 0) {
                     //day only
                     $searchdesc .= ", taken in the last " . $dataarray['taken_startDay'] . " days";
                     $dataarray['submitted_end'] = "";
                 } elseif (!empty($dataarray['taken_end'])) {
                     if ($dataarray['taken_end'] == $dataarray['taken_start']) {
                         //both the same
                         $searchdesc .= ", taken " . (is_numeric($dataarray['taken_startString']) ? 'in ' : '') . $dataarray['taken_startString'];
                     } else {
                         //between
                         //if the start date is later than the end then lets swap them!
                         $startdate = vsprintf("%04d%02%02", explode('-', $dataarray['taken_start']));
                         $enddate = vsprintf("%04d%02%02", explode('-', $dataarray['taken_end']));
                         if ($startdate > $enddate) {
                             $temp = $dataarray['taken_startString'];
                             $dataarray['taken_startString'] = $dataarray['taken_endString'];
                             $dataarray['taken_endString'] = $temp;
                             $temp = $dataarray['taken_start'];
                             $dataarray['taken_start'] = $dataarray['taken_end'];
                             $dataarray['taken_end'] = $temp;
                         }
                         $searchdesc .= ", taken between " . $dataarray['taken_startString'] . " and " . $dataarray['taken_endString'] . " ";
                     }
                 } else {
                     //from
                     $searchdesc .= ", taken after " . $dataarray['taken_startString'];
                 }
             } else {
                 //to
                 $searchdesc .= ", taken before " . $dataarray['taken_endString'];
             }
             $sql .= ",limit7 = '{$dataarray['taken_start']}^{$dataarray['taken_end']}'";
         } else {
             $this->builddate($dataarray, "taken");
             if (!empty($dataarray['taken'])) {
                 $dataarray['taken_start'] = $dataarray['taken'];
                 $dataarray['taken_end'] = $dataarray['taken'];
                 $searchdesc .= ", taken " . (is_numeric($dataarray['takenString']) ? 'in ' : '') . $dataarray['takenString'];
                 $sql .= ",limit7 = '{$dataarray['taken_start']}^{$dataarray['taken_end']}'";
                 unset($dataarray['taken']);
             }
         }
         if (!empty($dataarray['distance']) && isset($searchx) && $searchx > 0 && $searchy > 0) {
             $sql .= sprintf(",limit8 = %d", $dataarray['distance']);
         }
         if (!empty($dataarray['topic_id'])) {
             $sql .= ",limit9 = " . $dataarray['topic_id'];
             if ($dataarray['topic_id'] > 1) {
                 $topic_name = $db->getOne("SELECT topic_title FROM geobb_topics WHERE topic_id = " . $dataarray['topic_id']);
                 $searchdesc .= ", in topic " . $topic_name;
             } else {
                 $searchdesc .= ", in any topic";
             }
         }
         if (!empty($dataarray['route_id'])) {
             $sql .= ",limit10 = " . $dataarray['route_id'];
             $topic_name = $db->getOne("SELECT name FROM route WHERE route_id = " . $dataarray['route_id']);
             $searchdesc .= ", on route " . $topic_name;
         }
         if (!isset($dataarray['orderby'])) {
             $dataarray['orderby'] = '';
         }
         switch ($dataarray['orderby']) {
             case "":
                 if ($searchclass == 'All') {
                     $searchdesc .= ", in undefined order";
                 }
                 break;
             case "random":
                 $sql .= ",orderby = " . $db->Quote($dataarray['orderby']);
                 $searchdesc .= ", in Random order";
                 break;
             case "dist_sqd":
                 break;
             default:
                 $orderby = $dataarray['orderby'];
                 if ($dataarray['reverse_order_ind']) {
                     $orderby = preg_replace('/(,|$)/', ' desc$1', $orderby);
                     if (strpos($sortorders[$dataarray['orderby']], '-') > 1) {
                         $searchdesc .= ", in " . implode('->', array_reverse(explode('->', $sortorders[$dataarray['orderby']]))) . " order";
                     } else {
                         $searchdesc .= ", in reverse " . $sortorders[$dataarray['orderby']] . " order";
                     }
                 } else {
                     $searchdesc .= ", in " . $sortorders[$dataarray['orderby']] . " order";
                 }
                 $sql .= ",orderby = " . $db->Quote($orderby);
         }
         if (!empty($dataarray['breakby'])) {
             $sql .= ",breakby = " . $db->Quote($dataarray['breakby']);
             if (!empty($breakdowns[$dataarray['breakby']])) {
                 $searchdesc .= ", by " . $breakdowns[$dataarray['breakby']];
             }
         }
         $sql .= ",searchdesc = " . $db->Quote($searchdesc);
         $db->Execute($sql);
         $i = $db->Insert_ID();
         if ($autoredirect != false) {
             $extra = '';
             if (isset($_GET['page'])) {
                 $extra = "&page=" . intval($_GET['page']);
             }
             if ($dataarray['submit'] == 'Count') {
                 $extra .= '&count=1';
             }
             if (!empty($_GET['BBOX'])) {
                 $extra .= "&BBOX=" . $_GET['BBOX'];
             }
             header("Location:http://{$_SERVER['HTTP_HOST']}/{$this->page}?i={$i}{$extra}");
             $extra = str_replace('&', '&', $extra);
             print "<a href=\"http://{$_SERVER['HTTP_HOST']}/{$this->page}?i={$i}{$extra}\">Your Search Results</a>";
             exit;
         } else {
             return $i;
         }
     } else {
         if (isset($criteria) && isset($criteria->is_multiple)) {
             if (!empty($dataarray['user_id'])) {
                 $profile = new GeographUser($dataarray['user_id']);
                 $searchdesc .= "," . ($dataarray['user_invert_ind'] ? ' not' : '') . " by " . $profile->realname;
             }
             if (!empty($dataarray['moderation_status'])) {
                 $searchdesc .= ", showing " . $imagestatuses[$dataarray['moderation_status']] . " images";
             }
             if (!empty($dataarray['imageclass'])) {
                 $searchdesc .= ", classifed as " . $dataarray['imageclass'];
             }
             if (!empty($dataarray['reference_index'])) {
                 $searchdesc .= ", in " . $CONF['references'][$dataarray['reference_index']];
             }
             if (!empty($dataarray['gridsquare'])) {
                 $searchdesc .= ", in " . $dataarray['gridsquare'];
             }
             if (!empty($dataarray['breakby'])) {
                 $searchdesc .= ", group by " . $breakdowns[$dataarray['breakby']];
             }
             if (!empty($dataarray['orderby'])) {
                 switch ($dataarray['orderby']) {
                     case "":
                         break;
                     case "random":
                         $searchdesc .= ", in Random order";
                         break;
                     case "dist_sqd":
                         break;
                     default:
                         $searchdesc .= ", in " . ($dataarray['reverse_order_ind'] ? 'reverse ' : '') . $sortorders[$dataarray['orderby']] . " order";
                 }
             }
             $this->searchdesc = $searchdesc;
             $this->criteria = $criteria;
         }
     }
 }
Ejemplo n.º 2
0
 $engine->buildSimpleQuery($q, $CONF['default_search_distance'], isset($_GET['form']) && $_GET['form'] == 'simple' ? 'simple' : 'auto', !empty($_GET['user_id']) ? intval($_GET['user_id']) : 0);
 if (isset($engine->criteria) && $engine->criteria->is_multiple) {
     if (empty($_GET['distance'])) {
         $_GET['distance'] = $CONF['default_search_distance'];
     }
     //todo these shouldnt be hardcoded as there other possiblities for suggestions
     $smarty->assign('multipletitle', "Placename");
     $smarty->assign('multipleon', "placename");
     if (!empty($engine->criteria->realname)) {
         $smarty->assign('pos_realname', $engine->criteria->realname);
         $smarty->assign('pos_user_id', $engine->criteria->user_id);
         if (!empty($engine->criteria->nickname)) {
             $smarty->assign('pos_nickname', $engine->criteria->nickname);
         }
     } else {
         $usercriteria = new SearchCriteria_All();
         $usercriteria->setByUsername($q);
         if (!empty($usercriteria->realname)) {
             //could also be a username
             $smarty->assign('pos_realname', $usercriteria->realname);
             $smarty->assign('pos_user_id', $usercriteria->user_id);
             if (!empty($usercriteria->nickname)) {
                 $smarty->assign('pos_nickname', $usercriteria->nickname);
             }
         }
     }
     $smarty->assign_by_ref('criteria', $engine->criteria);
     $smarty->assign_by_ref('post', $_GET);
     $smarty->assign_by_ref('references', $CONF['references']);
     $smarty->assign('searchdesc', $engine->searchdesc);
     $smarty->display('search_multiple.tpl');