50) throw new UnexpectedValueException(); // Initialize a DB connection an a query $pdo = new PDO('sqlite:stops/stops.db', NULL, NULL, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION )); $st = $pdo->prepare('SELECT DISTINCT id FROM stop_search WHERE word LIKE ? AND id LIKE \'t%\''); // Split stop name into words $words = split_stop_name($_GET['query']); // Find matching stops (their IDs) $ids = NULL; foreach($words as $word) { if(empty($word)) continue; // Find stop IDs with names matching the word $st->execute(array($word.'%')); $results = $st->fetchAll(PDO::FETCH_COLUMN); $st->closeCursor(); if(is_array($ids)) { // Merge results with list for previous words $ids = array_intersect($ids, $results); } else { // First search - initialize results list $ids = $results; } // No results will be found if(count($ids) == 0) break; } // Close a DB connection unset($st, $pdo); // No query was executed - return empty list if(!is_array($ids)) throw new UnexpectedValueException(); // Build a structure for the UI $stop_list = []; $query_lower = mb_strtolower($_GET['query'], 'UTF-8'); foreach($ids as $id) { $stop_list[] = [ 'id' => $id, 'name' => $stops[$id], 'type' => 'stop', 'relevance' => similar_text( $query_lower, mb_strtolower($stops[$id], 'UTF-8') ) ]; } // Sort stops by relevance usort($stop_list, function($a, $b) { $rel = $b['relevance'] - $a['relevance']; if($rel == 0) return strcasecmp($a['name'], $b['name']); return $rel; }); // Return JSON echo json_encode($stop_list); } catch(UnexpectedValueException $e) { echo '[]'; } catch(Exception $e) { header('HTTP/1.1 503 Service Unavailable'); echo $e->getMessage(); }