JS返回错误的输出PHP/XML文件

JS返回错误的输出PHP/XML文件,php,javascript,xml,Php,Javascript,Xml,我正在尝试建立一个简单的网络“应用程序”,在那里我将有一个地图(使用谷歌地图api)和它下面的一些链接作为“过滤器”。我想按类型(即:酒吧或餐厅)过滤数据 基本上,map.html页面使用javascript获取由PHP脚本生成的XML 以下是代码: map.hmtl: <!doctype html> <html> <head> <meta name="viewport" content="initial-scale=1.0, user-scal

我正在尝试建立一个简单的网络“应用程序”,在那里我将有一个地图(使用谷歌地图api)和它下面的一些链接作为“过滤器”。我想按类型(即:酒吧或餐厅)过滤数据

基本上,map.html页面使用javascript获取由PHP脚本生成的XML

以下是代码:

map.hmtl:

<!doctype html>
<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=AIzaSyASO80RjNn2d_Jjy9vdNHA5E3tfmALkWXw&sensor=false"></script>
    <script type="text/javascript">

        //<![CDATA[

        var customIcons = {
            restaurant: {
                icon: 'http://labs.google.com/ridefinder/images/mm_20_blue.png',
                shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
            },
            bar: {
                icon: 'http://labs.google.com/ridefinder/images/mm_20_red.png',
                shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
            }
        };

        function load() {
            var map = new google.maps.Map(document.getElementById("map"), {
                center: new google.maps.LatLng(47.6145, -122.3418),
                zoom: 13,
                mapTypeId: 'roadmap',
                disableDefaultUI: true
            });
            var infoWindow = new google.maps.InfoWindow;

            // Change this depending on the name of your PHP file
            downloadUrl("genxml3.php", function(data) {
                var xml = data.responseXML;
                var markers = xml.documentElement.getElementsByTagName("marker");
                for (var i = 0; i < markers.length; i++) {
                    var name = markers[i].getAttribute("name");
                    var address = markers[i].getAttribute("address");
                    var type = markers[i].getAttribute("type");
                    var point = new google.maps.LatLng(
                        parseFloat(markers[i].getAttribute("lat")),
                        parseFloat(markers[i].getAttribute("lng"))
                    );
                    var html = "<b>" + name + "</b> <br />" + address + "<br />" + type;
                    var icon = customIcons[type] || {};
                    var marker = new google.maps.Marker({
                        map: map,
                        position: point,
                        icon: icon.icon,
                        shadow: icon.shadow
                    });
                    bindInfoWindow(marker, map, infoWindow, html);
                }
            });

        }



        function bindInfoWindow(marker, map, infoWindow, html){
            google.maps.event.addListener(marker, 'click', function(){
                infoWindow.setContent(html);
                infoWindow.open(map, marker);
            });
        }

        function downloadUrl(url, callback) {
            var request = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest;

            request.onreadystatechange = function() {
                if (request.readyState == 4) {
                    request.onreadystatechange = doNothing;
                    callback(request, request.status);
                }
            };

            request.open('GET', url, true);
            request.send(null);
        }

        function doNothing() {}

        //]]>


    </script>
</head>
<body onload="load()">
    <div id="map" style="width: 900px; height: 750px;"></div>
    <ul>
        <a href="#">Restaurant</a>
    </ul>
</body>
</html>

//
genxml3.php:

<?php  

require("dbinfo.php"); 

// Start XML file, create parent node

$dom = new DOMDocument("1.0");
$node = $dom->createElement("map");
$parnode = $dom->appendChild($node); 

// Opens a connection to a MySQL server

$connection=mysql_connect('localhost', $username, $password);
if (!$connection) {  die('Not connected : ' . mysql_error());} 

// Set the active MySQL database

$db_selected = mysql_select_db($database, $connection);
if (!$db_selected) {
    die ('Can\'t use db : ' . mysql_error());
} 

// Select all the rows in the markers table
// Checks for the 'GET' variable, if there isn't, run normal XML script,
// if there is, get the restriction/filter and query from the database 
// with the filter

if (!empty($_GET)) {    
    $filter = $_GET['f'];
    $query = "SELECT * FROM markers WHERE type = '$filter'";
} else {
    $query = "SELECT * FROM markers WHERE 1";
}

