2017-12-07 18 views
-1

whileループを使って別のテーブルからフェッチするたびにテーブルに行を挿入しようとしています。私が現在持っているコードは、最初のユーザーデータをデータベースに挿入します。php pdoのインデックス配列whileループ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(); 

} 
?> 
+3

'$ statement-> execute()'を呼び出す前に '$ statement-> fetchAll()'を呼び出すことはできません。 'fetchAll()'を呼び出すと、すべての行がフェッチされるので、フェッチするために 'while($ rows = $ statement-> fetch()) 'のために残されることはありません。 – Barmar

+0

ループのwhileループを定義する必要があります。 –

+1

@RavinderReddyなぜ彼はそれをしなければならないのですか?彼は毎回配列に向かっているわけではなく、ただループ内で一時的に使っているだけです。 – Barmar

答えて

0

、あなたはこれを持っている:

$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(); 
} 

はまだ問題を参照してください? [OK]を、ここでそれを修正するためのヒントです:あなたのwhileループ内

$query = "SELECT * FROM users_table" ; 
$statement = $db->prepare($query); 
$statement->execute(); 
while($row = $statement->fetch()){ 
    $query = ".. stuff .."; 
    $OTHER_statement = $db->prepare($query); 
    // .. stuff .. 
    $OTHER_statement->execute(); 
} 

、あなたは挿入SQLで変数$statementを上書きしました。これは効果的にwhileループを早期に終了しました。 2番目のsqlが別のSELECTであった場合、重大な望ましくない予期しない問題が発生する可能性もあります。

+1

ありがとうございます!愚かな間違い。私は$ステートメントの名前を変更しました。私は実際にこれに遭遇しました。今回も私には起こりませんでした。再度、感謝します! – Brendan

+0

私たちは皆、それを1〜50回やったと思います。問題はありません! – IncredibleHat