如何在谷歌地图API中访问这个变量?



我有一个游戏的谷歌地图网络应用程序,用户将单击谷歌地图标记,在弹出的窗口中进行选择,然后单击提交。它使用 AJAX 使用用户选择的信息更新数据库。数据库中预填充了已加载的标记名称和 GPS 坐标。标记也会在通过 XML 加载时相应地放置。

我在提交数据库中名为quest的行更新时遇到问题,其中包含用户选择的信息。目前,用户可以选择标记并提交任务,但根本不会更新数据库。我不确定要使用的正确 WHERE 语句。这是我当前的SQL语句,我正在尝试更新一个名为quest的行。

mysqli_query($con, "UPDATE markers SET quest= '$questName'  WHERE markerName = '$markerName'");

这是按下提交按钮时发生的情况。

if (document.getElementById("questType").value == 
"quest1") { //if quest1 is selected upon submission
alert("quest1");
var markerName;
var questName = "Quest 1";
xmlhttp = new XMLHttpRequest();        
xmlhttp.open("GET", "ajax.php?questName=" + questName + "&markerName=" + markerName, true);         
xmlhttp.send(); //Sending the request to the server

阿贾克斯.php

<?php 
include("connect.php");
require("call2.php");
$markerName = mysqli_real_escape_string($con, $_GET['markerName']);
$questName = mysqli_real_escape_string($con, $_GET['questName']);

$stmt = $con->prepare("UPDATE markers SET quest = $questName WHERE markerName = $markerName");
$stmt->bind_param($questName, $markerName);
$stmt->execute();
$stmt->close();
?>

这也是我的相关通话文件。

$dom     = new DOMDocument("1.0");
$node    = $dom->createElement("markers");
$parnode = $dom->appendChild($node);
include('connect.php');
$query  = "SELECT * FROM markers WHERE 1"; // Select all the rows in the markers table
$result = mysqli_query($con, $query);
if (!$result) {
die('Invalid query: ' . mysqli_error($con));
}
// Iterate through the rows, adding XML nodes for each
while ($row = mysqli_fetch_assoc($result)) {
global $dom, $node, $parnode;
$node    = $dom->createElement("marker");
$newnode = $parnode->appendChild($node);
$newnode->setAttribute("markerName", 
$row['markerName']);
$newnode->setAttribute("quest", $row['quest']);
$newnode->setAttribute("lat", $row['lat']);
$newnode->setAttribute("longg", $row['longg']);
}
header("Content-type: text/xml");
echo $dom->saveXML();

抱歉,如果这很多,我认为问题是我没有为markerName分配值。我没有收到任何错误,但是当我将鼠标悬停在 chrome 上网络选项卡中的 ajaxphp 上时,它看起来正在获取 questName,但标记名称仍未定义。

这是它加载内容的地方:

downloadUrl("call2.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("markerName"); //<------ here's where it's getting markerName
//  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("longg")));
var icon = customLabel[type] || {};
var marker = new google.maps.Marker({
map: map,
position: point,
icon: icon.icon,
shadow: icon.shadow
});
bindInfoWindow(marker, map, infoWindow, html);
}
});

我想我需要找出一种访问名称的方法,但我不确定当它位于下载 XML 文件的函数的本地时如何访问。

连接.php

<?php
$con = mysqli_connect("localhost", "root", "", "pokestop-map");
?>

首先,我认为在某些情况下,如果您的数据库关闭并且有人请求 ajax.php,您的数据库连接凭据可能会泄露。如果要在生产环境中使用代码,则永远不应将错误泄漏到客户端。另外,我不确定您是否尝试通过PHP计算字符串中变量的能力将参数添加到查询中,如果是这样,这是非常不安全的,我建议您阅读有关准备语句的信息。另外,我建议您使用PDO(http://php.net/manual/de/book.pdo.php(而不是MySQLi,但这只是一个旁注。我认为这里的问题是您没有将值绑定到查询。很久以前我使用过MySQLi,但我认为你可以做这样的事情:

$stmt = $mysqli->prepare("UPDATE markers SET quest = ? WHERE markerName = ?");
$stmt->bind_param($questName, $markerName);
$stmt->execute();
$stmt->close();

编辑: 我建议您查看ORM库,它允许您将表中的行映射到PHP中的对象。其中有一些,如教义或成语。使用对象要简洁得多。但无论如何,我也写了一些代码可能会对你有所帮助,但我不得不说它没有经过测试。

DB.php(在单例模式中保存PDO,用于与数据库通信(:

require_once('Config.php');
class DB {
private static $_instance = null;
private $_pdo;
private function __construct() {
try {
$this->_pdo = new PDO('mysql:host=' . Config::getDbHost() . ';dbname=' . Config::getDbName(), Config::getDbUser(), Config::getDbPass());
} catch(PDOException $e) {
die($e->getMessage());
}
}
public static function getInstance() {
if(!isset(self::$_instance)) {
self::$_instance = new DB();
}
return self::$_instance;
}
/**
* @return PDO
*/
public function getPdo()
{
return $this->_pdo;
}
}

Config.php(保存连接到数据库所需的设置,如果需要,可以扩展类并解析某种配置文件以填充值(:

class Config
{
private static $_dbHost;
private static $_dbName;
private static $_dbUser;
private static $_dbPass;
/**
* @return mixed
*/
public static function getDbHost()
{
return self::$_dbHost;
}
/**
* @return mixed
*/
public static function getDbName()
{
return self::$_dbName;
}
/**
* @return mixed
*/
public static function getDbUser()
{
return self::$_dbUser;
}
/**
* @return mixed
*/
public static function getDbPass()
{
return self::$_dbPass;
}
}

使用这些类,您应该能够执行以下操作:

<?php
require_once('DB.php');
$pdo = DB::getInstance()->getPdo();
$stmt = $pdo->prepare('UPDATE markers SET quest = :questName WHERE markerName = :markerName');
$stmt->bindValue('questName', $_GET['questName']);
$stmt->bindValue('markerName', $_GET['markerName']);
$stmt->execute();

正如我所说,这没有经过测试,但它应该有效。也许您必须修复包含和参数绑定...

相关内容

  • 没有找到相关文章

最新更新