【问题标题】:Indexing array in php pdo insert while loopphp pdo中的索引数组插入while循环
【发布时间】:2018-05-21 23:42:48
【问题描述】:

我正在尝试使用 while 循环将一行插入到一个表中,以便每次从另一个表中提取数据。我目前拥有的代码将第一个用户数据插入数据库。

如果插入查询在循环之外,它将输入最后一个用户数据。遍历数组一定是个问题。有没有办法可以为循环的每次传递索引数组值?

$query = "SELECT * FROM users_table" ;
$statement = $db->prepare($query);
$rows = $statement->fetchAll(); 
$statement->execute();

while($rows = $statement->fetch()){

    $salted = $sso_key . $companyId;
    $hash = hash('sha1',$salted,true);
    $saltedHash = substr($hash,0,16);

    $iv = substr(md5(microtime()),rand(0,16),16); //Generate random 16 bit string


    $user_data = array( 
      "user_id" => $rows['id'],
      "first_name" => $rows['first_name'],
      "last_name" => $rows['last_name'],
      "email" => $rows['email'],
      "position" => $rows['type']);

    $data = json_encode($user_data);
    $data = $iv . $data;

    $pad = 16 - (strlen($data) % 16);
    $data = $data . str_repeat(chr($pad), $pad);

    $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'','cbc','');
    mcrypt_generic_init($cipher, $saltedHash, $iv);
    $encryptedData = mcrypt_generic($cipher,$data);
    mcrypt_generic_deinit($cipher);

    $encryptedData = base64_encode($encryptedData);

    $token = array(
        "token" => $encryptedData
    );

    $token_data = json_encode($token);

    echo "
    <br>Here is the token for ".$user_data['first_name'].", ".$user_data['last_name']."
    ".$user_data['email'] ." : 
    " . $token['token'];



    $query = "INSERT INTO another_table 
            (token ,first_name,last_name,email,position) 
            VALUES (:token, :first_name,
            :last_name, :email, :position)"; 


    $statement = $db->prepare($query);
    $statement->bindValue(':token', $token['token']);
    $statement->bindValue(':first_name', $user_data['first_name']);
    $statement->bindValue(':last_name', $user_data['last_name']);
    $statement->bindValue(':email', $user_data['email']);
    $statement->bindValue(':position', $user_data['position']);


    $statement->execute();

}
?>

【问题讨论】:

  • 在拨打$statement-&gt;execute() 之前,您不能拨打$statement-&gt;fetchAll()。当您调用 fetchAll() 时,它会获取所有行,因此 while ($rows = $statement-&gt;fetch()) 没有任何内容可供获取。
  • 你必须在while循环上方定义数组。
  • @RavinderReddy 为什么他必须这样做?他不是每次都推入数组,他只是将它用作循环中的临时对象。
  • 我看不出为什么循环只会插入第一个用户的数据。
  • 他从第一个 $statement 对象吹出循环内的对象 $statement。那只会破坏浩劫。

标签: php mysql arrays pdo while-loop


【解决方案1】:

将代码简化为基础代码,您将拥有:

$query = "SELECT * FROM users_table" ;
$statement = $db->prepare($query);
$rows = $statement->fetchAll(); 
$statement->execute();
while($rows = $statement->fetch()){
    // .. stuff ..
    $query = "INSERT INTO another_table 
            (token ,first_name,last_name,email,position) 
            VALUES (:token, :first_name,
            :last_name, :email, :position)";
    $statement = $db->prepare($query);
    $statement->bindValue(':token', $token['token']);
    $statement->bindValue(':first_name', $user_data['first_name']);
    $statement->bindValue(':last_name', $user_data['last_name']);
    $statement->bindValue(':email', $user_data['email']);
    $statement->bindValue(':position', $user_data['position']);
    $statement->execute();
}

看到问题了吗?好的,这里有一个修复它的提示:

$query = "SELECT * FROM users_table" ;
$statement = $db->prepare($query);
$statement->execute();
$query = ".. prepared query here .."; // your second query used in the loop
$SECOND_statement = $db->prepare($query); // set it up
while($row = $statement->fetch()){
    // .. bindValue lines here .. 
    $SECOND_statement->execute();
}

在您的 while 循环中,您正在使用插入 sql 覆盖变量 $statement。这有效地提前结束了您的 while 循环。如果第二个 sql 是另一个 SELECT,也会导致一些严重的意外和意外问题。

【讨论】:

  • 非常感谢!愚蠢的错误。我更改了 $statement 的名称。我以前确实遇到过这种情况。这次我什至没有想到。再次感谢!
  • 我想我们都做过一次或五十次。没问题!
  • @mickmackusa 是的。如果他的查询在 while 循环中完全没有变化(没有动态内容),那么可以在该循环之前首先定义 $OTHER_statement。 (更新)
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
相关资源
最近更新 更多