PDO multi-filtro de consulta sql

¿Existe una forma más sencilla de codificar esto y realizar lo mismo sin tener que tener tantas consultas? Estoy tratando de agregar paginación (no incluido en el código aquí) y funciona en mi consulta ALL, pero las consultas AND / OR dan resultados divertidos y se están convirtiendo en un dolor de cabeza. Aparte de que el filtrado de resultados funciona a la perfección solo hay que paginar.

$filter = isset($_POST['filter']) ? $_POST['filter'] : null;
$status = isset($_POST['status']) ? $_POST['status'] : null;

if(empty($filter) && empty($status)) {

    //echo 'ALL query';
    $sql = 'SELECT * FROM _product JOIN _module_type ON module_type = module_id';
    $sth = $link->prepare($sql);
    $sth->execute(array());
    $result = $sth->fetchall();

} else {
    // display result if filter AND status are selected
    if(!empty($filter) && !empty($status)) {

        //echo 'AND query';
        $sql = 'SELECT * FROM _product JOIN _module_type ON module_type = module_id WHERE module_type = :filter AND product_status = :status';
        $sth = $link->prepare($sql);
        $sth->execute(array(':filter' => $filter, ':status' => $status));
        $result = $sth->fetchall();

    } else {
        // display result if filter OR status are selected
        if(!empty($filter) || !empty($status)) {

            //echo 'OR query';
            $sql = 'SELECT * FROM _product JOIN _module_type ON module_type = module_id WHERE module_type = :filter OR product_status = :status';
            $sth = $link->prepare($sql);
            $sth->execute(array(':filter' => $filter, ':status' => $status));
            $result = $sth->fetchall();

        }
    }
}

//test sql
echo $sql.'<br />';

$bgcolor = '';
foreach($result as $key => $value) {

    if(($bgcolor=='#ffffff') ? $bgcolor='#f1f1f1' : $bgcolor='#ffffff') {

    echo '<tr bgcolor="'.$bgcolor.'">';
    echo '<td>'.$value['product_id'].'</td>';
    echo '<td>'.$value['product_name'].'</td>';
    echo '<td>'.$value['product_type'].'</td>';
    echo '<td>'.$value['module_name'].'</td>';
    echo '<td>'.$value['product_price'].'</td>';
    echo '<td>'.$value['product_status'].'</td>';
    echo '</tr>';
    }
}
    echo '</table>';