MySQL — PHP Вставка большого количества значений вопроса

В настоящее время я пишу загрузчик php в мою базу данных mySQL.
Пользователь вводит user | password и пишет таблицу базы данных, в которую он хочет вставить, и выбирает регион из

Действие формы идет в database.php, чтобы выполнить вставку с помощью POST

мой код в database.php:

$region = $_POST["region"];
$tablename = $_POST["tableName"];

$accounts = explode(PHP_EOL, $_POST["accountlist"]);

$quantity = sizeof($accounts);
// Batch size, calc iterations
$batchSize = 500;

for($idx=0;$idx*$batchSize < $quantity; $idx++){
$accountsPartial = array_slice($accounts, $idx*$batchSize, $batchSize);

// Prepare the Query
$query = "INSERT INTO $tablename (username, password, region) VALUES (?, ?, ?)";
// Create the multiple value placeholder
$db = $db->prepare($query);foreach($accountsPartial as $item){
$i = 1;
list($user, $pass) = explode("|", $item);
$db->bindValue($i++, trim($user));
$db->bindValue($i++, trim($pass));
$db->bindValue($i++, trim(strtoupper($region)));
$db->execute();
}
}

Моя проблема в том, что когда я отправил более 500 значений, только 500 учетных записей были вставлены.
Я хотел бы получить некоторую помощь и предложения, как решить эту проблему
Заранее спасибо!

0

Решение

Ваш код зацикливания в основном бесполезен. Поскольку вы хотите вставить ВСЕ данные из POST, вы должны сделать это:

$query = "INSERT INTO $tablename (username, password, region) VALUES (?, ?, ?)";
// Create the multiple value placeholder
$stmt = $db->prepare($query);
$stmt->bindValue(1, $user);
$stmt->bindValue(2, $pass);
$stmt->bindValue(3, $region)

$region = trim(strtoupper($region));

foreach($accountsPartial as $item){
list($user, $pass) = explode("|", $item);
$user = trim($user);
$pass = trim($pass);

$stmt->execute();
}

Обратите внимание на привязку переменных ВНЕ цикл и привязка к фактическим переменным, а не к результатам вызовов trim ().

Кроме того, как написано, ваш код удаляет соединение с базой данных, используя ту же переменную для хранения вашего подготовленного оператора, что и само соединение db:

$db = $db->prepare(...);

будет уничтожать ваше соединение с БД, делая остальной код спорным.

1

Другие решения

Вы должны использовать do {} while () причина цикла, когда вы хотите вставить 600 вместо 500 $idx = 2 а также $idx * $batchSize = 1000 < 600 и выходит из цикла.

0

По вопросам рекламы [email protected]