【问题标题】:How can I access this variable in Google Maps API?如何在 Google Maps API 中访问此变量?
【发布时间】:2018-08-15 18:55:52
【问题描述】:

我有一个用于游戏的谷歌地图网络应用程序,用户将单击谷歌地图标记,在弹出的窗口中进行选择,然后单击提交。它使用 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

ajax.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();

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

这里是它加载东西的地方:

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 文件的函数的本地时如何。

connect.php

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

【问题讨论】:

    标签: javascript ajax google-maps


    【解决方案1】:

    首先,我认为在某些情况下,如果您的数据库已关闭并且有人在请求 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();
    

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

    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();
    

    正如我所说,这未经测试,但它应该可以工作。也许您必须修复包含和参数绑定...

    【讨论】:

    • 我实现了,现在我得到了这个错误 --> 致命错误:在线调用 C:\wamp64\www\questmap\ajax.php 中布尔值的成员函数 bind_param() 22
    • 您使用某种调试器吗?调用 $mysqli->prepare 后可以设置断点吗?看起来这会返回一个布尔值。这可能有几个原因,你能添加你的新 Ajax.php 吗?
    • 我使用谷歌浏览器上的检查选项卡,我添加了新的 ajax
    • 您也可以添加您的connect.php吗?也使用我写的查询,?是未绑定值的占位符。然后 bind_param 将通过其数字索引绑定值(但这不是布尔值的原因)。对于调试,我推荐 PhpStorm、Visual Studio Code 或 NetBeans。 ChromeDebugger 只是客户端,但 PHP 被解释为服务器端。
    • 谢谢,我添加了我的连接,因为我有 config.php,我不再需要它了吗?目前我已经实现了代码它什么也没发生,所以我正在学习如何使用netbeans
    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2016-11-30
    相关资源
    最近更新 更多