将全局变量传递给ajax函数,发布到php,保存到数据库
Posted
技术标签:
【中文标题】将全局变量传递给ajax函数,发布到php,保存到数据库【英文标题】:pass global variable into ajax function, post to php, save to database 【发布时间】:2021-02-20 05:59:30 【问题描述】:我有一个想要传递给 Ajax 的全局变量。 Ajax 对我来说很新,我已经做了一些研究和测试,但我被困住了。对于我的第一个问题,我不知道变量是否被传递到 Ajax 函数中。
我对 Json 不是很感兴趣,但我也尝试过,但也不正确。
我不希望从 php 获得对页面的响应,该页面正在使用现有的 js 和 html 进行更新。
我的第二个难题是我的 php 文件在它应该被激活的时候被激活,但是它将 0 发布到数据库字段中。这里的另一个问题也是它正在将所有用户的钱更新到同一个 0 条目,所以它的 isset 设置还没有正确设置。我相信我的 bindValue 编码正确,我真的不确定是否需要将 POST 分解到 php 页面,如果需要,如果我必须使用该值,我该怎么做?另外,当我添加 WHERE userid = userid 来更新游戏时,游戏会完全停止。
我们将不胜感激任何帮助,即使是一个小的修复。
这里是文件。提前感谢您帮助我了解 Ajax。
game.js
money = 2000;
function updateMoney()
if ( pot <= 0 )
if ( money <= 0 )
document.getElementById("aaa").innerHTML = "Lost? Here's A Loan !!!";
money = 1000 ;
document.getElementById("money").innerHTML = money;
function enterWager() // doMath function inside here
var x=parseInt(document.getElementById('textbox').value,10); // Displays the textbox for placing a
wager
if (money <= 0)
x = 0 ;
document.getElementById("bet").innerHTML = parseInt(x,10);
if(isNaN(x)||x < 1 || x > 250)
document.getElementById("aaa").innerHTML = "You're Out Of Money!!!";
document.getElementById("textbox").style.display = 'none';
document.getElementById("button").style.display = 'none';
function doMath() // PVPCoinTransaction() and
transferCoins() are off right now. Plus 4 tests failed
and
are also off at end of function.
if (pot == 0)
countWagers = 0;
if (money <= 0)
money = 0 ;
if (x > money)
x = money ;
money = money - x;
pot = pot + x;
doMath()
function updateDatabase()
// POST test not working
// $.ajax(
// url: 'php/credits/credit.php', //
// type: "POST",
// dataType:'json', // add json datatype to get json
// data: (money: 145), Do I put div here and how?
// success: function(data)
// I dont need to return anything, just update db field!
//
//);
// this section reaches php but posts 0 into database field
//data = money // I don't think this is working.
if (window.XMLHttpRequest) // Mozilla, Safari, ...
xml = new XMLHttpRequest();
else if (window.ActiveXObject) // IE 8 and older
xml = new ActiveXObject("Microsoft.XMLHTTP");
xml.open("POST", "../php/credits/credit.php", true);
xml.setRequestHeader("Content-type", "application/x-
www-form-urlencoded");
xml.send(money);
updateMoney()
updateDatabase()
credit.php
<?php
session_start();
if(empty($_SESSION['userid'])) // check user login
header("Location: ../login/index.php");
include('../../login/database.php');
if (isset($_SESSION['userid']))
// $money = null;
// $money = $_POST['money'];
try
$db = DB();
header("Content-Type: application/json");
$stmt = $db->prepare("UPDATE usersystem SET money=:money");
$stmt->bindValue(':money', $_POST['money'], PDO::PARAM_STR);
$stmt->execute();
catch(PDOException $e)
$db = null;
echo $e->getMessage();
?>
【问题讨论】:
您正在使用支持古老浏览器的代码。这是一个限制条件还是您可以使用更现代的技术? 【参考方案1】:您的服务器在您的 $_POST
数组中需要一个名为 money
的密钥。这意味着为了正确接收数据,您还需要使用密钥发送数据。在 PHP 中,此数据看起来像一个关联数组,而在 javascript 中则像一个对象,既有键又有值。
实现键值结构的最简单方法是创建一个具有key=value
结构的字符串。这类似于表单将数据发送到服务器的方式,无需在后端进行任何修改即可接收数据。
var package = `money=$money`;
XMLHttpRequest
没有错(ActiveXObject
有;)),我建议学习Fetch API。它是向服务器发出 HTTP 请求和从服务器发出 HTTP 请求的更新和简化规范。您已表明您不需要接收响应,这意味着带有发送数据的基本 POST 请求如下例所示。
fetch('../php/credits/credit.php',
method: 'POST',
body: package
);
第一个参数是 URL,第二个是选项对象。 method
属性不言自明。 body
属性是您要发送的数据(类似于 xml.send(package);
)。
现在,如果您的 URL 正确,则应将包含正确数据的 HTTP 请求发送到您的服务器。
// $_POST should have received data, and because you've send it as a
// key-value it will be represented as an associative array with,
// you guessed it, keys and values.
$money = $_POST[ 'money' ];
// $money will always be a string in this form, so you'll
// need to convert it if you need it to be a number.
$money_as_number = intval( $money );
要测试这是否有效,请在浏览器的开发人员工具中打开 network
选项卡。您可以检查是否发生了 HTTP 请求并检查是否已发送正确的 payload。
【讨论】:
感谢您的友好回复。我将尝试实现这一点并研究 Fetch。 你的代码和我的代码让我绊倒 - 字符串。您的代码向后看。 “完成键值结构是创建一个具有键=值结构的字符串。var package =money=$money
;”我看到全局 'money = 2000' 正在作为 $money 传递到您的提取代码中,然后您正在将其转换为“金钱”,然后将其传递给“包裹”。但我也看到'money' 是我的数据库字段并且由$money 填充。因为我现在将包传递给它,所以我现在需要对我的 php 文件做更多的事情吗?还是我必须像 var $money=money 一样转换?
money=$money
正在使用字符串插值。这意味着结果将是一个类似于"money=2000"
的字符串。这与将字符串与数字组合在一起的"money=" + money
相同。前者是一种较新的语法,称为Template Literals。您可以将该字符串直接传递给 body
属性,但我认为将其存储在名为 package
的变量中会提供更多上下文,以向您展示数据是如何发送的。
PHP 端现在应该看到$_POST
变量已经接收到数据(因为它不会为空)。由于您的数据现在是结构化的,您可以使用$money = $_POST[ 'money' ]
选择它。但是该值将是一个字符串,因此如果您希望它是一个数字,您可能需要添加一些转换。【参考方案2】:
好的,这就是控制台中的工作原理......
function updateDatabase()
var package = money;
console.log(package);
fetch('../php/credits/credit.php',
method: 'POST',
headers:
'Accept': 'application/json',
'Content-Type': 'application/json'
,
body: JSON.stringify(package)
);
控制台日志 = 1975 game.js:1608:9
我现在只需要将 1975 年的值通过我的 php 发布到数据库。它仍在将 0 发布到我的数据库中。
【讨论】:
【参考方案3】:我解决了。感谢您让我走上正确的道路!
<?php
session_start();
if (isset($_SESSION['userid']))
$money = json_decode(file_get_contents('php://input'), true);
$money_as_number = intval( $money );
$userid = $_SESSION['userid'];
try
$db = DB();
$stmt = $db->prepare("UPDATE usersystem SET money=:money WHERE userid=:userid");
$stmt->bindValue(':money', $money_as_number, PDO::PARAM_INT);
$stmt->bindValue(':userid', $userid, PDO::PARAM_STR);
$stmt->execute();
catch(PDOException $e)
$db = null;
echo $e->getMessage();
?>
【讨论】:
以上是关于将全局变量传递给ajax函数,发布到php,保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章