使用PHP echos编写JavaScript代码(用于传单映射点)

时间:2017-06-19 10:46:54

标签: javascript php mysql leaflet leaflet.draw

我试图在Leaflet中创建地图点,使用javaScript来编写点,例如:

L.marker([39.0865039, -9.2636987], {icon: tree3}).addTo(map)
 .bindPopup('<a class="speciallink">Olive Tree</a>')
 .openPopup();

在MySQL中我存储了coords,然后我尝试制作以下代码:

    <?php
     $res=mysql_query("SELECT * FROM arv_especie");
     $rowArv=mysql_fetch_array($res);
     $idPointVarzea=mysql_query("SELECT * FROM map_point_varzea");
     while ($row=mysql_fetch_array($idPointVarzea)) {
       echo "L.marker([" . $row["coordHori"] . ", " . $row["coordVerti"] . "], {icon: tree" . $row["ARV_id"] . "}).addTo(map)
       .bindPopup($('<a class='speciallink'>" . $rowArv["ARV_Especie"] . "</a>').click(function() {
       document.getElementById('DivShow" . $row["ARV_id"] . "').click();
       })[0])
       .openPopup();";
     }
?>

此代码插入<script type="text/javascript">,而不是外部文件。

我正在使用这个过程,以便在后台我可以CRUD地图点。

我已经搜索过并发现php echos在javaScript中不起作用(或至少接近它的方式)。

有没有更好的方法使用PHP编写javaScript代码?

2 个答案:

答案 0 :(得分:2)

  

有没有更好的方法使用PHP编写javaScript代码?

呀。你没有。

虽然从PHP中即时编写JS很酷,但它也很容易出错和XSS / SQL注入攻击。

更简洁的方法是使用PHP在JS中编写变量值,然后让JS完成所有工作。您的代码将更好地分割,更容易调试,并且您将只有一个点,您的变量必须被转义。

类似的东西:

<script>

<?php
$res=mysql_query("SELECT * FROM arv_especie");
$rowArv=mysql_fetch_array($res);
$idPointVarzea=mysql_query("SELECT * FROM map_point_varzea");

// This will hold a data structure mimicking a GeoJSON FeatureCollection
// See http://geojson.org/
$featureCollection = [ "type"=>"FeatureCollection", "features"=>[] ];

while ($row=mysql_fetch_array($idPointVarzea)) {

    $feature = [
        "geometry"=>[
            "type"=> "Point",
            "coordinates"=> [ $row["coordVerti"] , $row["coordHori"] ]
        ],
        "properties"=> [
            "species"=>$rowArv["ARV_Especie"],
            "id"=>$row["ARV_id"]
        ]
    ];

    $featureCollection["features"][] = $feature;
}
?>

// PHP shall echo() $featureCollection as JSON, which JS will parse nicely.
// From here on, the JS variable "dataInGeoJsonFormat" holds all the needed data
var dataInGeoJsonFormat = <?php echo json_encode($featureCollection); ?>

var markers = L.geoJSON(dataInGeoJsonFormat, {
    onEachFeature: function(feat, layer) {
        layer.bindPopup('ID: ' + feat.properties.id + '<br>Species:' + feat.properties.species)
    }
}).addTo(map);

</script>

我的PHP很生疏,但你应该明白这个想法。如果您使用此模式,您将能够调试您的JavaScript并查看您的数据。使用GeoJSON等众所周知的格式意味着您可以从其他地方欣赏功能和教程。

通过在代码中将单个点编码为JSON(并使用PHP的内置json_encode),您可以省去很多麻烦,潜在的错误。您可以在JS代码中设置断点,并在运行任何JS代码之前检查该变量的值。

这不是唯一可用的模式。但是,这可以防止你犯错误。

答案 1 :(得分:0)

我建议编写一个javascript层来从你的php / crud服务器请求geojson,而不是试图在php构造的响应中嵌入geojson。你可以更好地分离关注点,如果你有兴趣,有几个php框架和库能够生成geojson或促进crud系统。

EX:Doctrine2-Spatial Doctrine ORM支持mysql几何。

披露:我在D2-Spatial和Leaflet.Draw上工作