【问题标题】:PHP loop through array to update SQL databasePHP循环遍历数组以更新SQL数据库
【发布时间】:2017-06-28 13:33:01
【问题描述】:

我正在尝试遍历与数据库中的玩家行相对应的数组 ($lineup_selected)。对于每个玩家,我想对数据库执行一个 UPDATE 查询,将 $submissions_selected 的值添加到 total_picks 列。我正在努力处理代码,因为它无法执行查询。请帮忙?!

// Select team & formation
$team_selected = "team1";
$lineup_selected = array("player1", "player2", "player3");
$submissions_selected = 4000;

    // Loop through and update total_picks for each player in database present in lineup_selected array
    $player_picks_query = "SELECT full_name, total_picks FROM table WHERE team=$team_selected";
    $result = mysqli_query($conn, $player_picks_query);

    while($row = mysqli_fetch_assoc($result)) {

        $player = mysql_real_escape_string($row["full_name"]);

        $add_player_picks = "UPDATE table 
                    SET total_picks = total_picks + $submissions_selected
                    WHERE full_name = '$player'";

    }

【问题讨论】:

  • 嗯.. 你在哪里执行$add_player_picks ?
  • 实际上看起来错误在第一个查询中!!! WHERE team=$team_selected"; 应该在 $team_selected 周围加上引号,就像这样 WHERE team='$team_selected'";
  • 我尝试添加引号,但没有任何区别。我希望 $add_player_picks 每个循环执行一次。这样循环就会一个接一个地遍历 $lineup_selected 数组中的每个玩家,在数据库中找到该玩家并将 $submissions_selected 添加到 total_picks 列中
  • 你没有执行你的最后一个查询
  • 那我该如何执行呢?

标签: php mysql loops foreach


【解决方案1】:

为什么不:

UPDATE table
SET total_picks = total_picks + $submissions_selected
WHERE team = '$team_selected'

这样,您只需执行一个查询并让您的数据库执行循环。否则,您将首先选择一些记录,然后让您的数据库更新每个记录以更新记录。

我假设全名是唯一的。如果不是,则意味着您的版本可以让更新查询每次修改多条记录,因此我的方法无效

--我似乎重复了很多 cmets 声明要清理和转义您的输入以保存(r)。

编辑: 结合起来应该是:

// set team & formation
$team_selected = "team1";
$lineup_selected = array("player1", "player2", "player3");
$submissions_selected = 4000;



$updatequery = "UPDATE table
                SET total_picks = total_picks + ?
                WHERE team= ?";

$stmt = mysqli_prepare($updatequery);
mysqli_stmt_bind_param($stmt, "is", $submissions_selected, $team_selected);

/* execute prepared statement */
mysqli_stmt_execute($stmt);

我自己更喜欢 pdo 方法,但语法应该是这样的。

【讨论】:

  • 这没有回答问题,你也没有解释你的答案。您的答案还包含会导致 SQL 查询出错的语法错误($team_selected 应该用引号引起来)。您的答案还包含安全漏洞(SQL 注入),尽管原始问题也是如此。你应该向 OP 和社区的其他人指出这些安全漏洞,让每个人都能练习更安全的编码技术。
  • 我已经删除了我的反对票。你的答案看起来更好。如果您添加另一种更新表的方法(防止 SQL 注入),我会考虑投票。如果您不确定,请查看PDO 或mysqli_*。对于可以在数据库上执行的许多攻击,准备好的语句是一道很好的防线。
  • 更好的是,我赞成您的回答,因为它确实解决了 OP 的问题并改进了原始代码以增加针对 SQL 注入攻击的安全性。这应该是这个问题的公认答案(在我看来)
【解决方案2】:

在您的选择请求中,您的团队显然是一个字符串。所以,也许你可以试试你的请求:"SELECT full_name, total_picks FROM table WHERE team='$team_selected'" 我不知道 PHP 是否聪明到可以加引号。

【讨论】:

  • 我知道你不能发表评论,但这真的不是一个答案。
  • 我知道您缺少代表,但这只是一个评论。这种类型的答案会吸引反对票或被标记为我没有 DV,如果发生这种情况,您将失去代表点并且需要更长的时间才能达到您需要评论的 50 个代表任何问题。在那之前,坚持那些问得好,因此无需澄清就能轻松回答的问题。 meta.stackexchange.com/questions/214173/…
  • 哦,感谢您提供此信息@RiggsFolly。我编辑我的答案。
【解决方案3】:

我认为如果你只使用更新语句会更好。

首先你内爆你的数组

$lineup_selected = array("player1", "player2", "player3");

$players='".implode("','",$lineup_selected )."';

现在你可以更新表格了

$updateStmt="UPDATE table 
SET total_picks = total_picks + $submissions_selected
WHERE full_name in (".$players.") and team=".$team_selected.";

【讨论】:

  • 只有我还是这条线:$players='".implode("','",$lineup_selected )."'; 看起来有点破?您的答案也允许 SQL 注入。直接上。让我们让Bobby Tables 告诉你如何
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2012-11-14
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多