Как выбрать несколько полей на основе поиска GET?

Я создаю поисковый сайт, на котором пользователь может выполнять поиск по названию компании или по строкам таблицы cat1, cat2, cat3. Строки "cat" находятся в той же таблице, что и название компании. Я настроил его, поэтому я возвращаю информацию о бизнесе, если я ищу правильный бизнес. Но мне нужно, чтобы он показывал компании, у которых есть название категории, которое вы искали.

** В основном я прошу получить поиск (php) либо для поиска по названию бизнеса, либо по одной из трех категорий.

Буду очень признателен за любую помощь... Вот мой код на случай, если он вам понадобится (хотя я думаю, что это должно быть довольно простой задачей, может быть, нет, я новичок в PHP)

            include('config.php');
            $var = $_REQUEST['search'];
            $trimmed = trim($var);
            $search = ucfirst($var);


        $result = mysql_query("SELECT * FROM gj WHERE name like '%$search%' ORDER by name") or trigger_error(mysql_error());
        $num_rows = mysql_num_rows($result);

И затем я использую цикл while, чтобы получить от него весь код.

 while($row = mysql_fetch_array($result))
        {
        $id=$row['id'];
        $name=$row['name'];
        $phone=$row['phone'];
        $website=$row['website'];
        $city=$row['city'];
        $address=$row['address1'];
        $zipcode=$row['zipcode'];
        $addressmap = preg_replace('/\s/', '+',$address);
        $citymap = preg_replace('/\s/', '+',$city);

        echo"

person the_    schedule 08.01.2011    source источник
comment
Вам нужно использовать mysql_real_escape_string для ВСЕХ ненадежных переменных, которые вы используете в SQL-запросах. Это атака с внедрением SQL, ожидающая своего часа.   -  person John Parker    schedule 08.01.2011
comment
вы также должны использовать $_GET, а не $_REQUEST   -  person Prisoner    schedule 08.01.2011
comment
Хорошо, я просто изменил его. Есть ли разница?   -  person the_    schedule 08.01.2011


Ответы (2)


 include('config.php');
 $searchfields = array('name', 'cat1', 'cat2', 'cat3', )
 $cleandata = mysql_real_escape_string(trim(strtolower($_REQUEST['search'])));

 $where = array();
 foreach($searchfields as $field) {
     $where[] = 'lcase('.$field.') like \'%.$cleandata.%\'';
 }

 $result = mysql_query('SELECT * FROM gj WHERE '.implode(' OR ', $where).' ORDER by name') or trigger_error(mysql_error());
 $num_rows = mysql_num_rows($result);

Я добавил переменную cleandata, которая содержит очищенные данные запроса (чтобы предотвратить внедрение SQL).

Я создал переменные поля поиска, которые можно легко расширить для поиска в других полях.

Для поиска по большему количеству полей просто разверните данные массива:

 $searchfields = array('name', 'cat1', 'cat2', 'cat3', 'cat4', )

РЕДАКТИРОВАТЬ Добавлен нечувствительный к регистру


EDIT Добавлен PDO

Обратите внимание, что с тех пор, как я написал этот ответ, сообщество начало процесс устаревания древнего mysql_*. Видите красное поле? Вместо этого вам следует узнать о подготовленных операторах и использовать либо PDO или MySQL. Если не можете определиться, эта статья поможет с выбором. Если вы хотите научиться, вот хороший учебник по PDO.

Переписывание приведенного выше ответа с использованием PDO будет выглядеть примерно так:

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$searchfields = array('name', 'cat1', 'cat2', 'cat3', )

$where = array();
foreach($searchfields as $field) {
    $where[] = 'lcase(' . $field . ') LIKE :keyword';
}

$stmt = $dbConnection->prepare('SELECT * FROM gj WHERE ' . implode(' OR ', $where) . ORDER BY name);
$stmt->execute(array(
    ':keyword' => '%' . trim(strtolower($_REQUEST['search'])) . '%',
));
person PeeHaa    schedule 08.01.2011
comment
Чувак, ты потрясающий... Большое спасибо. - person the_; 08.01.2011

Допустим, вы хотите найти имя компании «Джейк» и категорию «php».
URL-адрес для вашего запроса будет таким...

http://yourdomain.com/search.php?name=Jake&category=php


У вас должен быть какой-то столбец, это уникальный идентификатор строки таблицы. В этом примере я использую столбец «id». Отредактируйте его под свои нужды. Теперь давайте настроим ваш запрос...

$query = "SELECT * FROM `gj`
WHERE name LIKE '%{$_GET['name']}%'
AND `gj.id` IN (
    SELECT id FROM test
    WHERE 
        cat1 LIKE '%{$_GET['category']}%' OR 
        cat2 LIKE '%{$_GET['category']}%' OR
        cat3 LIKE '%{$_GET['category']}%'
    )";
    // or edit this cat1 LIKE '%{$_GET['category']}%'
    // to cat1 = '{$_GET['category']}'
    // if you want to compare exact values


С помощью этого запроса вы извлекаете данные из БД.

 $result = mysql_query($query) or trigger_error(mysql_error());


Теперь делайте с извлеченными данными все, что хотите.
Сообщите мне о результате ;-)

person Andreyco    schedule 08.01.2011
comment
Отметьте это как принятый ответ, чтобы другие люди узнали его. Это может помочь кому-то еще :) - person Andreyco; 10.01.2011
comment
Ожидание SQL-инъекции - person PeeHaa; 09.08.2012
comment
Приятель, ему разрешено делать с запросом что угодно... Я только показал ему, как построить запрос - person Andreyco; 16.11.2012