【问题标题】:PHP PDO updating multiple records instead of onePHP PDO 更新多条记录而不是一条
【发布时间】: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 &raquo;" 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)

标签: php mysql sql pdo


【解决方案1】:

where 子句之前的更新语句中有一个分号 (;)。这会将您的语句分成两个语句 - 一个 update 没有 where 子句,它更新所有记录(如您所述),以及一个以 where 开头的语句应该失败,因为它不是有效的 SQL .

要修复它,您应该删除该分号:

$query = " 
            UPDATE players 
            SET 
                Player_Votes = Player_Votes+1 -- Semicolon removed here
            WHERE
                ( Player_ID = :player )
        "; 

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签