0

我在搜索我的数据库和输出数据时遇到了一点问题。

这是我的模板。别介意$page->_(). 这是因为我的框架。想想phpsecho

<?php
$movies = array();
if( isset($_POST['searchtext']) && isset($_POST['ajax']) && $_POST['ajax']==1 )
    $movies = Movie::getByTitle( $_POST['searchtext'] );
$list = '<ul id="results">'; 
if( isset( $movies ) && $movies!=null )
    foreach($movies as $movie)
         $list.= '<li>'.$movie->getTitle().'</li>';
else if( isset($_POST['ajax']) && $_POST['ajax']==1 )
    $list.='<li>No Results!</li>';
$list.= '</ul>';

if(isset($_POST['ajax']) && $_POST['ajax']==1){
    $json = array(
        'success' => true,
        'html' => $list
    );
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Expires: 0');
    header('Content-type: text/json');
    echo json_encode($json);
    die();
}
$page->_(
'<section class="dialog-fixed small">',
    '<form id="search-form" method="post" action="#home">',
        '<fieldset>',
            '<input type="text" name="searchtext" />',
            '<input type="submit" name="moviesubmit" value="Search"/>',
        '</fieldset>',
    '</form>'
);
$page->_($list);
$page->_('</section>');
?>

Movie::getByTitle只是做一个SELECT * FROM movies WHERE title LIKE '%".$title."%' LIMIT 30"查询,为每个结果创建一个电影对象并返回一个包含对象的数组

我的 jQuery AJAX 请求是这样工作的:

var f0 = $('#search-form');
if( f0.length>0 ) {
    f0.each(function(){
        var f = $(this);
        $(this).submit(function(ev){
            ev.preventDefault();
            $.ajax({
                type: 'post',
                url: BASEURL+f.attr('action'),
                data: f.serialize()+'&ajax=1',
                dataType: 'json',
                success: function(data) {
                    if(data.success){
                        $('#results').replaceWith(data.html);
                    }
                },
                error: function(xhr,txt,err) {
                    alert(txt+' ('+err+')');
                }
            });
        });
    });
}

现在..我查询的数据库表有大约 1.000.000 行(电影),例如,如果我搜索“阿甘正传”,它工作得很好......但是如果我搜索字符较少的东西,让我们说“一个”它不会返回任何东西。我尝试在 phpmyadmin 中的数据库中搜索“One”,它返回了大约 15.000 个结果……好吧,我认为这对于我的脚本来说可能太多了,所以我放了一个LIMIT 30如您所见,在我的数据库查询结束时..也不起作用。在搜索“一个”之后,我没有得到任何回报,甚至没有得到应有的“无结果”(实际上它不应该,但你知道我的意思)。我的脚本只是停止工作。如果我搜索“One”之类的内容,之后我将无法搜索任何内容。甚至“阿甘正传”也没有给我任何结果。实在想不通问题出在哪里。我的萤火虫对我没有帮助;)

有什么提示吗?

编辑:好的,我发现我的问题出在哪里。json_encode($json) 不起作用。我还没弄清楚原因。此解决方案有效:script.js:

$.ajax({
                type: 'post',
                url: BASEURL+f.attr('action'),
                data: f.serialize()+'&ajax=1',
                dataType: 'text',
                success: function(data) {
                    if(data!=''){
                        $('#results').replaceWith(data);
                    }
                },
                error: function(xhr,txt,err) {
                    alert(txt+' ('+err+')');
                }
            });

php模板:

if(isset($_POST['ajax']) && $_POST['ajax']==1){
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Expires: 0');
header('Content-type: text/html');
echo utf8_encode($list);
die();
}
4

3 回答 3

0

好的。。发现问题了。我数据库中的一些字符串不是正确的 UTF-8 ...json_encode() 有这个问题所以在我的 php 模板中我不得不更改$list.= '<li>'.$movie->getTitle().'</li>';$list.= '<li>'.utf8_encode($movie->getTitle()).'</li>';

于 2012-05-02T07:10:50.497 回答
0

您是否使用全文搜索?如果是这样,MySQL 在进行全文搜索时必须提供最少字符数,否则它不会返回任何内容。那将是我的第一个猜测。

这是可配置的,尽管我不知道该怎么做。这是有充分理由的,因为全文搜索通常意味着搜索巨大的巨大字符串,因此如果你只给它“一个”,它将返回许多大量的行。如果这不是您使用它的方式,那么您可能会减少字符的数量,尽管这也会让您的用户有更多的浏览量。

于 2012-04-30T21:29:50.007 回答
0

您正在搜索的字段上的索引。主索引将为您提供非重复内容,或使用全文索引。文档中的详细信息

于 2012-04-30T21:33:33.327 回答