Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用AJAX从Node.js调用PHP文件? 问题是:_Javascript_Php_Node.js_Ajax_Socket.io - Fatal编程技术网

Javascript 使用AJAX从Node.js调用PHP文件? 问题是:

Javascript 使用AJAX从Node.js调用PHP文件? 问题是:,javascript,php,node.js,ajax,socket.io,Javascript,Php,Node.js,Ajax,Socket.io,您好,我目前有一个网站,上面有一个使用node.js运行的游戏。它包括gulp和socket.io 我想从node.js调用一个php文件,它返回成功消息(文件中的echo),但不更新我的数据库 然而,当我通过将链接放入浏览器或从我的网站使用相同的AJAX命令调用php文件时,它工作得非常好 因此,从我的网站site.com来看,php文件工作得很好,但从我的节点服务器site.com:3000来看,它返回success,但不更新我的数据库 我知道Node与php不兼容,但可能有一个解决方法 我

您好,我目前有一个网站,上面有一个使用node.js运行的游戏。它包括gulp和socket.io

我想从node.js调用一个php文件,它返回成功消息(文件中的echo),但不更新我的数据库

然而,当我通过将链接放入浏览器或从我的网站使用相同的AJAX命令调用php文件时,它工作得非常好

因此,从我的网站site.com来看,php文件工作得很好,但从我的节点服务器site.com:3000来看,它返回success,但不更新我的数据库

我知道Node与php不兼容,但可能有一个解决方法

我还注意到,当从节点调用文件时,我的变量是空的


代码: 这是我的php文件:

subtract5.php

<?php
header('Access-Control-Allow-Origin: http://cashballz.net:3000', false);
include 'mysql.php'; 
session_start(); 

$cash_amount = $_SESSION['cash_amount'];
$userid = $_SESSION['id'];
$_SESSION['cash_amount'] -= 0.05;

$mysql = new Mysql(); 

$result = $mysql->setCashAmount($cash_amount,$userid); 
if($result) 
{ 
echo "5 cents have been subtracted!"; 
} 
else 
{ 
session_start(); 
session_unset(); 
session_destroy(); 
}
?>
<?php
class Mysql 
{ 
protected $dsn; 
protected $username; 
protected $password; 
public $db; 


function __construct() 
{ 
//change this to your info (myDBname, myName, myPass) 
$this->dns= 'mysql:dbname=cashball_accounts;host=localhost;charset=utf8'; 
$this->username= 'cashball_root'; 
$this->password= '1VeryBright*'; 
$this->db = new PDO($this->dns, $this->username, $this->password); 
} 


public function setCashAmount($cash_amount, $id) 
{ 
$sql = "UPDATE users SET cash_amount = :cash_amount - 0.05 WHERE id = :id"; 
$stmt = $this->db->prepare($sql); 
$stmt->bindParam(':cash_amount', $cash_amount, PDO::PARAM_STR); 
$stmt->bindParam(':id', $id, PDO::PARAM_STR); 
$result = $stmt->execute(); 
return $result; 
} 

} 
?>

结论: 我需要一种方法来正确运行php脚本并直接从node.js更新数据库。我在github上看到过使用文件的解决方案,但我不知道这是否是正确的解决方案,也不知道如何在我的代码中实现它们。也许有一种方法可以通过ajax在后台的不同域调用php文件

我是PHP初学者,JS不错,所以请添加详细答案

谢谢你的帮助

那我想知道什么

$result = $stmt->execute(); 
从节点调用sql语句时,sql语句是什么?您可以调试它(从节点调用时)

我猜是这样

$_SESSION

从节点调用时为空

正如您在某些注释中所述,
$\u会话
变量为空。假设node.js中有相同的可用数据(id和现金金额),您可以将其与AJAX调用一起传递,如下所示:

//cut 5 cents from account - php function
    $.ajax({
    type: "POST",
    url: 'http://cashballz.net/game/5game/subtract5.php',
    data: {
        'id' : 'someid_probablyasint',
        'cash_amount' : 'someamount_probablyasint'
    }, 
    success: function (data) {
        alert(data);
    }
});
然后,您可以访问通过php文件中的
$\u POST
传递的变量——因为
键入:“POST”
。大致如下:

<?php
header('Access-Control-Allow-Origin: http://cashballz.net:3000', false);
include 'mysql.php';

$cash_amount = $_POST['cash_amount'];
$userid = $_POST['id'];
$new_cash_amount = $cash_amount - 0.05;

$mysql = new Mysql();

$result = $mysql->setCashAmount($cash_amount, $userid);
if ($result) {
    echo json_encode([
        'new_cash_amount' => $new_cash_amount,
        'message' => '5 cents have been subtracted!'
    ]);
} else {
    echo json_encode(['error' => 'Huge error.']);
}
?>


您应该将每个实体划分为自己的类,而不是一个通用的Mysql类。但除此之外。。您是否在整个函数中转储了var_以查看实际发生的情况?是的,因此从node.js调用时$_会话变量为空。是的,从node.js调用文件时,未定义所有$_会话变量。我在哪里可以检查sql语句?我是PHP的初学者,所以我有点困惑。不知道。。您使用的是某种数据库抽象层类。问题是我不知道如何将变量从我的网站安全地传递到node.js游戏。我需要一种方法来传递会话变量,因为我在php代码中也会影响它们,所以这个解决方案对我不起作用。我需要一种方法来调用php文件,就像我只是把链接放在后台一样?我真的不知道我是否能想出如何让它与AJAX一起工作,这会更好,因为如果我需要将数据传递到文件,这是可能的。如果你需要将它传递到你的
节点.js
游戏,你可以发出另一个AJAX请求来获取这些数据,假设你在游戏中有
用户id
。或者,您只能从游戏中传递
用户id
,并根据该信息运行查询。
<?php
header('Access-Control-Allow-Origin: http://cashballz.net:3000', false);
include 'mysql.php';

$cash_amount = $_POST['cash_amount'];
$userid = $_POST['id'];
$new_cash_amount = $cash_amount - 0.05;

$mysql = new Mysql();

$result = $mysql->setCashAmount($cash_amount, $userid);
if ($result) {
    echo json_encode([
        'new_cash_amount' => $new_cash_amount,
        'message' => '5 cents have been subtracted!'
    ]);
} else {
    echo json_encode(['error' => 'Huge error.']);
}
?>