0

データベースの検索とデータの出力で少し問題が発生しました。

これが私のテンプレートです。気にしないでください$page->_()。これは私のフレームワークによるものです。phpについて考えてみてくださいecho

<?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::getByTitleSELECT * FROM movies WHERE title LIKE '%".$title."%' LIMIT 30"クエリを実行し、結果ごとにムービーオブジェクトを作成し、オブジェクトを含む配列を返します。

私のjQueryAJAXリクエストは次のように機能します。

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行(映画)があります。たとえば、「フォレストガンプ」を検索すると非常にうまく機能します...しかし、文字数が少ないものを検索すると、「1つ」とは言えません。何でも返します。phpmyadmin内のデータベースで「One」を検索してみたところ、約15.000件の結果が返されました...これはスクリプトで処理するには多すぎる可能性があると思ったので、LIMIT 30ご覧のとおり、データベースクエリの最後に..どちらも機能しません。「One」を検索した後、「No Result」ではなく、何も返されません(実際にはそうすべきではありませんが、私が何を意味するかはご存知でしょう)。スクリプトが機能しなくなります。そして、「One」のようなものを検索した場合、これ以降は何も検索できません。「フォレストガンプ」でさえ私に結果を与えません。問題がどこにあるのか本当に理解できません。私のFirebugは私を助けません;)

ヒントはありますか?

編集:わかりました、私の問題がどこにあるかを見つけました。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

全文検索を使用していますか?その場合、MySQLには、全文検索を実行するときに指定する必要のある最小文字数があります。それ以外の場合は、何も返されません。それが私の最初の推測です。

これは構成可能ですが、頭のてっぺんからそれを行う方法がわかりません。全文検索は多くの場合、巨大な巨大な文字列を検索することを意味するため、これは正当な理由でダウンしています。そのため、単に「1つ」を指定すると、多数の巨大な行が返されます。これが使用方法ではない場合は、おそらく文字数を減らすことができますが、これによりユーザーはより多くの文字を確認できるようになります。

于 2012-04-30T21:29:50.007 に答える
0

検索しているフィールドのインデックス。プライマリインデックスは、重複しないコンテンツを取得するか、フルテキストインデックスを使用します。ドキュメントの詳細

于 2012-04-30T21:33:33.327 に答える
0

OK..問題が見つかりました。データベース内の一部の文字列が正しくUTF-8ではありませんでした...json_encode()で問題が発生したため、phpテンプレートで次のように変更$list.= '<li>'.$movie->getTitle().'</li>';する必要がありました$list.= '<li>'.utf8_encode($movie->getTitle()).'</li>';

于 2012-05-02T07:10:50.497 に答える