将全局变量传递给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,保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

将变量从 PHP 传递到 AJAX 成功函数

无法使用 AJAX 将 JS 变量传递给 PHP

将 AJAX 变量传递给 PHP

Javascript将选项传递给变量并使用php保存到txt文件

关于ajax请求数据,并将数据赋值给全局变量的一些解决方法

异步请求的数据,并将数据赋值给全局变量的一些解决方法