0

我知道我已经在 30 分钟前发布了,但我认为我已经接近我的搜索帖子输入:

我创建了一个看起来像这样的模型

    function matchPosts($keyword)
{
    $this->db->get('posts');
    $data = array();
    $query = $this->db->query("SELECT title,body FROM posts WHERE title LIKE '%$keyword%' or body LIKE '$keyword%' AND status='published'");        
    if( $query->num_rows() > 0)
    {
        $data = $query->row_array();
    }       
    $query->free_result();
    return  $data;
}

我正在尝试从我的数据库中获取匹配项,

控制器如下所示:

public function searchPosts()
{
    $keyword = $this->input->post('search_value', TRUE);

    $matched_field = $this->Model_cats->matchPosts($keyword);

    echo $keyword;

    if( count($matched_field) > 0)
    {
        $this->load->view('posts_list');
    }
    else
    {
        $this->load->view('posts_list');
    }
}

这是js文件

$(document).ready(function()
{
    $("#search_posts").keyup(function()
    {        
        var searchValue = $(this).val();

        $(".posted_post").each(function()
        {
               $.ajax({             
                    type: "POST",
                    url : "http://local.blog.com/welcome/searchPosts",
                    data: {
                        search_value: searchValue   
                    },  
                    success: function(data)
                    { 
                        if(data)
                        {
                            $(this).show(); 
                        }
                        else
                        {
                            $(this).fadeOut();      
                        }

                    }
                });
        });
    });
});

和观点:

    <br>    
<form action="" method="post"> 
        <label for="search_posts"><b>Search Posts</b></label>
        <input type="text" id="search_posts" value="" />
</form>


posts_list 是我循环浏览帖子的视图...

我接近了吗?在这种状态下它不起作用。

4

3 回答 3

1

将您的脚本编辑为

$("#search_posts").keyup(function()
{        
    var posts = $(this).val();        
    //$(".posted_post").each(function()
    //{
        $.ajax({
            url : 'http://local.blog.com/welcome/searchPosts',
            data: {posts},  
            success : function(data)
            {
                 $(this).show();
            }
        });
    //}
});

并从

$matched_field = $this->Model_cats->matchPosts($keyword);

$matched_field 返回找到正确的搜索结果的数量..??然后您只需检查

if($matched_field)
{
      //Here you can print result of search
}
else
{
      //You can print No results found
}
于 2013-02-18T13:14:01.157 回答
1

在您的 match_posts 函数中,您在搜索帖子函数中使用 num_rows () 您正在从上述函数收集结果并使用 === 与布尔值 true 进行比较。尝试 var dump 确认从 num rows 函数返回什么类型的值。我认为您正在将 numeric 与 boolean 进行比较。相反,您可以使用 if count (matched fields) > 0

于 2013-02-18T13:18:05.117 回答
0

模型

class SomeModel extends CI_Model{

    /**
     * Get Posts
     * 
     * @param string LIKE param
     * @return mixed Object/Array or Boolean
     **/
    public function get_posts( $like ){

        $query = 
        $this->db
             ->select('id, title, body')
             ->like('title'   => $like)
             ->or_like('body' => $like) //not sure if your looking for FULLTEXTSEARCH on this body
             ->get_where('posts', array('status' => 'published'));


        return ( $query->num_rows() > 0) ? $query->result() : FALSE;
    }
}

路线

//edit to match your class/method
$route['search/(:any)'] = 'welcome/search_posts/$1';

控制器

class Welcome extends CI_Controller{

    public function search_posts( $like ){

        if( !$posts = $this->SomeModel->get_posts( $like ))
        {
            return show_404();
        }

        //return partial view without template
        return $this->load->view('public_home', array(
            'posts' =>  $posts
        ), TRUE);
    }
}

局部视图(用于 ajax)

/**
<ul>
    //<?php foreach($posts as $post): ?>
    <li>
        <a href=#>
            <h4><?php echo html_escape($post->title) ?></h4>
            <p>
                <?php echo html_escape($post->body) ?>
            </p>
        </a>
    </li>
    //<?php endforeach; ?>
</ul>
**/

jQuery

var SITEURL = "<?php echo site_url(); ?>";

;(function($){

    var search = {
        init: function(){

            if($('#search_posts'))
            {
                this.searchPosts();
            }

        },
        searchPosts : function(){

            var searchInput = $("#search_posts")
                result      = $("#result"),
                timeout     = '';

            //ajax request
            var doAjax = function( context, data ){
                $.ajax({
                    cache    : false,
                    url      : SITEURL + 'search/' + data.keyword,
                    dataType : 'html',
                    type     : 'POST',
                    data     : data,
                    context  : context,
                    success  : function( callback ){
                        $(this).html( callback ); //$(this) = context => $("#result")
                    }
                });
            };

            //delayed keyup event
            searchInput.on('keyup', function( event ){

                if(timeout) {
                    window.clearTimeout(timeout);
                    timeout = null;
                }

                //listen for keyup after delayed(1000)
                timeout = window.setTimeout(function(){
                    var inputVal = $(this).val();
                    var data     = {
                        'keyword'   : inputVal
                    }
                    return doAjax( result, data );//execute ajax function
                }, 1000);

            });




        }
    };

    $(function(){
        search.init();
    });

})(jQuery);
于 2013-02-18T15:14:49.103 回答