0

我正在为我的游戏创建一个论坛。目前我正在研究编辑功能。我试图弄清楚如何检查登录帐户是否拥有发布消息的玩家。您发布的是您的播放器,而不是帐户。你可以有几个玩家。一个用户可以有几个“玩家”分配给他们。如果他们不拥有发布消息的玩家,我想返回 false,但如果他们拥有,则返回 true。

# table accounts
id | username | password

# table posts
id | posterid (this is the player id) | message

# table players
id | account_id | name

这就是我已经走了多远。但这无论如何都会返回 false 。有一个 ID 为 666 的帖子,发布该帖子的玩家归帐户 34767 所有。所以它应该可以工作。

function can_we_edit_post($pid) {

global $db;

// Let's see if they have permission to edit
$stmt = $db->prepare("SELECT * FROM players pl a JOIN posts p ON p.id = $pid WHERE pl.account_id = 34767");
$stmt->execute(array(34767));
$row = $stmt->fetch();

// Check if we got any rows
if ($row) {
    return true;
} else {
   return false;
}

}

if (can_we_edit_post(666)) {
   echo "You may edit this post.";
} else {
  echo "You do not own this post.";
}
4

2 回答 2

1

你有一个错误aafter pl,所以你的查询可能失败

SELECT * FROM players pl a JOIN posts p ON p.id = $pid WHERE pl.account_id = 34767
                         ^

尝试这样的事情(使用占位符来防止 SQL 注入) -

// Let's see if they have permission to edit
$stmt = $db->prepare("SELECT * FROM players pl JOIN posts p ON p.id = ? WHERE pl.account_id = ?");
$stmt->execute(array($pid, 34767));
$row = $stmt->rowCount();

看看这个 sqlfiddle - http://sqlfiddle.com/#!2/e282a1/2 - 没有a查询返回结果,a查询失败并出现错误。

编辑
它可能会true为每个玩家返回,因为你硬编码了pl.account_id-

WHERE pl.account_id = 34767

并且您没有验证是否与特定的posterid匹配,您可以通过添加 -到您的pl.idpost.idAND p.posterid = pl.idJOIN

function can_we_edit_post($pid,$aid) {

global $db;

// Let's see if they have permission to edit
$stmt = $db->prepare("SELECT * FROM players pl JOIN posts p ON p.id = ? AND p.posterid = pl.id WHERE pl.account_id = ?");
$stmt->execute(array($pid, $aid));

// Check if we got any rows
if ($stmt->rowCount()) {
    return true;
} else {
   return false;
}

}


if (can_we_edit_post(666,34767)) { // change 34767 to each player account_id ie. $player->account_id
   echo "You may edit this post.";
} else {
  echo "You do not own this post.";
}
于 2013-06-07T23:37:22.577 回答
1

您使用 PDO 错误。你应该这样做:

$stmt = $db->prepare("SELECT * FROM players pl a JOIN posts p ON p.id = :pid WHERE pl.account_id = :id");
$stmt->execute(array(':pid' => $pid, ':id' => 34767));
return (($stmt->rowCount() > 0)? true : false);

PDO 和执行是天才,因为您只需提供要替换为值的键,它就会逃脱并使其对您无害。

如果查询的其余部分正确,则此代码应该可以工作。rowCount返回查询返回的行数。如果您只想查看它是否返回任何内容,则可以使用 this 而不是 using fetch

于 2013-06-07T22:59:26.977 回答