我在搜索我的数据库并输出数据时遇到了一些问题。
这是我的模板。不要介意$page->_()
。这是因为我的框架。想想phps 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::getByTitle
只执行SELECT * FROM movies WHERE title LIKE '%".$title."%' LIMIT 30"
查询,为每个结果创建一个Movie对象并返回一个包含对象的数组
我的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”之类的东西,我就无法在此之后搜索任何内容。甚至没有“阿甘正传”给我任何结果。
真的无法弄清楚问题出在哪里。我的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();
}
答案 0 :(得分:0)
您使用的是全文搜索吗?如果是这样,MySQL在进行全文搜索时必须提供最少数量的字符,否则它不返回任何内容。那是我的第一次猜测。
这是可配置的,虽然我不知道如何做到这一点。它有一个很好的理由,因为全文搜索通常意味着搜索巨大的字符串,这样如果你简单地给它“一个”,它将返回许多大量的行。如果这不是你如何使用它,那么你可以减少字符数量,虽然这也可以让你的用户更多地查看。
答案 1 :(得分:0)
您正在搜索的字段的索引。 主索引会为您提供非重复内容,或使用全文索引。 详情in the documentation
答案 2 :(得分:0)
好的......发现了问题。我的数据库中的一些字符串不正确UTF-8 ... json_encode()遇到了麻烦所以在我的php模板中我必须将$list.= '<li>'.$movie->getTitle().'</li>';
更改为$list.= '<li>'.utf8_encode($movie->getTitle()).'</li>';