Php 限制将CSV拆分导入mysql数据库
我有一个php脚本,要求用户上传csv,然后在导入前显示结果,并要求用户映射与数据库表对应的字段。它很好用 我的问题是,服务器似乎限制了可以进行的post或insert的数量。所以我可以插入75行。但我有大约600行。我怎样才能把它们分割成不同的文件或者内嵌函数 在那件事上我有点不知所措。因为用户还可以选择要插入的记录,并使用复选框Php 限制将CSV拆分导入mysql数据库,php,mysql,csv,import,split,Php,Mysql,Csv,Import,Split,我有一个php脚本,要求用户上传csv,然后在导入前显示结果,并要求用户映射与数据库表对应的字段。它很好用 我的问题是,服务器似乎限制了可以进行的post或insert的数量。所以我可以插入75行。但我有大约600行。我怎样才能把它们分割成不同的文件或者内嵌函数 在那件事上我有点不知所措。因为用户还可以选择要插入的记录,并使用复选框 <?php setlocale(LC_ALL,"en_US.UTF-8"); ob_start(); if(!isset($_SESSION)) {
<?php
setlocale(LC_ALL,"en_US.UTF-8");
ob_start();
if(!isset($_SESSION))
{
session_start();
}
//variables
$upload_file='';
$err='';
$msg='';
include "config.php";
if(isset($_POST['frm_type'])) // Insert Records
{
if(isset($_POST['frm_type']) && $_POST['frm_type']=='custom')
{
if(count($_POST["chk"])>0)
{
$count_cols=$_POST["h_cols"];
foreach($_POST["chk"] as $index)
{
$query="";
$dyn_query="";
$select_where="";
$date_reg=date('Y-m-d');
//STATIC COLUMN
$query = "cat_id='".$_POST["cat_id".$index]."'";
$query .= ",date_reg='".$date_reg."'";
$query .= ",user_id='".$_SESSION['user_id']."'";
$query .= ",type_client='".$_SESSION['cltype']."'";
$query .= ",birthday_switch='1',";
//DYNAMIC COLUMN
for($s=0; $s<$count_cols;$s++)
{
if(isset($_POST["colum_".$s]) && $_POST["colum_".$s]!='')
{
$value=Add_Slashes($_POST["row_".$s."_".$index]);
$dyn_query[]="".$_POST["colum_".$s]."='".$value."'";
}
if($_POST["colum_".$s]=="full_name")
{
$value=trim($_POST["row_".$s."_".$index]);
if($value!="")
{
$allow=1;
}
else
{
$allow=0;
}
}
}
if($dyn_query)
{
if($allow==1)
{
$query .=implode(',',$dyn_query);
$select_where[]="cat_id='".$_POST["cat_id".$index]."'";
$select_where[]="user_id='".$_SESSION['user_id']."'";
$select_where[]="type_client='".$_SESSION['cltype']."'";
for($t=0; $t<$count_cols;$t++)
{
if(isset($_POST["colum_".$t]) && $_POST["colum_".$t]!='')
{
$value=Add_Slashes($_POST["row_".$t."_".$index]);
$select_where[]="".$_POST["colum_".$t]."='".$value."'";
}
}
$select_where_query=implode(' AND ', $select_where);
$re = mysql_query("Select cat_id From clients Where $select_where_query");
if(mysql_num_rows($re)==0)
{
mysql_query("Insert Into clients Set $query");
$msg = "<span class='error' style=\"color:green;\"><b>Data Successfully Imported Into The Database</b></span>";
}
else
{
$msg = "<span class='error' style=\"color:red;\"><b>Data Already Existed in Database</b></span>";
}
}
}
else
{
$msg = "<span class='error' style=\"color:red;\"><b>Please select fields!</b></span>";
}
}
if(file_exists($_SESSION["FILENAME"]))
unlink($_SESSION["FILENAME"]);
}
}
}
if(isset($_POST['submt']))
{
if($_FILES['filename']["name"]=="")
$err = "<span class='error'>".IMPORT_PLEASE."</span>";
elseif(substr(strrev($_FILES['filename']["name"]),0,3)!="vsc")
$err = "<span class='error'>".IMPORT_INVALID."</span>";
else
{
$_SESSION['cltype']=$_POST['cltype'];
set_time_limit(0);
if(file_exists($Upload_Path.$_FILES['filename']["name"]))
$filename = GetRandomString(6).$_FILES['filename']["name"];
else
$filename = $_FILES['filename']["name"];
if(move_uploaded_file($_FILES['filename']["tmp_name"],$Upload_Path.$filename))
{
$upload_file = $Upload_Path.$filename;
$_SESSION["FILENAME"] = $upload_file;
}
else
$err = "<span class='error'>".IMPORT_FAIL."</span>";
set_time_limit(30);
}
}
?>
<script>
function Check_All2(obj,arr)
{
if(obj.checked)
{
var i=document.cfrm.elements.length;
var j;
for(j=0;j<i;j++)
{
if(document.cfrm.elements[j].name==arr)
document.cfrm.elements[j].checked=true;
}
}
else
{
var k=document.cfrm.elements.length;
var l;
for(l=0;l<k;l++)
{
if(document.cfrm.elements[l].name==arr)
document.cfrm.elements[l].checked=false;
}
}
}
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>
<script>
jQuery(document).ready(function(){
jQuery('#cfrm').submit(function(event) {
colums = jQuery('select.colum');
var arr = new Array();
var h_status=false;
colums.each(function()
{
var el=jQuery(this).val();
if(el!='')
{
h_status=true;
if(jQuery.inArray(el,arr)>-1)
{
event.preventDefault();
jQuery(this).css("border","2px solid red");
alert("Duplicated Fields!");
jQuery(this).focus();
return false;
}
else
{
arr.push(el);
jQuery(this).css("border","");
}
}
});
chks = jQuery('.chk');
chks.each(function()
{
if (jQuery(this).is(':checked'))
{
h_cols=jQuery('#h_cols').val();
var mand=1;
for(var k=0; k<=h_cols; k++)
{
colum_id='#colum_'+k;
colum_value=jQuery(colum_id).val();
flel_object=jQuery('#row_'+k+'_'+jQuery(this).val());
flel_value=jQuery('#row_'+k+'_'+jQuery(this).val()).val();
if(colum_value=='full_name')
{
if(flel_value=='')
{
event.preventDefault();
alert('Enter Full Name');
flel_object.focus();
return false;
}
}
else if(colum_value=='aaa')
{
if(flel_value=='')
{
event.preventDefault();
alert('Enter Email');
flel_object.focus();
return false;
}
}
}
}
});
if(!h_status)
{
event.preventDefault();
alert('Select Any Field To Insert!');
return false;
}
});
});
</script>
<script type="text/javascript" src="ajaxsublistgenerator.js"></script>
<table class="sub" height="20px" width="100%" border="0" cellpadding="0" cellspacing="0" align="center"></table>
<table width="99%" border="0" cellpadding="0" cellspacing="0" align="center">
<tr>
<td>
<fieldset>
<?
if($upload_file=="")
{
?>
<legend style="font-size:12px; font-weight:bold"><?=IMPORT_CSV;?></legend>
<form name="frm" action="" method="post" enctype="multipart/form-data">
<table width="45%" border="0" cellpadding="4" cellspacing="4" align="center">
<?
if($err!="" || $msg!="")
{
?>
<tr><td colspan="2"><?=($err!="") ? $err : $msg?></td></tr>
<?
}
?>
<tr>
<td width="30%" align="left" valign="middle"><b><?=IMPORT_FILE;?></b></td>
<td width="70%" align="left" valign="middle">
<input name="filename" id="filename" type="file" size="25" />
</td>
</tr>
<tr>
<td width="30%" align="left" valign="middle"><b><?=IMPORT_SECTION;?></b></td>
<td width="70%" align="left" valign="middle">
<select name="cltype" id="cltype">
<option value="Client">Clients</option>
<option value="prospect">Leads</option>
<option value="Contacts">Contacts</option>
</select>
</td>
</tr>
<tr>
<td> </td>
<td align="left" valign="middle">
<input name="submt" type="submit" value="<?=IMPORT_UPLOAD;?>">
</td>
</tr>
</table>
</form>
<script>document.getElementById("filename").focus();</script>
<?
}
else
{
?>
<legend style="font-size:12px; font-weight:bold"><?=IMPORT_CONTENT;?></legend>
<form name="cfrm" id="cfrm" action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="frm_type" id="frm_type" value="custom">
<div style="overflow:auto;width:100%;">
<table border="0" cellspacing="4" cellpadding="4" align="center" width="100%">
<tr>
<td width="5%" align="center">
<input onClick="javascript:Check_All2(this,'chk[]')" type="checkbox" checked="checked">
</td>
<td width="10%" align="center"><b><?=IMPORT_CAT;?></b></td>
<?php
$fd_header = fopen ($upload_file, "r");
$buffer_header = fgetcsv($fd_header, 100000, ',');
//print_r(count($buffer_header));
for($r=0; $r<count($buffer_header);$r++)
{
?>
<td width="10%" align="center">
<select class="colum" name="colum_<?php echo $r;?>" id="colum_<?php echo $r;?>">
<option value="">--Select Field--</option>
<option value="full_name">Name</option>
<option value="address">Address</option>
<option value="city">City</option>
<option value="state">Province</option>
<option value="zip">Code Postal</option>
<option value="country">Country</option>
<option value="home_phone">Tel(Home)</option>
<option value="work_phone">Tel(Work)</option>
<option value="cell_phone">Tel(Mobile)</option>
<option value="email">Email</option>
<option value="conjoint">Joint</option>
<option value="notes">Notes</option>
<option value="birthday">Birthday</option>
</select><input type="hidden" id="h_cols" name="h_cols" value="<?php echo count($buffer_header); ?>" />
</td>
<?php } ?>
</tr>
<?
$fd = fopen ($upload_file, "r");
$i=1;
while (!feof ($fd))
{
$buffer_header = fgetcsv($fd, 100000, ',');
?>
<tr>
<td align="center"><input class="chk" type="checkbox" value="<?=$i?>" name="chk[]" checked="checked" /></td>
<td align="left" ><?php $sql_cat_names = mysql_query("select * from clients_cat where user_id='".$_SESSION['user_id']."' order by cat_name") ;?>
<select class="ann_select" name="cat_id<?=$i?>" id="cat_id<?=$i?>">
<?php while($row_cat_names = mysql_fetch_array($sql_cat_names)){?>
<option value="<?=$row_cat_names['id']?>"><?=$row_cat_names['cat_name']?></option>
<?php } ?>
</select>
</td>
<?php
for($v=0; $v<count($buffer_header);$v++)
{
?>
<td align="center">
<input type="text" value="<?=$buffer_header[$v]?>" name="row_<?=$v?>_<?=$i?>" id="row_<?=$v?>_<?=$i?>" />
</td>
<?php } ?>
</tr>
<?php
$i++;
unset($buffer_header);
}
fclose ($fd);
?>
<tr>
<td colspan="7" align="center">
<input name="Submit" id="Submit" type="submit" value="Submit" />
</td>
</tr>
</table>
</div>
</form>
<?php
}
?>
</fieldset>
</td>
</tr>
</table>
您可以在一次仅插入中插入多个值,并减少DDBB负载
在PHP代码中,您将接收这些值,并创建一个foreach来逐个插入每一行。您需要做的是将逐个插入更改为多对一插入
你正在做:
INSERT INTO table (field1, field2) VALUES ( 'value1', value2');
INSERT INTO table (field1, field2) VALUES ( 'value3', value4');
INSERT INTO table (field1, field2) VALUES ( 'value5', value6');
这将为您提供3个到数据库的连接,3个插入。您的查询应该是:
INSERT INTO table (field1, field2) VALUES ( 'value1', value2'), ('value3, 'value4'), ('value5', 'value6');
这将为您提供1个到数据库的连接,3个插入。同样的结果,更少的负载
更新
要在代码中完成此操作,必须在foreach
中创建一个字符串,其中包含要插入的数据:验证字段,创建字符串,然后使用foreach
中的插入语句将其插入DDBB。如果我不运行脚本来检查一切是否正常,那么这将是一个混乱的局面,因此我只能为您指出如何完成这项工作。欢迎使用!你能提供你得到的准确的响应/错误信息吗(复制,粘贴错误详细信息)。嗨,我一点错误都没有,它只是导入了一定数量的插入,就像如果我有600行要导入,我只在数据库中插入了80条记录。这就好像服务器已经达到了post或类似的水平。这就是为什么我想拆分它或使用infle函数的原因。Chococroc建议的方法有帮助吗?我必须和我的程序员核实一下,但不确定服务器上的max_post限制是否会起作用。我如何使用目前为止的infle?如何使用目前为止的infle?什么是999 max_post?根据您的js和标记,您只发送一篇文章,而不是单独发布每一行。如果问题是帖子的最大大小(max_post_size,在php.ini中),那么除了增加值或更改服务器(可能是max_input_vars)之外,您无需做任何事情,然后将wich设置为999。那么这是限制吗?因为在我的服务器上有一些限制,因为我在限制时间或内存方面没有错误,但由于服务器的原因,它似乎在某个点停止。你觉得infle是解决方案吗?根据你关于只在一个连接上插入的建议,我怎样才能在我的代码中实现这一点?因为我有麻烦了。。Tks