【问题标题】:Writing JavaScript code using PHP echos (for leaflet map points)使用 PHP echos 编写 JavaScript 代码(用于传单地图点)
【发布时间】:2017-06-19 10:46:53
【问题描述】:

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

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

在 MySQL 中,我存储了坐标,然后我尝试编写以下代码:

    <?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();";
     }
?>

此代码插入到&lt;script type="text/javascript"&gt;,而不是外部文件中。

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

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

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

【问题讨论】:

  • 为什么不使用 ajax 来调用您的 php 文件。让 php 返回坐标,以便您可以在使用 ajax 的过程中处理它们......
  • 我会试试的,谢谢你的时间
  • 停止使用已弃用的 mysql_* API。使用 mysqli_* 或 PDO。然后,您可以避免与此库相关的安全问题,并使用参数化查询来正确保护自己免受 SQL 注入攻击。尽管此处显示的查询不易受到攻击,但您编写的任何依赖变量来完成查询的内容都将很容易遭到黑客攻击。 mysql_ 在 PHP7 中也被完全删除了,所以当你升级到这个版本时,你的代码将完全停止工作。
  • 我知道mysql_不如mysqli_,我在我的编程课程第二年,第一年都是C#和ASP.net,今年是PHP,我的老师教我们使用 mysqli_,但我不知道为什么我更喜欢 mysql_,但我认为你是对的,是时候升级了,如果在进行更改后一切正常,我会警告你,谢谢你的时间

标签: javascript php mysql leaflet leaflet.draw


【解决方案1】:

有没有更好的使用 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 代码中设置断点并检查该变量的值。

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

【讨论】:

  • $featureCollection["features"].push($feature);
  • 我说我的 PHP 生锈了,所以是的,应该是 array_push($featureCollection["features"], $feature)。甚至$featureCollection["features"][] = $feature
【解决方案2】:

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

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

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

【讨论】:

  • 我已经用你刚才的解释解决了这个问题!我必须越来越深入地了解传单和 geojson 文档确实了解如何执行此操作,我将您的答案标记为正确的答案
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 2019-10-07
  • 2016-05-05
  • 1970-01-01
  • 2012-05-22
  • 2016-11-24
  • 2019-04-21
  • 1970-01-01
相关资源
最近更新 更多