php - 使用 JSON 的实时搜索功能

标签 php javascript xml json

我目前有一个方法,其中有一个

<input type="text" id="politician" name="politician" 
onkeyup="showResult(this.value)" value="Enter a politician's name"/>

标签。在包含输入标记的同一文件中,有一个指向名为 ajax.js 的外部 javascript 文件的链接

该文件的内容如下:

function showResult(str)
{
    if (str.length==0)
    { 
        document.getElementById("livesearch").innerHTML="";
        document.getElementById("livesearch").style.border="0px";
        return;
    }

    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    } 
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            document.getElementById("livesearch").innerHTML=xmlhttp.responseText;
            document.getElementById("livesearch").style.border="1px solid #A5ACB2";
        }
    }
    xmlhttp.open("GET","livesearch.php?politician="+str,true);
    xmlhttp.send();
}

基本上,javascript 文件的作用是,每当将一个值插入到输入文本框中时,就会将请求发送到名为“livesearch.php”的 php 文件,该文件解析名为politics.xml 的硬编码 XML 文档的内容.

livesearch.php文件如下:

<?php

//Make sure we have something set before we go doing work
if (isset($_GET["politician"])){

    $q = $_GET["politician"];
    if ($q == "")
        exit();

    $xmlDoc = new DOMDocument();
    $xmlDoc->load("politicians.xml");
    $x=$xmlDoc->getElementsByTagName('Politicians');

    $hint = "";   

    for($i=0; $i<($x->length); $i++)
    {
        $y=$x->item($i)->getElementsByTagName('name');
        $z=$x->item($i)->getElementsByTagName('url');
        $w=$x->item($i)->getElementsByTagName('location');
        $v=$x->item($i)->getElementsByTagName('position');
        $u=$x->item($i)->getElementsByTagName('photo');

        if($y->item(0)->nodeType==1)
        {
            //Find a link matching the search text
            if(stristr($y->item(0)->childNodes->item(0)->nodeValue,$q))
            {
                if($hint != "")
                {
                    $hint .= "<br />";
                }
                $hint .= "<h1 id='poli'><a id='blue' href='";
                $hint .= $z->item(0)->childNodes->item(0)->nodeValue;
                $hint .= "'>";
                $hint .= $y->item(0)->childNodes->item(0)->nodeValue;
                $hint .= "</a> <br /><a id='green'>";
                $hint .= $v->item(0)->childNodes->item(0)->nodeValue;
                $hint .= "</a><a id='green'>";
                $hint .= $w->item(0)->childNodes->item(0)->nodeValue;
                $hint .= "</a><br/><img width='30' height='40' id='schmidt' src='politicians/";
                $hint .= $u->item(0)->childNodes->item(0)->nodeValue;
                $hint .= ".png' /></h1>";
            }
        }
    }
}

// Set output to "no suggestion" if no hint were found
// or to the correct values
if($hint == "")
    echo "No suggestions";
else
    echo $hint;
?>

我的一个 friend 最近告诉我,JSON 是 XML 的一个很好的替代品,因为使用 JSON 会给服务器带来更少的压力,因为它不需要依赖 PHP 来解析 XML 文档的内容。客户端会解析它。

但是,我没有足够的 JSON 经验来重写此函数,以便它可以与 JSON 文档一起使用。谁能给我一些建议吗?

任何帮助将不胜感激!

最佳答案

好的。我更清楚你现在在做什么。首先,我建议使用 MongoDB(甚至 Redis)来存储政客信息,而不是 XML 文件。想一想。很多人都会进行搜索。如果您正在搜索,然后我也尝试搜索,那么我必须先等您完成对 XML 文件的访问,然后才能进行搜索。如果许多人同时访问相同的数据,则应使用数据库而不是文件。即使只有一个人在搜索,每次键入内容时也必须打开和关闭该文件。对于这类事情,数据库要快得多,尤其是。 MongoDB 因为这一切都发生在 RAM 中。请记住为您要搜索的内容添加索引,在本例中为政客的名字。

还有,有多少政客?如果少于 5,000 个左右,您可以执行 Facebook 过去对您 friend 所做的操作:在初始页面加载时插入所有 friend ID 的 JSON 数组。因此,您可以预先输出所有政客姓名和 ID 的 JSON 数组,然后使用 JavaScript 在客户端上进行实时搜索。研究一下 jQuery。 http://ejohn.org/blog/jquery-livesearch/

如果您要使用 AJAX,我建议您也使用 jQuery,因为它更简单并且可以为您解决浏览器兼容性问题。 (您的代码可能无法在某些浏览器中运行。)jQuery 对于其他事件处理和修改 DOM 也非常有帮助,您也在代码中执行这些操作。所以,你可以用它来做很多你已经用 JavaScript 做的更困难的事情。另外,使用 MongoDB(查看 MongoHQ 的免费托管)。我还认为您会发现 Sinatra 比 PHP 容易得多,而且它是免费且易于托管在 Heroku 上的,您还可以将其连接到 MongoDB。这就是我对 acani 所做的 http://github.com/acani/acani

http://webhole.net/2009/08/31/how-to-read-json-data-with-php/

Scala 或 Node.js 也比 PHP 或 Ruby 更快。

马特

关于php - 使用 JSON 的实时搜索功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4001723/

相关文章:

javascript - 没有页面刷新的 Ajax 自动 Div 更新将不起作用

javascript - jQuery - 如何延迟表单提交直到动画完成?

javascript - 在 Javascript(但不是 Node)中,我如何划分两个 Uint8Arrays?

java - 无法使用 FlowTextView 设置文本大小

android - 使用默认 xml 属性复制 Android 首选项屏幕样式

Php mysql只更新空列

php - WordPress - 上传时模糊图像

php - 客户端从服务器检索聊天消息的最佳方式?

javascript - 如何使用 javascript 适配器将图像发布到服务器并获取 xml 结果?

javascript - Firebase .then 与 .on ('value' )