为了账号安全,请及时绑定邮箱和手机立即绑定

在 PHP 后台在数据库中插入批量数据

在 PHP 后台在数据库中插入批量数据

PHP
德玛西亚99 2023-09-22 16:35:36
我有一个向客户发送批量消息的表单,点击提交按钮后,它会在发送前将消息保存在数据库中,但是插入过程需要大约 2 分钟才能插入 3000 条记录,我怎样才能减少插入时间或者我怎样才能在后台处理数据,以避免用户等待处理完成。我尝试了几种有关堆栈溢出的选项,但没有成功。我在共享主机上。这是我的代码<?phpif(isset($_POST['submit'])){ $date = date("D, F d, Y h:i:sa"); $phones = $_POST['recipient_phones']; //get phone numbers from textarea $phones = trim($phones,",\r\n\t\r\n/\s+/\0\x0B]/"); //do some regex $phones = multiexplode(array(","," ","\n","r\n",".","|",":"),$phones);//reformat and convert to array $sender = $_POST['sender_id']; //Get Sender ID input field $message = $_POST['message']; //Get Message input field $time = $_POST['sc_time']; //Get time input field ob_end_clean(); ignore_user_abort(); ob_start(); header("Connection: close"); // echo json_encode($out); header("Content-Length: " . ob_get_length()); ob_end_flush(); flush();foreach($phones as $phone){      $data = array("sender" => "$sender","phone" => "$phone", "message" => "$message", "user_id" => "$user_id","time_submitted" => "$date");            $qry = Insert('crbsms_queue',$data);        $_SESSION['msg']="10";  echo "<script>location.href='$url?success=yes';</script>";   exit}     # Insert Data     function Insert($table, $data){    global $mysqli;    //print_r($data);    $fields = array_keys( $data );      $values = array_map( array($mysqli, 'real_escape_string'), array_values( $data ) );       //echo "INSERT INTO $table(".implode(",",$fields).") VALUES ('".implode("','", $values )."');";   //exit;      mysqli_query($mysqli, "INSERT INTO $table(".implode(",",$fields).") VALUES ('".implode("','", $values )."');") or die( mysqli_error($mysqli) );}
查看完整描述

1 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

插入 3000 行并不是很多,如果操作正确的话,应该不会花费太多时间。您必须记住,您应该始终使用准备好的语句。您可以使用不同的数据多次执行同一语句。当你将整个事情包装在一个事务中时,它应该执行得非常快。


// Start transaction

$mysqli->begin_transaction();


// prepared statement prepared once and executed multiple times

$insertStatement = $mysqli->prepare('INSERT INTO crbsms_queue(sender, phone, message, user_id, time_submitted) VALUES(?,?,?,?,?)');

$insertStatement->bind_param('sssss', $sender, $phone, $message, $user_id, $date);

foreach ($phones as $phone) {

    $insertStatement->execute();

}


// Save and end transaction

$mysqli->commit();

如果这不能提高性能,则意味着您在其他地方遇到了问题。您需要分析和调试您的应用程序以找出问题的根源。

附注:请记住启用 mysqli 错误报告,否则您的事务可能无法正常运行。



查看完整回答
反对 回复 2023-09-22
  • 1 回答
  • 0 关注
  • 72 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信