PHP MySQL создать запрос для поиска по нескольким таблицам - PullRequest
0 голосов
/ 28 марта 2012

У меня есть такая форма:

<form method="POST" action="<?php echo base_url() ?>admin/admin_search">
    <fieldset>
        <label for="nalozi">Nalozi</label><input type="checkbox" name="nalozi" />
        <label for="malio_glasi">Mali oglasi</label><input type="checkbox" name="mali_oglasi" />
        <label for="zute_strane">Zute strane</label><input type="checkbox" name="zute_strane" />
        <label for="berza_rada">Berza rada</label><input type="checkbox" name="berza_rada" />
        <label for="vesti">Vesti</label><input type="checkbox" name="vesti" />
        <label for="event">Dogadjaji</label><input type="checkbox" name="event" />
    </fieldset>      

    <input type="search" name="keyword" id="keyword" />
    <input type="submit" value="Trazi"/>
</form>

и PHP-код для поиска:

function admin_search(){

        $keyword = trim($_POST['keyword']);
        $search_explode = explode(" ", $keyword);
        $x = 0;

        $mgs = isset($_POST['mali_oglasi']) ? 1 : "";
        $jbs = isset($_POST['berza_rada']) ? 2 : "";
        $nws = isset($_POST['vesti']) ? 3 : "";
        $ypg = isset($_POST['zute_strane']) ? 4 : "";        

        if($mgs != "" || $jbs != "" || $nws != "" || $ypg != ""){$or = " OR ";}else{$or = "";}
        if($jbs != "" || $nws != "" || $ypg != "" ){$or1 = " OR ";}else{$or1 = "";}
        if($nws != "" || $ypg != "" ){$or2 = " OR ";}else{$or2 = "";}
        if($ypg != "" ){$or3 = " OR ";}else{$or3 = "";}

        $nlz = isset($_POST['nalozi']) ? "person" : "";
        $dgj = isset($_POST['event']) ? "event" : "";

        if($nlz != "" || $dgj != ""){$z = ", "; $or_like = " OR "; }else{$z = " "; $or_like = "";}
        if($dgj != ""){$z1 = ", ";$or_like1 = " OR ";}else{$z1 = " ";$or_like1 = "";}

        if($mgs != "" || $ypg != "" || $jbs != "" || $nws != ""){$gi = "global_info";}else{$gi = "";}

        $sql = "SELECT * FROM ";

        if($gi != ""){$sql .= " $gi $z";}
        if($nlz != ""){$sql .= " $nlz $z1";}
        if($dgj != ""){$sql .= " $dgj";}

        $sql .= " WHERE ";
        if($mgs != ""){$sql .= " global_info.info_type_id = {$mgs} $or1 ";}        
        if($jbs != ""){$sql .= " global_info.info_type_id = {$jbs} $or2 ";}        
        if($nws != ""){$sql .= " global_info.info_type_id = {$nws} $or3 ";}        
        if($ypg != ""){$sql .= " global_info.info_type_id = {$ypg} ";}
        $sql .= " AND ";
        foreach($search_explode as $each){
            $x++;
            if($x == 1){
                if($gi != ""){$sql .= " global_info.name LIKE '%$each%' $or_like ";}   
                if($nlz != ""){$sql .= " $nlz.name LIKE '%$each%'$or_like1 ";}   
                if($dgj != ""){$sql .= " $dgj.name LIKE '%$each%' ";}   

            } else {

                $sql .= " AND global_info.name LIKE '%$each%' ";
            }
        }
        echo $sql;        
        $q = $this->db->query($sql);
        echo $q->num_rows();
        return $q = $q->num_rows() == 0 ? FALSE :  $q->result_array();
    }

Идея этого поиска - я должен иметь возможность выбирать таблицы ведьм, которые я хочу искать, и поиск по ключевым словам должен работать для любой выбранной таблицы.

Когда один из флажков установлен, он работает нормально, но если два или более отмечены, и если имеется более одного ключевого слова (на данный момент я пробую просто таблицу global_info с двумя или более ключевыми словами), функция работает нечетко. Иногда это не работает, или если он работает, он дает одни и те же результаты несколько раз, или все, кроме ключевого слова. На данный момент я не совсем понимаю, почему он дает результаты, которые он дает. Как заставить это работать?

1 Ответ

2 голосов
/ 28 марта 2012

Попробуйте изменить его следующим образом:

$tables = array();
if(isset($_POST['mali_oglasi'])){
    $tables['mgs'] = 1;
}
/* 
 repeat for the other tables 
*/

/* Where you're building your WHERE clause, use this instead of the 'OR' logic */
if(!empty($tables)){
    $sql .= 'global_info.info_type_id IN (' . implode(',',$tables) . ')';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...