$result = mysql_query($query);
if (!$result) {  
    die('Invalid query: ' . mysql_error());
}

header("Content-type: text/xml"); 

// Iterate through the rows, adding XML nodes for each

while ($row = mysql_fetch_assoc($result)){  
  // ADD TO XML DOCUMENT NODE  
  $node = $dom->createElement("marker");  
  $newnode = $parnode->appendChild($node);   
  $newnode->setAttribute("name",$row['name']);
  $newnode->setAttribute("address", $row['address']);  
  $newnode->setAttribute("lat", $row['lat']);  
  $newnode->setAttribute("lng", $row['lng']);   
  $newnode->setAttribute("type", $row['type']);
} 

echo $dom->saveXML();

?>
createElement(“映射”);
$parnode=$dom->appendChild($node);
//打开到MySQL服务器的连接
$connection=mysql\u connect('localhost',$username,$password);
if(!$connection){die('notconnected:'.mysql_error());}
//设置活动MySQL数据库
$db\u selected=mysql\u select\u db($database,$connection);
如果(!$db_选中){
die('不能使用db:'.mysql_error());
} 
//选择标记表中的所有行
//检查“GET”变量,如果没有,则运行普通XML脚本,
//如果存在,则从数据库中获取限制/筛选器和查询
//用过滤器
如果(!empty($\u GET)){
$filter=$_GET['f'];
$query=“从类型为“$filter”的标记中选择*;
}否则{
$query=“从标记中选择*,其中1”;
}
$result=mysql\u query($query);
如果(!$result){
die('无效查询:'.mysql_error());
}
标题(“内容类型:text/xml”);
//遍历行,为每个行添加XML节点
而($row=mysql\u fetch\u assoc($result)){
//添加到XML文档节点
$node=$dom->createElement(“标记”);
$newnode=$parnode->appendChild($node);
$newnode->setAttribute(“名称”,$row['name']);
$newnode->setAttribute(“地址”,$row['address']);
$newnode->setAttribute(“lat”,$row['lat']);
$newnode->setAttribute(“lng”,$row['lng']);
$newnode->setAttribute(“类型”,$row['type']);
} 
echo$dom->saveXML();
?>
PHP脚本生成以下XML代码:

<map> 
    <marker name="Pan Africa Market changed" address="1521 1st Ave, Seattle, WA"     lat="47.6089" lng="-122.34" type="restaurant"/> 
    <marker name="Buddha Thai & Bar" address="2222 2nd Ave, Seattle, WA" lat="47.6136" lng="-122.344" type="bar"/> 
    <marker name="The Melting Pot" address="14 Mercer St, Seattle, WA" lat="47.6246" lng="-122.356" type="restaurant"/> 
    <marker name="Ipanema Grill" address="1225 1st Ave, Seattle, WA" lat="47.6064" lng="-122.338" type="restaurant"/> 
    <marker name="Sake House" address="2230 1st Ave, Seattle, WA" lat="47.6128" lng="-122.346" type="bar"/> 
    <marker name="Crab Pot" address="1301 Alaskan Way, Seattle, WA" lat="47.606" lng="-122.34" type="restaurant"/> 
    <marker name="Mama's Mexican Kitchen" address="2234 2nd Ave, Seattle, WA" lat="47.614" lng="-122.345" type="bar"/> 
    <marker name="Wingdome" address="1416 E Olive Way, Seattle, WA" lat="47.6172" lng="-122.327" type="bar"/> 
    <marker name="Piroshky Piroshky" address="1908 Pike pl, Seattle, WA" lat="47.6101" lng="-122.343" type="restaurant"/> 
</map>

当我在导航栏中强制一个“get”变量(即:genxml3.php?f=restaurant)时,输出以下XML代码:

<map>    
    <marker name="Pan Africa Market changed" address="1521 1st Ave, Seattle, WA" lat="47.6089" lng="-122.34" type="restaurant"/>
    <marker name="The Melting Pot" address="14 Mercer St, Seattle, WA" lat="47.6246" lng="-122.356" type="restaurant"/>
    <marker name="Ipanema Grill" address="1225 1st Ave, Seattle, WA" lat="47.6064" lng="-122.338" type="restaurant"/>
    <marker name="Crab Pot" address="1301 Alaskan Way, Seattle, WA" lat="47.606" lng="-122.34" type="restaurant"/>
    <marker name="Piroshky Piroshky" address="1908 Pike pl, Seattle, WA" lat="47.6101" lng="-122.343" type="restaurant"/>    
