繁体   English   中英

为每个MySQL行调用一个函数

[英]Calling a function for each MySQL row

我有一个标准的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。 我如何使它重新调用每一行的功能,以使其对每一行都是随机的?

尝试从数据库获取用户计数,然后简单地执行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);
}

您可以通过首先将所有会话ID设置为NULL

UPDATE accounts
    SET sessionid = NULL;

然后,在循环内:

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

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

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'");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM