PHP / MySQL:用随机值更新每一行 - foreach not working(更新所有具有相同值的行)

时间:2016-06-22 17:27:42

标签: php mysql random sql-update

我的MySQL数据库中有大约1000条记录。我最近添加了一个名为 UniqueKey 的新列,我希望使用随机的唯一键更新表中的所有行。

这就是我得到的:

$updatequery = "SELECT * FROM pictures";
    $resultt = $conn->query($updatequery);

    while ($roww = $resultt->fetch_array()) {
        $rowws[] = $roww;
    }

    foreach($rowws as &$roww) {
        $UniqueKey = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 6);
        $sqlupdate = "UPDATE pictures SET UniqueKey = '$UniqueKey'";
        mysqli_query($conn, $sqlupdate);

    }

这里的问题如下。它会创建一个 UniqueKey ,但它会将这个新的随机值上传到我的所有行。我怎么能这样做?:

  • 通过$ UniqyeKey生成随机密钥
  • 将此键插入第一行
  • 重新生成一个新密钥并将其插入下一行
  • 等等

提前致谢!一直试图解决这个问题几个小时..

5 个答案:

答案 0 :(得分:4)

如果没有where子句,更新将更新所有记录。因此,请从以下位置更新您的查询:

UPDATE pictures SET UniqueKey = '$UniqueKey'

为:

UPDATE pictures 
SET UniqueKey = '$UniqueKey' 
where id = ?

或类似的东西,它标识每次要更新的一条记录。

此外,您不需要foreach,请在while循环中完成所有操作。

答案 1 :(得分:4)

无需使用额外的foreach循环。您可以在while循环中完成所有工作,如下所示:

 while ($roww = $resultt->fetch_array()) {
       $UniqueKey = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 6);
        $sqlupdate = "UPDATE pictures SET UniqueKey = '$UniqueKey' WHERE id = '".$roww['id']."'";
        mysqli_query($conn, $sqlupdate);
    }

注意:给定示例假定id是表格中的主键。您可以相应地更改

相关:Setting value for one column of all records in table

答案 2 :(得分:3)

其他人已经解决了一次更新所有行的问题。 但是如果你真的想拥有唯一值,我建议在你的UniqueKey列中添加一个UNIQUE约束。

此外,你可以将你的一代唯一密钥和更新查询放在一个do-while循环中,如下所示:

collection.remove({_id: studentId.toString()},  function(err) {... 

这两个步骤的组合将确保密钥是唯一的并且已正确插入数据库中。

答案 3 :(得分:2)

您需要设置Where子句以更新所需的行。 Foreach只会遍历您从select中获得的结果集,而您实际上并不在数据库中。当你这样做

$updatequery = "SELECT * FROM pictures";
$resultt = $conn->query($updatequery);

您正在为$ resultt分配该查询的结果,您实际上并未在内部'数据库。然后,当您查询:

$sqlupdate = "UPDATE pictures SET UniqueKey = '$UniqueKey'";
mysqli_query($conn, $sqlupdate);

您正在将所有UniqueKeys更新为同一个。你的foreach循环什么都不做,它只循环你的结果集并更新关键$ rowss次。基本上,您正在更新所有键#rowss次。我假设你的桌子上有自动增量ID?

如果是这样,您可以删除foreach循环并将其替换为:

$idresult = $conn->query("SELECT id FROM pictures");

while ($row = $idresult->fetch_assoc()){
   mysqli_query($conn, "UPDATE pictures SET UniqueKey = '$UniqueKey' WHERE id = " . $row['id'];
}

答案 4 :(得分:1)

您正在更新每一行,因为您没有使用WHERE子句。

做这样的事情:

foreach($rowws as &$roww) {
  $UniqueKey = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 6);
  $sqlupdate = "UPDATE pictures SET UniqueKey = '$UniqueKey' WHERE primary_key=".$rowws['primary_key'];
  mysqli_query($conn, $sqlupdate);
}

primary_key是表格的PK列。