Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php pdo插入while循环中的索引数组_Php_Mysql_Arrays_Pdo_While Loop - Fatal编程技术网

php pdo插入while循环中的索引数组

php pdo插入while循环中的索引数组,php,mysql,arrays,pdo,while-loop,Php,Mysql,Arrays,Pdo,While Loop,我正在尝试使用while循环将一行插入到一个表中,以便每次从另一个表获取数据。我当前拥有的代码将第一批用户数据插入数据库 如果插入查询在循环之外,它将输入最后的用户数据。遍历数组时一定会遇到问题。是否有一种方法可以为循环的每个过程索引数组值 $query = "SELECT * FROM users_table" ; $statement = $db->prepare($query); $rows = $statement->fetchAll(); $statement->e

我正在尝试使用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();

}
?>
$query=“从用户表中选择*”;
$statement=$db->prepare($query);
$rows=$statement->fetchAll();
$statement->execute();
而($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);//生成随机16位字符串
$user_data=数组(
“user_id”=>$rows['id'],
“first_name”=>$rows['first_name'],
“last_name”=>$rows['last_name'],
“email”=>$rows['email'],
“位置”=>$rows['type']);
$data=json\u encode($user\u data);
$data=$iv.$data;
$pad=16-(strlen($data)%16);
$data=$data.stru重复(chr($pad),$pad);
$cipher=mcrypt_模块_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=数组(
“令牌”=>$encryptedData
);
$token\u data=json\u encode($token);
回声“

这是“$user_data['first_name']”和“$user_data['last_name']”的标记 “$user_数据['email']。”: “$token['token']; $query=“插入到另一个表中” (令牌、名字、姓氏、电子邮件、职位) 值(:token,:first_name, :姓氏,:电子邮件,:职位)”; $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);
$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循环中,您正在使用insert sql覆盖变量
$statement
。这实际上过早地结束了while循环。如果第二个sql是另一个选择,也会导致一些严重的不必要和意外问题。

在调用
$statement->execute()之前,不能调用
$statement->fetchAll()
。当您调用
fetchAll()
时,它会获取所有的行,因此
while($rows=$statement->fetch())
无法获取任何内容。您必须在while循环上方定义数组。@Ravinderedy他为什么要这样做?他不是每次都推数组,他只是将它用作循环中的临时对象。我看不出循环为什么只插入第一个用户的数据。他从循环中的第一个
$statement
对象吹出对象
$statement
。那会毁了havok的。非常感谢你!愚蠢的错误。我更改了$statement的名称。我以前确实遇到过这种情况。这次我都没想到。再次感谢!我想我们都做过一两次。没问题@米克:是的。如果他的查询在while循环中没有任何变化(没有动态内容),那么可以在该循环之前首先定义
$OTHER_语句
。(更新)