From df29cd4e4c7b0b5b99fe01c296cdb40aa0d327e1 Mon Sep 17 00:00:00 2001 From: ghost Date: Sun, 27 Aug 2023 17:38:39 +0300 Subject: [PATCH] fix extended syntax request processing --- src/library/sphinx.php | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/library/sphinx.php b/src/library/sphinx.php index 2eff9aa..84ea6d9 100644 --- a/src/library/sphinx.php +++ b/src/library/sphinx.php @@ -4,28 +4,28 @@ class Sphinx { private $_sphinx; - public function __construct(string $host, int $port) { - + public function __construct(string $host, int $port) + { $this->_sphinx = new PDO('mysql:host=' . $host . ';port=' . $port . ';charset=utf8', false, false, [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8']); $this->_sphinx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->_sphinx->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); } - public function searchMagnetsTotal(string $keyword) { - + public function searchMagnetsTotal(string $keyword) : int + { $query = $this->_sphinx->prepare('SELECT COUNT(*) AS `total` FROM `magnet` WHERE MATCH(?)'); $query->execute( [ - $keyword + self::_match($keyword) ] ); return $query->fetch()->total; } - public function searchMagnets(string $keyword, int $start, int $limit, int $maxMatches) { - + public function searchMagnets(string $keyword, int $start, int $limit, int $maxMatches) + { $query = $this->_sphinx->prepare("SELECT * FROM `magnet` @@ -40,10 +40,34 @@ class Sphinx { $query->execute( [ - $keyword + self::_match($keyword) ] ); return $query->fetchAll(); } + + private static function _match(string $keyword) : string + { + $keyword = trim($keyword); + + if (empty($keyword)) + { + return $keyword; + } + + $keyword = str_replace(['"'], ' ', $keyword); + $keyword = preg_replace('/[\W]/ui', ' ', $keyword); + $keyword = preg_replace('/[\s]+/ui', ' ', $keyword); + $keyword = trim($keyword); + + $result = []; + + foreach ((array) explode(' ', $keyword) as $value) + { + $result[] = sprintf('@"*%s*"', $value); + } + + return implode(' | ', $result); + } }