Hi_I我试图在我的Facebook Canvas游戏中发生某个事件时在我的数据库上运行PDO更新,但我的语法遇到了一些困难,我希望有人可以提供帮助。
我有一个名为Balance
的表。此表包含以下列:facebookID
,goldbalance
和invite
。
此表存储每个玩家的黄金余额,invite
列记录玩家是否已将成功(已接受)游戏邀请发送给其他玩家。
我目前正在做的是:当一个新玩家加入游戏时,我会对Facebook的Graph API进行检查,看看哪个(如果有的话)其他玩家邀请这个新玩家,如果他们有,那么我抓住他们的ID,然后做一个AJAX帖子将它们发送到PHP文件,我想要奖励这些玩家的goldbalance
+100金币,我还想从{{1}更改他们的invite
列} 0
(这将导致弹出窗口显示,并在下次登录游戏时通知他们奖励。)
现在我已成功将邀请发件人的ID作为数组发送到我的PHP文件中,但是我无法成功地对玩家的黄金余额进行PDO更新。
这是我的AJAX代码,它在一个数组中发送ID:
1
这是我目前的PDO PHP文件:
// requestid is the Array containing the sender IDs
$.ajax({
url: 'scripts/requestreward.php',
data: {'requestid' : requestid},
type: "POST",
success: function(response){
alert(response);
}
});
我一直试图将此作为准备好的PDO声明,因为我已经读过这样更安全,但我很确定我正在进行更新不正确地循环数组中的每个项目。
另外,我不确定这条线是否是将玩家的黄金平衡(即INT)增加100的正确方法:<?php
$servername = myservername;
$username = myusername;
$password = mypassword;
$dbname = mydbname;
//Create connection:
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("UPDATE `Balance`
SET `goldbalance` = `goldbalance` + 100,
`invite` = 1,
WHERE `facebookID` = :requestId,
foreach($_POST['requestid'] as $requestId){
`facebookID`="($requestId)"; }");
$stmt->bindParam(':requestid', $requestid);
$requestid = $_POST['requestid'];
$stmt->execute();
$conn->commit();
echo "Success";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
对此有任何帮助将非常感谢,提前谢谢!
答案 0 :(得分:2)
您的语法不是有效的PHP语法。您不能在字符串中创建foreach
。
使用占位符编写语句,然后根据需要多次遍历所有requestId
执行语句。
看看这段代码,它应该可以正常工作。
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("UPDATE `Balance`
SET `goldbalance` = `goldbalance` + 100,
`invite` = 1
WHERE `facebookID` = :requestId");
$stmt->bindParam(':requestId', $requestId);
foreach($_POST['requestid'] as $r) {
$requestId = $r;
$stmt->execute();
}
echo "Success";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
此外,由于您没有开始交易,因此$con->commit()
无效。
关于安全性的说明
正如Marc B在评论中说的那样,您的代码容易受到SQL注入。在查询中使用数据之前,您应该先了解如何从用户输入中清除数据。