Разрешить пользователю искать два условия поиска в одном поле

Есть ли способ, которым я могу иметь одно поле ввода, называемое «местоположение», и позволить пользователю ввести почтовый индекс или название города, чтобы получить список предприятий? например. Bristol или BS6 6NX

Ниже приведена структура моей таблицы в настоящее время

Бизнес: (с данными примера)
id-1
имя-яблоки
местоположение-Bristol
почтовый индекс — bs5 6nx



Местоположение: (с данными примера)
id-1
имя-Bristol
почтовый индекс — bs5 6


Мой текущий запрос:

$query = "
            SELECT b.id, b.name, b.category, b.thumb_picture, b.location
            FROM business b 
            LEFT JOIN locations l ON b.location = l.name 
            WHERE l.name = ".$dbh->quote($userLocation)."
            OR l.postcode LIKE ".$dbh->quote($userLocation."%")."
            GROUP BY b.name
            ORDER BY b.date DESC";

Который будет работать только с названиями городов в настоящее время.

Обновить:

Как определить адрес или почтовый индекс в переменной

Кажется, решение, определить, если поле является почтовый индекс или город перед рукой, а затем, возможно, есть 2 запроса в зависимости от результата? Один для поиска столбца почтового индекса и один для поиска города?

2 ответа

  1. $query = "SELECT b.id, b.name, l.name, l.postcode
    FROM business b
    LEFT JOIN locations l ON l.name = b.location
    WHERE l.postcode LIKE '%" . $search_key . "%'
    OR l.name LIKE '%" . $search_key . "%'
    ORDER BY b.date DESC";
    
  2. Одно решение, которое я нашел с немного больше копать ниже. Сначала я определяю, был ли введен почтовый индекс или город. Затем выполните соответствующий запрос.

    function IsPostcode($postcode)
    {
        $postcode = strtoupper(str_replace(' ','',$postcode));
        if(preg_match("/(^[A-Z]{1,2}[0-9R][0-9A-Z]?[\s]?[0-9][ABD-HJLNP-UW-Z]{2}$)/i",$postcode) || preg_match("/(^[A-Z]{1,2}[0-9R][0-9A-Z]$)/i",$postcode))
        {    
            return true;
        }
        else
        {
            return false;
        }
    }
    
    $ul = "ze3 9";
    if (IsPostcode($ul)) {
        $where = "
        LEFT JOIN locations l ON l.name = b.location
        WHERE l.postcode LIKE ".$dbh->quote($ul.'%')."";
    
    }
    else {
        $where = "
        LEFT JOIN locations l ON l.name = b.location
        WHERE l.name LIKE ".$dbh->quote($ul.'%')."";
    }
    
    $query =    "SELECT b.id, b.name, l.name, l.postcode
                FROM business b
                ".$where."
                ORDER BY b.date DESC";
    

    Кто — нибудь видит в этом ошибку?