我们每天都会从amazon导出一些订单(txt文件),然后用PHP导入到数据库,现在出现的问题就是:有些txt文件导入的时候总会有几条记录导不进去,但是单独提取出来(把导不进去的记录建一个文件)再导就能成功,每个txt文件大概1000条左右的记录,以下是PHP原代码,请各位大大帮我分析一下什么原因还有请问可以查写入数据库失败的原因吗?可以的话怎么查
$filepath=$_GET['uploadfile'];
echo $filepath;require_once 'conn.php';
setlocale(LC_ALL, 'en_US.UTF-8');error_reporting(E_ALL ^ E_NOTICE); $line=0;
$shipments=0;
$strSqla="SELECT MAX(number) FROM `sale_orders`"; //查询sale_orders表id字段最大值
$querya = mysql_query($strSqla,$conn);
$resultaa= mysql_fetch_row($querya);
$maxnum=$resultaa[0];$maxnum++;$file = fopen($filepath,"r") or die("打开文件失败"); while (!feof($file)) { $buffer = fgets($file);if ($line<>0)
{
$u=explode(' ', trim($buffer));
if(!empty($u[0])){
$or_id=$u[0];
$or_it_id=$u[1];
$payments_date=$u[3];$buyer_email=$u[7];
$buyer_name=$u[8];
$buyer_phone=$u[9];
$sku=$u[10];
$jj_sku=substr($sku,1,7);
$product_name=$u[11];
$quantity=$u[12];
$recipient_name=$u[16];
$ship_address1=$u[17];
$ship_address2=$u[18];
$ship_address3=$u[19];
$ship_state=$u[21];
$ship_postal=$u[22];
$ship_country=$u[23];
$sql_detrde=" INSERT INTO `amazon_erp`.`sale_orders` (`number` ,`order_id` ,`order_item_id`,`shipments` ,`payments-date` ,`buyer-email` ,`buyer-name` ,`buyer-phone-number` ,`sku`,`jj_sku` ,`product-name` ,`quantity-purchased`,`recipient-name`,`ship-address-1`,`ship-address-2`,`ship-address-3`,`ship-state`,`ship-postal-code`,`ship-country` )VALUES ('$maxnum','$or_id','$or_it_id', '$shipments', '$payments_date','$buyer_email', '$buyer_name','$buyer_phone','$sku' ,'$jj_sku', '$product_name', '$quantity', '$recipient_name', '$ship_address1', '$ship_address2','$ship_address3','$ship_state' , '$ship_postal', '$ship_country')";
mysql_query($sql_detrde);
$myaf = mysql_affected_rows();
if($myaf>0)
{
echo "<br/>import $or_id Success";
}
else
{
echo "<br/><font color='#FF0000'>";
echo "import $or_id Failure";
echo "</font>";
}
}
}
$line++;
}
echo "<br/>导入成功";
echo "<br/>Possible file upload attack!\n";
echo '<script>window.open("labela_outputcsv.php?number='.$maxnum.'","_blank");</script>';
echo '<script>location.href="outputcsv.php?number='.$maxnum.'"</script>';
$filepath=$_GET['uploadfile'];
echo $filepath;require_once 'conn.php';
setlocale(LC_ALL, 'en_US.UTF-8');error_reporting(E_ALL ^ E_NOTICE); $line=0;
$shipments=0;
$strSqla="SELECT MAX(number) FROM `sale_orders`"; //查询sale_orders表id字段最大值
$querya = mysql_query($strSqla,$conn);
$resultaa= mysql_fetch_row($querya);
$maxnum=$resultaa[0];$maxnum++;$file = fopen($filepath,"r") or die("打开文件失败"); while (!feof($file)) { $buffer = fgets($file);if ($line<>0)
{
$u=explode(' ', trim($buffer));
if(!empty($u[0])){
$or_id=$u[0];
$or_it_id=$u[1];
$payments_date=$u[3];$buyer_email=$u[7];
$buyer_name=$u[8];
$buyer_phone=$u[9];
$sku=$u[10];
$jj_sku=substr($sku,1,7);
$product_name=$u[11];
$quantity=$u[12];
$recipient_name=$u[16];
$ship_address1=$u[17];
$ship_address2=$u[18];
$ship_address3=$u[19];
$ship_state=$u[21];
$ship_postal=$u[22];
$ship_country=$u[23];
$sql_detrde=" INSERT INTO `amazon_erp`.`sale_orders` (`number` ,`order_id` ,`order_item_id`,`shipments` ,`payments-date` ,`buyer-email` ,`buyer-name` ,`buyer-phone-number` ,`sku`,`jj_sku` ,`product-name` ,`quantity-purchased`,`recipient-name`,`ship-address-1`,`ship-address-2`,`ship-address-3`,`ship-state`,`ship-postal-code`,`ship-country` )VALUES ('$maxnum','$or_id','$or_it_id', '$shipments', '$payments_date','$buyer_email', '$buyer_name','$buyer_phone','$sku' ,'$jj_sku', '$product_name', '$quantity', '$recipient_name', '$ship_address1', '$ship_address2','$ship_address3','$ship_state' , '$ship_postal', '$ship_country')";
mysql_query($sql_detrde);
$myaf = mysql_affected_rows();
if($myaf>0)
{
echo "<br/>import $or_id Success";
}
else
{
echo "<br/><font color='#FF0000'>";
echo "import $or_id Failure";
echo "</font>";
}
}
}
$line++;
}
echo "<br/>导入成功";
echo "<br/>Possible file upload attack!\n";
echo '<script>window.open("labela_outputcsv.php?number='.$maxnum.'","_blank");</script>';
echo '<script>location.href="outputcsv.php?number='.$maxnum.'"</script>';
设置:set_time_limit(0);
我从网站上下载的txt文件用excel打开,另存其它的txt文件,就是会随机几条记录写不进数据库
不妨看看SPL中 SplFileObject->fgetcsv()
echo $myaf;结果是-1
mysql_query($sql_detrde) or die(mysql_error());
$myaf = mysql_affected_rows();如果是由于数据的原因引起插入失败,应该可以从错误信息中分析出
如果 $myaf 不等于 1, 则表示没有记录被插入超时也是可能的,你可以 set_time_limit(0);总之,不辅以相关信息,乱猜是不可能有结果的
csv也是文本,只要你的txt符合csv格式(你用excel导出,一般情况都符合),getcsv比自己写代码稍微好些
都是这样的吗?那你怎么说只有少数的插不进去?对于 gbk 数据
1、声明交互是的字符集 set names bgk
2、对所有字符字段的内容都要显式的转义,因为 gbk 字符的第二个字节可能出现字符“\”
如不转义而该字正好处于内容的结束处,就要出错了
这些字都是
乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖
其中5C的ASCII对应字符是“\”,这大概知道所以出问题了吧?所以拆解字符串和导入数据库就要注意
zhuhao你要把你的SQL语句做安全转义,把语句视作含有“\”来看待要么全过程用unicode来操作
snmr_com大大,我不会做安全转义,我接触PHP才几个月,以前只是用过VB,现在老板想做个页面,没办法只能边做边学
我加这个上去,数据是都可以写入数据库,不过导出来的文件都是???号
Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ 网页是uft-8的
$content = file_get_contents($filename);
$aa=mb_detect_encoding($content);
echo $aa;显示ASCII,UFT-8的txt导入数据库就没问题
显示空的, 上传数据库就总有几条记录写入失败这些txt文件都是从日本amazon网站下载的,但有些txt文件显示的是ASCII,有些显示的编码为空。