我有一个用于游戏的google maps网络应用程序,用户将单击google map标记,在弹出的窗口中进行选择,然后单击Submit。它使用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();
很抱歉,如果很多,我认为问题是我没有为 markerName 分配值。我没有收到任何错误,但是,当我将鼠标悬停在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");
?>
答案 0 :(得分:0)
首先,我认为在某些情况下,如果您的数据库关闭并且有人请求ajax.php,则您的数据库连接凭据可能会泄漏。如果要在生产环境中使用代码,则永远不要将错误泄露给客户端。另外,我不确定您是否要通过PHP评估字符串中变量的功能来尝试将Params添加到查询中,如果这样做是非常不安全的,那么我建议您阅读Prepared Statements。另外,我建议您使用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中的对象。其中有一些类似Doctrine或Idiorm。使用对象要干净得多。但是无论如何,我还编写了一些可能对您有帮助的代码,但是我不得不说它未经测试。
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并解析某种配置文件以填充值):
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();
正如我所说,这未经测试,但应该可以。也许您必须修复包含和参数绑定...