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

Correct PDO Syntax for Updating an Array of primary keys.

每当我的 Facebook Canvas 游戏中发生特定事件时,

Hi_I 正在尝试 运行 我的数据库中的 PDO 更新,但我 运行 进入我的语法有些困难,希望这里有人能提供帮助。

我有一个名为 Balance 的 table。此 table 包含以下列:facebookIDgoldbalanceinvite。 这个table存储的是每个玩家的金币余额,invite栏记录的是玩家是否向其他玩家发送了成功(接受)的游戏邀请。

我目前正在做的是:当新玩家加入游戏时,我 运行 检查 Facebook 的图表 API 以查看哪些(如果有)其他玩家邀请了这个新玩家玩家,如果他们有,那么我获取他们的 ID,然后执行 AJAX post 将他们发送到 PHP 文件,我想在其中奖励这些玩家的 goldbalance通过 +100 金币,我还想将他们的 invite 列从 0 更改为 1(这将导致显示一个弹出窗口,在他们下次登录时通知他们奖励进入游戏)。

现在我成功地将邀请发送者的 ID 作为数组发送到我的 PHP 文件,但是我无法成功地对玩家的黄金余额进行 PDO 更新。

这是我的 AJAX 代码,用于发送数组中的 ID:

// requestid is the Array containing the sender IDs
   $.ajax({
    url: 'scripts/requestreward.php',
    data: {'requestid' : requestid},
    type: "POST",
    success: function(response){

        alert(response);
                }
   });

这是我当前的 PDO PHP 文件:

<?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;
?>

我一直在尝试将此作为准备好的 PDO 语句来执行,因为我读过它更安全,但我很确定我对数组中的每个项目都错误地执行了更新循环。

此外,我不确定这条线是否是将玩家的金币余额(即 INT)增加 100 的正确方法:SET `goldbalance` = `goldbalance` + 100,

如能提供任何帮助,我们将不胜感激,在此先感谢您!

您的语法无效 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 注入 的攻击。在将数据用于查询之前,您应该了解如何从用户输入中清理数据。