【问题标题】:Calling a function for each MySQL row为每个 MySQL 行调用一个函数
【发布时间】:2016-04-02 11:45:12
【问题描述】:

我有一个标准的 MySQL 数据库,大约有 60 行(如在用户帐户中)。当我第一次这样做时,我犯了将会话 ID 与简单帐户 ID 相同的错误,现在我想修复我的错误,我显然不会通过 60 行来重置它们不同的安全会话 ID,所以我编写这个函数:

function generate_sessionid(){
    return bin2hex(openssl_random_pseudo_bytes(32));
}

function assign_all_sessionids(){
    $sessionid = generate_sessionid();

    $conn = sql_connect();
    $result = mysqli_query($conn, "UPDATE accounts SET sessionid='$sessionid' WHERE 1");
    sql_disconnect($conn);
}
assign_all_sessionids();

问题:数据库中的每个帐户都获得与其他帐户相同的随机会话 ID。如何让它回忆每一行的函数,以便让它对每一行都是随机的?

【问题讨论】:

  • Where 1 表示账户1或2或n没有区别。它正在更新具有相同价值的所有内容。每个帐户都需要一个循环和一个正确的 WHERE 子句。 MySql Update
  • 您应该为数据库中的每个条目再次执行 UPDATE 命令,并使用 WHERE 子句准确标识一个条目。因此,您必须为每个命令提供 1. 帐户 ID 和 2. 会话 ID。但是我不明白的是:为什么会话 ID 对于帐户来说应该是不变的?会话 ID 通常由服务器或权限在会话创建时创建。它们不能重复使用。
  • 嗯,我是网站制作新手,不太了解超级安全的会话 ID cookie 应该如何工作:/

标签: php mysql session-cookies rows


【解决方案1】:

尝试从数据库中获取用户计数并简单地执行 N 次

function assign_all_sessionids(){

  $conn = sql_connect();

  // getting users count
  // here just change 'id' to your id parameter
  $result = mysqli_query($conn, "SELECT id FROM accounts"); 
  $arr = $result->fetch_array(MYSQLI_NUM);

  // executing N times
  for($i = 0; $i < $result->num_rows; $i++){
     $sessionid = generate_sessionid();
  // here just change 'id' to your id parameter again
     mysqli_query($conn, "UPDATE accounts SET sessionid='$sessionid' WHERE `id`=".$arr[$i]);
  }

sql_disconnect($conn);
}

【讨论】:

  • 谢谢,这就是解决方案。我有点改变了它,没有使用$arr,而是从 Gordon Linoff 那里得到了使用IS NOT NULL 的想法。谢谢大家!
【解决方案2】:

您可以通过首先将所有会话 ID 设置为 NULL 来做您想做的事情:

UPDATE accounts
    SET sessionid = NULL;

然后,在循环内部:

UPDATE accounts
    SET sessionid = '$sessionid'
    WHERE sessionid IS NOT NULL
    LIMIT 1;

【讨论】:

    【解决方案3】:

    通常您不希望在循环中执行查询,但是在这种情况下,您需要获取所有当前唯一标识符,循环并生成一个新标识符,然后更新一个:

    function assign_all_sessionids(){
        $conn = mysqli_connect('whatever...');
        $select = mysqli_query($conn, "SELECT sessionid FROM accounts");
    
        while(list($id) = mysqli_fetch_assoc($select)) {
            $sessionid = generate_sessionid();
            $update = mysqli_query($conn, "UPDATE accounts SET sessionid='$sessionid' WHERE sessionid='$id'");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 2014-12-24
      • 1970-01-01
      • 2021-05-22
      相关资源
      最近更新 更多