从CSV导入PHP不会用空格覆盖旧数据

从CSV导入PHP不会用空格覆盖旧数据,php,mysql,csv,import,Php,Mysql,Csv,Import,如果有人能帮忙的话,我会非常感激的,我已经在这里和谷歌上搜索过了,找不到有什么问题,我怎么说这些行的结尾是什么?这是密码 <?php if (isset($_POST['submitbulk'])) { if (is_uploaded_file($_FILES['filename']['tmp_name'])) { echo "<h2>Orders Updated:</h2>"; readfile($_FILES['filename']['tmp_

如果有人能帮忙的话,我会非常感激的,我已经在这里和谷歌上搜索过了,找不到有什么问题,我怎么说这些行的结尾是什么?这是密码

 <?php if (isset($_POST['submitbulk'])) {
if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
    echo "<h2>Orders Updated:</h2>";
    readfile($_FILES['filename']['tmp_name']);
}

//Import uploaded file to Database
$handle = fopen($_FILES['filename']['tmp_name'], "r");

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    if ($data[2] != 0) {
    $shipdate = $data[2];
    }else{  
    $shipdate = date('Y-m-d');
    }
    if (isset($data[1])) {
        $vendor_invoice = $data[1];     
    }else{  
        $vendor_invoice = 0;     
    }
    if (isset($data[3])) {
        $shipping_cost = $data[3];     
    }else{  
        $shipping_cost = "";     
    }
    if (isset($data[4])) {
        $fedex_tracking = $data[4];    
        $fedex_notify_order[] = $data[0];
        $fedex_notify_tracking[] = $data[4];

    }else{  
        $fedex_trackoing = "";     
    }
    if (isset($data[5])) {
        $ups_tracking = $data[5]; 
        $ups_notify_order[] = $data[0];
        $ups_notify_tracking[] = $data[5];

    }else{  
        $ups_trackoing = "";     
    }
    if (isset($data[6])) {
        $ontrac_tracking = $data[6];  
        $ontrac_notify_order[] = $data[0];
        $ontrac_notify_tracking[] = $data[6];

    }else{  
        $ontrac_trackoing = "";     
    }   
    if (isset($fedex_tracking, $ups_tracking, $ontrac_tracking)) {
        $array3[] = $data[0];
    }else{
        echo "";
    }
$import = sprintf("UPDATE orders SET ".
                    "vendor_invoice_number='%s', ".
                    "ship_date='%s', ".
                    "ship_cost='%s', ".
                    "fedex_track_num='%s', ".
                    "ups_track_num='%s', ".
                    "ontrac_track_num='%s' ".
                  "WHERE orders_id=%s",

              mysql_real_escape_string($vendor_invoice), 
              mysql_real_escape_string($shipdate),
              mysql_real_escape_string($shipping_cost),
              mysql_real_escape_string($fedex_tracking),
              mysql_real_escape_string($ups_trackoing),
              mysql_real_escape_string($ontrac_tracking), 
              (int)$data[0]);
    mysql_query($import) or die(mysql_error());
}

fclose($handle);


    print "</br>Updated Successfully";

    //view upload form
}else { ?>

    Import Vendor Invoice Numbers<br />

    <form enctype='multipart/form-data' action='submit.php' method='post'>
    <input size='50' type='file' name='filename'><br />
    <input type='submit' name='submitbulk' value='Upload'></form>
 <?php   }
?>

构造查询的方式是错误的。您当前的代码有点混乱,我想这就是您要寻找的:

$import = sprintf("UPDATE orders SET ".
                    "vendor_invoice_number='%s', ".
                    "ship_date='%s', ".
                    "shipping_costs='%s', ".
                    "fedex_trackoing='%s', ".
                    "ups_trackoing='%s', ".
                    "ontrac_trackoing='%s' ".
                  "WHERE orders_id=%s",
                  mysql_real_escape_string($data[1]), 
                  mysql_real_escape_string($shipdate),
                  mysql_real_escape_string($shipping_cost),
                  mysql_real_escape_string($fedex_trackoing),
                  mysql_real_escape_string($ups_trackoing),
                  mysql_real_escape_string($ontrac_trackoing), 
                  (int)$data[0]);
基本问题是,您试图在双引号字符串初始化中使用
“$data[1]”
,这根本不起作用

但请注意,这是值得怀疑的。您不应该盲目信任发布到服务器上的数据。任何东西都可能在其中,以目前的方式使用这些数据会带来巨大的安全问题。阅读一些关于“sql注入”的内容,考虑切换到高级的
mysqli
扩展(您当前使用的
mysql
扩展已被弃用),并了解“准备语句”的优点


更新此处的附加评论/更新的问题:

要防止基于csv文件的内容执行此类更新查询,最简单的方法是将执行命令包含在条件构造中:

if (    ! empty($data[1])
     && ! empty($shipdate)
     && ! empty($shipping_cost) )
     && ! empty($fedex_trackoing) )
     && ! empty($ups_trackoing) )
     && ! empty($ontrac_trackoing) ) {
  mysql_query($import) or die(mysql_error());
}

显然,您需要的实际条件取决于您想要判断的情况,即您决定不更新数据库中的现有条目。当将此与问题内部发布的原始循环内容结合起来时,很明显代码现在有些混乱。重新实现这是一种更加精简的方式,这当然是有意义的…

文件编码呢
fgetcsv
只能正确读取
utf-8
@iamseleepy此页面受IP限制,只允许知道该做什么的人使用,谢天谢地,我们不必担心编码问题,但如果有更好的方法,我洗耳恭听:)谢谢,这很有效,我知道有更好的方法导入数据,但我无法让它们工作,我想使用parseCSV,但我仍在努力让它发挥作用。谢天谢地,我们不必担心sql注入,因为谁有权访问该页面。有没有办法让它只在csv文件中有数据时更新列?我原以为if语句将其设置为“”可以做到这一点,但它只是将其更改为blank。我编辑了我的问题,添加了我发现的另一种方式,类似于此工作吗?当然可以。如果您可以在未更改的状态下使用csv文件中的数据,这是有意义的。但通常情况下,我们迟早需要脚本级别的灵活性。可能用于处理数据,但最有可能用于合理性检查和验证步骤。
if (    ! empty($data[1])
     && ! empty($shipdate)
     && ! empty($shipping_cost) )
     && ! empty($fedex_trackoing) )
     && ! empty($ups_trackoing) )
     && ! empty($ontrac_trackoing) ) {
  mysql_query($import) or die(mysql_error());
}