【发布时间】:2014-08-03 11:27:14
【问题描述】:
我正在为大学作业制作一个基本的投票脚本,但不知何故我无法更新单行 SQL。相反,所有行都是更新的。
所以这里我们得到了脚本的第一部分,它从选定的投票 ID 中提取所有相关记录。让我们将此脚本称为 show.php
<?php
$pid = (int)$_GET['pid'];
$query = "
SELECT
Player_ID,
Player_Name
FROM players WHERE Team_ID = :pid
";
$query_params = array(
':pid' => $pid,
);
try
{
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch(PDOException $ex)
{
die("Failed to run query: " . $ex->getMessage());
}
$rows = $stmt->fetchAll();
?>
<div class="container contain well">
<h3>Please select player</h3>
<form action="vote.php" method="post">
<input type="hidden" name="pid" value="<?php echo $_GET['pid']; ?>" />
<?php foreach($rows as $row): ?>
<input type="radio" name="player" value="<?php echo $row['Player_ID']; ?>" id="<?php echo $row['Player_ID']; ?>"><label for="<?php echo $row['Player_ID']; ?>"><?php echo $row['Player_Name']; ?></label><br>
<?php endforeach; ?>
<input type="submit" value="Vote »" class="btn btn-primary" />
</form>
</div>
现在用户选择他希望为脚本投票的玩家发送一个 POST 请求让我们说 vote.php
<?php
require("database.obj.php");
$pid = (int)$_POST['pid'];
$query = "
UPDATE players
SET
Player_Votes = Player_Votes+1;
WHERE
( Player_ID = :player )
";
$query_params = array(
':player' => $_POST['player']
);
try
{
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch(PDOException $ex)
{
die("Failed to run query: " . $ex->getMessage());
}
header("Location: results.php?pid=$pid");
die("Redirecting to results.php?pid=$pid");
最后是显示结果的 results.php 页面
$pid = (int)$_GET['pid'];
$query = "
SELECT
Player_ID,
Player_Name,
Player_Votes
FROM players WHERE Team_ID = :pid
";
$query_params = array(
':pid' => $pid,
);
try
{
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch(PDOException $ex)
{
die("Failed to run query: " . $ex->getMessage());
}
$rows = $stmt->fetchAll();
?>
<div class="container contain well">
<h3>Player results</h3>
<?php foreach($rows as $row): ?>
<p><?php echo $row['Player_Name']; ?>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $row['Player_Votes']; ?>" aria-valuemin="0" aria-valuemax="100" style="width:<?php echo $row['Player_Votes']; ?>%;">
<?php echo $row['Player_Votes']; ?> Votes
</div>
</div>
<?php endforeach; ?>
</div>
问题出在 show.php 或 vote.php(vote.php 处理 UPDATE 查询),但我不确定问题出在哪里。正如我所说的,数据被插入到 Players_Votes 中,但它被插入到与假设 Team_ID = 1 相关的所有 5 名球员中
有人可以帮我吗?提前致谢。
【问题讨论】:
-
@Tanatos 不。 $query_params 从无线电输入中获得 $_POST
UPDATE语句看起来是正确的 - 您是否检查了您的牌桌以确保所有玩家实际上都有不同的Player_ID值(假设是这样,因为这可能是一个 PK)。您是否在尚未上传最新文件版本的托管环境中工作和测试(这里也经常发生这种情况)?@MichaelBerkowski 每个玩家都有一个唯一的 Player_ID(int 2,primary,AI)。 Team_ID 是静态的,对应于球员球队 Ex:巴西 = 1,德国 = 2。无论我出于某种原因尝试什么,它都会更新每个球员的所有投票,即使它被赋予了它应该更新的 ID。老实说,我讨厌 PDO 与旧的好 mysql_* 相比如此令人困惑,但对于这个任务,它需要在 PDO 中。它也在本地主机上运行,因此它始终是最新更新的代码。暂时,将UPDATE语句更改为在where 子句中使用静态值:WHERE Player_ID = 2(然后您需要将空数组或空数组传递给execute())- 只有玩家2 那更新了?@MichaelBerkowski 不。它仍然会更新所有内容。如果我运行 Player_Votes = +1;无论我重新提交多少次,它都会将所有内容更新为 1 并保持为 1。如果我运行 Player_Votes = Player_Votes+1;它会以数字方式更新所有内容(2,3,4)