/ / Tablica indeksowania w php pdo insert while loop - php, mysql, tablice, pdo, while-loop

Tablica indeksująca w php pdo insert while while loop - php, mysql, tablica, pdo, while-loop

Próbuję wstawić wiersz do tabeli dla każdego pobrania z innej tabeli za pomocą pętli while. Kod, który aktualnie mam, wstawia pierwsze dane użytkowników do bazy danych.

Jeśli wstawione zapytanie znajduje się poza pętlą, wprowadzi dane ostatniego użytkownika. To musi być problem iteracji przez tablicę. Czy istnieje sposób, w jaki mogę indeksować wartości tablicy dla każdego przejścia pętli?

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

}
?>

Odpowiedzi:

0 dla odpowiedzi № 1

Ograniczając ten kod do podstaw, masz to:

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

Widzisz jeszcze problem? Ok, tutaj jest podpowiedź, aby to naprawić:

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

Wewnątrz pętli while nadpisałeś zmienną $statement z insert sql. To skutecznie zakończyło twoją pętlę while przedwcześnie. Może również powodować poważne, niepożądane i nieoczekiwane problemy, jeśli drugi sql był kolejnym SELECT.