更正用于更新主键数组的PDO语法。

时间:2015-05-26 14:31:31

标签: php arrays ajax pdo prepared-statement

Hi_I我试图在我的Facebook Canvas游戏中发生某个事件时在我的数据库上运行PDO更新,但我的语法遇到了一些困难,我希望有人可以提供帮助。

我有一个名为Balance的表。此表包含以下列:facebookIDgoldbalanceinvite。 此表存储每个玩家的黄金余额,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; ?>

对此有任何帮助将非常感谢,提前谢谢!

1 个答案:

答案 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注入。在查询中使用数据之前,您应该先了解如何从用户输入中清除数据。