</map>

所以我知道PHP脚本中的逻辑是有效的,因为它过滤了所需的代码。因此,如果我在“f=restaurant”中输入,则只有“restaurant”类型的标记会显示,如果我使用“f=bar”,则相同

但是JavaScript仍然只使用第一个XML代码。如何让JavaScript代码使用第二个XML代码(应用了过滤器的代码)


因此,我现在正在寻找一种方法,在按下map.html文件中的链接时,使用新的XML代码运行JavaScript代码。

您可以在map.html上应用get参数,并使用JavaScript将其处理到您的genxml3.php(map.html?f=restaurant->genxml3.php?f=restaurant)

为此,请定义链接:

<a href="map.html?f=restaurant">Restaurant</a>
<a href="map.html?f=bar">Bar</a>
现在,您只需在页面刷新时执行通常的load(),调用downloadUrl()并添加map.html后面的部分

downloadUrl("genxml3.php" + param, function(data) {
这非常简单,不是一个好的解决方案,因为根本不需要检查参数,但这是您的部分,取决于您的需求

如果您根本不想刷新页面,则可以为给定参数(过滤器名称)的链接分配一个函数:


您还可以使用jQuery,将事件分配给所有链接,并读取它们的innerHTML(值)。我不确定我是否正确理解你的问题,希望我能帮助你。

好吧。。。您的XML(第二个标记节点,name属性)缺少语法错误:
&
符号必须使用实体
&

实际上PHP应该自动完成这项工作,您是否使用较旧的版本

如在对的回答中所述,将PHP更改为

// Iterate through the rows, adding XML nodes for each

while ($row = @mysql_fetch_assoc($result)){  
  // ADD TO XML DOCUMENT NODE  
  $node = $dom->createElement("marker");  
  $newnode = $parnode->appendChild($node);   
  $newnode->setAttribute("name", htmlspecialchars($row['name']));
  $newnode->setAttribute("address", htmlspecialchars($row['address']));  
  $newnode->setAttribute("lat", htmlspecialchars($row['lat']));  
  $newnode->setAttribute("lng", htmlspecialchars($row['lng']));   
  $newnode->setAttribute("type", htmlspecialchars($row['type']));
}
试试看

XML输出现在应该如下所示

<map> 
<marker name="Pan Africa Market changed" address="1521 1st Ave, Seattle, WA"     lat="47.6089" lng="-122.34" type="restaurant"/> 
<marker name="Buddha Thai &amp; Bar" address="2222 2nd Ave, Seattle, WA" lat="47.6136" lng="-122.344" type="bar"/> 
<marker name="The Melting Pot" address="14 Mercer St, Seattle, WA" lat="47.6246" lng="-122.356" type="restaurant"/> 


请编写一个更好的标题。试着浏览代码,找到相关的内容,没有人想查看所有的JS,看看与问题有什么关系……您是否尝试过使用jQuery?请参阅
//根据PHP文件的名称更改此标题,在这一行之后,您只需更改URL即可。你有什么问题吗?如果是这样,在你的问题中更清楚地说明这一点,提出你的问题。
// Iterate through the rows, adding XML nodes for each

while ($row = @mysql_fetch_assoc($result)){  
  // ADD TO XML DOCUMENT NODE  
  $node = $dom->createElement("marker");  
  $newnode = $parnode->appendChild($node);   
  $newnode->setAttribute("name", htmlspecialchars($row['name']));
  $newnode->setAttribute("address", htmlspecialchars($row['address']));  
  $newnode->setAttribute("lat", htmlspecialchars($row['lat']));  
  $newnode->setAttribute("lng", htmlspecialchars($row['lng']));   
  $newnode->setAttribute("type", htmlspecialchars($row['type']));
}
<map> 
<marker name="Pan Africa Market changed" address="1521 1st Ave, Seattle, WA"     lat="47.6089" lng="-122.34" type="restaurant"/> 
<marker name="Buddha Thai &amp; Bar" address="2222 2nd Ave, Seattle, WA" lat="47.6136" lng="-122.344" type="bar"/> 
<marker name="The Melting Pot" address="14 Mercer St, Seattle, WA" lat="47.6246" lng="-122.356" type="restaurant"/>