我们每天都会从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>';

解决方案 »

  1.   

    $myaf = mysql_affected_rows() or die(mysql_error());
      

  2.   

    是不是超过了执行最大时间。
    设置:set_time_limit(0);
      

  3.   

    php2006你好!应该不是执行时间的问题,因为都是中间的记录写入失败。
    我从网站上下载的txt文件用excel打开,另存其它的txt文件,就是会随机几条记录写不进数据库
      

  4.   

    还有一种情况就是你的explode函数分割时可能某个字段有单引号。
      

  5.   

    只是中间有记录出问题,说明代码应该可以,只是记录可能有些异常字符,建议检查记录另外你提到excel导出,那么估计符合csv格式,建议用getcsv等等相关函数操作减少失误
    不妨看看SPL中  SplFileObject->fgetcsv()
      

  6.   

    $myaf = mysql_affected_rows() or die(mysql_error());
    echo $myaf;结果是-1
      

  7.   

    snmr_com你好!我导入的全是txt格式的,用getcsv比fopen产生问题的机率是不是要低很多???
      

  8.   

    $u=explode('    ', trim($buffer));我想是不是这句有问题,导出的分隔符是\t,但是用\t又分割不出来
      

  9.   

    不好意思,复制错了。应该是
    mysql_query($sql_detrde) or die(mysql_error());
    $myaf = mysql_affected_rows();如果是由于数据的原因引起插入失败,应该可以从错误信息中分析出
    如果 $myaf 不等于 1, 则表示没有记录被插入超时也是可能的,你可以 set_time_limit(0);总之,不辅以相关信息,乱猜是不可能有结果的
      

  10.   

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0773624112','A0109-00-5A-29' ,'0109-00', '�����ǔŁ����֗��IiPhone4���p�X�g���b�' at line 1
      

  11.   


    csv也是文本,只要你的txt符合csv格式(你用excel导出,一般情况都符合),getcsv比自己写代码稍微好些
      

  12.   

    你的文件不是utf-8的吗?怎么会有 gbk 的数据?
    都是这样的吗?那你怎么说只有少数的插不进去?对于 gbk 数据
    1、声明交互是的字符集 set names bgk
    2、对所有字符字段的内容都要显式的转义,因为 gbk 字符的第二个字节可能出现字符“\”
    如不转义而该字正好处于内容的结束处,就要出错了
    这些字都是
    乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖
      

  13.   

    如果你的有汉字的字段部分没有用双引号括起,那么请慎用 getcsv,不然汉字被“吃”掉了,你哭都来不及
      

  14.   

    xuzuning大大:1.GBK???这些都是日本网站导出来的,不知道是不是因为用excel保存过的原因2.300多条记录里面只有3条数据导入失败啊,加了or die(mysql_error())后就停在有问题的那条记录那里了,好像跳出循环了
      

  15.   

    我把txt文件另存utf-8编码的就没问题了请问这种情况怎么处理,总不能老是让人另存吧?那样太麻烦了
      

  16.   

    日语更容易有#13所说的问题,例如“黒”就是日语中汉字“黑”,这个字在GBK里面也有,内码为FC5C
    其中5C的ASCII对应字符是“\”,这大概知道所以出问题了吧?所以拆解字符串和导入数据库就要注意
      

  17.   

    GBK 怎么啦?gbk 的制订不也有小日本参与吗?gbk 不也囊括的日文编码吗?让你转义你做了吗?
      

  18.   

    唠叨别激动,他的语气应该不是质疑,而是疑惑不解
    zhuhao你要把你的SQL语句做安全转义,把语句视作含有“\”来看待要么全过程用unicode来操作
      

  19.   

    xuzuning大大别激动啊,我只是不理解而以,我的理解像amazon这样的网站,导出来的应该都是uft-8的才对。
    snmr_com大大,我不会做安全转义,我接触PHP才几个月,以前只是用过VB,现在老板想做个页面,没办法只能边做边学
      

  20.   

    mysql_query( "set   names   'GBK'");
    我加这个上去,数据是都可以写入数据库,不过导出来的文件都是???号
      

  21.   

    数据库
    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的
      

  22.   

    字段编码是latin1我想问一下我把mysql,字段编码全改成uft-8的,这样是不是就不会出那么多问题了???
      

  23.   

    要想字段不乱码,就要改数据库的字段编码类型。latin1要改成utf-8的才可以。php连接数据库也要改成utf-8的编码。这样就不会乱码了。
      

  24.   

    谢谢楼上的解答,现在说着说着已经偏离我原来的问题了我现在的主要问题不是乱码,是导入txt文件的时候,有些txt文件总有几条记录写入数据库失败我用以下代码去查txt文件编码
    $content = file_get_contents($filename);
    $aa=mb_detect_encoding($content);
    echo $aa;显示ASCII,UFT-8的txt导入数据库就没问题
    显示空的, 上传数据库就总有几条记录写入失败这些txt文件都是从日本amazon网站下载的,但有些txt文件显示的是ASCII,有些显示的编码为空。