使用 PHP 回声编写 JavaScript 代码(用于传单地图点)
Writing JavaScript code using PHP echos (for leaflet map points)
我正在尝试在 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();";
}
?>
此代码插入到 <script type="text/javascript">
,而不是外部文件。
我正在使用这个过程,以便在后台我可以对地图点进行增删改查。
我已经搜索并发现 php 回声在 javaScript.
中不起作用(或者至少我接近它的方式)
是否有使用 PHP 编写 javaScript 代码的更好方法?
is there a better way to write javaScript code using PHP?
是的。你没有。
虽然从 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 代码运行之前检查该变量的值。
这不是唯一可用的模式。但是,这将防止您犯错误。
我建议编写一个 javascript 层来从您的 php/crud 服务器请求 geojson,而不是尝试将 geojson 嵌入到 php 构造的响应中。您将更好地分离关注点,如果您有兴趣,有几个 php 框架和库能够生成 geojson 或促进 crud 系统。
EX:Doctrine2-Spatial for Doctrine ORM 支持 mysql 几何。
披露:我从事 D2-Spatial 和 Leaflet.Draw
我正在尝试在 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();";
}
?>
此代码插入到 <script type="text/javascript">
,而不是外部文件。
我正在使用这个过程,以便在后台我可以对地图点进行增删改查。
我已经搜索并发现 php 回声在 javaScript.
中不起作用(或者至少我接近它的方式)是否有使用 PHP 编写 javaScript 代码的更好方法?
is there a better way to write javaScript code using PHP?
是的。你没有。
虽然从 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 代码运行之前检查该变量的值。
这不是唯一可用的模式。但是,这将防止您犯错误。
我建议编写一个 javascript 层来从您的 php/crud 服务器请求 geojson,而不是尝试将 geojson 嵌入到 php 构造的响应中。您将更好地分离关注点,如果您有兴趣,有几个 php 框架和库能够生成 geojson 或促进 crud 系统。
EX:Doctrine2-Spatial for Doctrine ORM 支持 mysql 几何。
披露:我从事 D2-Spatial 和 Leaflet.Draw