上传csv并插入或更新结果失败

时间:2015-12-26 00:15:35

标签: php csv select mysqli sql-update

谁能看到我在这里做错了什么?基本上应该发生的是你上传csv,它然后拉出行并检查数据库是否存在该行,如果它存在则更新它,如果它没有插入它。如果该行为空,则忽略它。

实际发生的事情是当我上传csv时,我得到更新'对于4条测试线中的每条测试线是否在数据库中。

此外,如果有人可以建议更好的方法,或者修改代码,请告诉我,因为我知道编码并不是想象中最好的。

if(isset($_GET['uploadfile'])) {
    $file = fopen($_FILES['csvfile']['tmp_name'], 'r+');
    while(! feof($file))
    {
        $line = fgetcsv($file, 0, ',');

        list($productcode, $v9cm, $v1litre, $v2litre, $v3litre, $v5litre, $v7litre) = $line;
        $rowcheck = "SELECT * FROM `stock` WHERE `productcode` = '$productcode'";

if (@mysql_num_rows(mysql_query($rowcheck))!=1) {

    if ($productcode == NULL OR $productcode == ''){}
    else {
        $datecreated = date('Y-m-d');
// Insert Posted Data
mysqli_query($db,"INSERT INTO stock (`datecreated`, `productcode`, `9cm`, `1litre`, `2litre`, `3litre`, `5litre`, `7litre`) VALUES ('$datecreated', '$productcode', '$v9cm', '$v1litre', '$v2litre', '$v3litre', '$v5litre', '$v7litre')") or die ('Unable to execute query. '. mysqli_error());
    echo $productcode.' - Added<br/ >';

    }    
}
else{
    if ($productcode == NULL OR $productcode == ''){}
    else {
$stmt = $db->prepare("UPDATE stock SET 9cm = '$v9cm',1litre = '$v1litre',2litre = '$v2litre',3litre = '$v3litre',5litre = '$v5litre',7litre = '$v7litre' WHERE productcode = '$productcode'");

if ($stmt === FALSE) { echo "an error has occured"; }

$stmt->execute(); 
$stmt->close(); 
echo $productcode.' - Updated<br/ >';
    }
}
}
fclose($file);

}
}

3 个答案:

答案 0 :(得分:0)

似乎有一个大括号丢失,我认为它确实会让它尝试更新任何 - 缩进语句以帮助使它更清晰,并添加mysqli而不是mysql,它似乎是错误的 - 假设一切都应该是mysqli 。希望这可能会有所帮助。

您需要添加清理/清理/转义代码,但我假设您知道

if(isset($_GET['uploadfile'])){
    $file = fopen($_FILES['csvfile']['tmp_name'], 'r+');
        while(! feof($file)){
        $line = fgetcsv($file, 0, ',');


        list($productcode, $v9cm, $v1litre, $v2litre, $v3litre, $v5litre, $v7litre) = $line;

        $rowcheck = "SELECT * FROM `stock` WHERE `productcode` = '$productcode'";

             if (@mysqli_num_rows(mysqli_query($rowcheck))!=1){

                 if ($productcode == NULL OR $productcode == ''){
                 echo "Product code missing and rowcheck is not 1<br/ >";  // for testing
                 }else{
                 $datecreated = date('Y-m-d');
                 // Insert Posted Data
                 mysqli_query($db,"INSERT INTO stock (`datecreated`, `productcode`, `9cm`, `1litre`, `2litre`, `3litre`, `5litre`, `7litre`) VALUES ('$datecreated', '$productcode', '$v9cm', '$v1litre', '$v2litre', '$v3litre', '$v5litre', '$v7litre')") or die ('Unable to execute query. '. mysqli_error());
                 echo $productcode.' - Added<br/ >';
                 }    

             }elseif($productcode == NULL OR $productcode == ''){
             echo "Product code missing<br/ >"; // for testing
             }else{
             $stmt = $db->prepare("UPDATE stock SET 9cm = '$v9cm',1litre = '$v1litre',2litre = '$v2litre',3litre = '$v3litre',5litre = '$v5litre',7litre = '$v7litre' WHERE productcode = '$productcode'");

                  if ($stmt === FALSE){
                  echo "an error has occured<br/ >"; 
                  }else{
                  $stmt->execute(); 
                  $stmt->close(); 
                  echo $productcode.' - Updated<br/ >';
                  }
             }
       }
 }

您可能还想查看使用上传文件直接使用临时名称http://www.acunetix.com/websitesecurity/php-security-4/和其他许多文件的安全隐患。

答案 1 :(得分:0)

这最终有效:

    if(isset($_GET['uploadfile'])){
        $file = fopen($_FILES['csvfile']['tmp_name'], 'r+');
            while(! feof($file)){
            $line = fgetcsv($file, 0, ',');


            list($productcode, $v9cm, $v1litre, $v2litre, $v3litre, $v5litre, $v7litre) = $line;


            $query = mysqli_query($db, "SELECT * FROM stock WHERE productcode='".$productcode."'");

    if(mysqli_num_rows($query) > 0){

         $stmt = $db->prepare("UPDATE stock SET 9cm = '$v9cm',1litre = '$v1litre',2litre = '$v2litre',3litre = '$v3litre',5litre = '$v5litre',7litre = '$v7litre'
           WHERE productcode = '$productcode'");

        if ($stmt === FALSE) { echo "an error has occured"; }

        $stmt->execute(); 
        $stmt->close(); 
        echo $productcode.' - Updated<br/ >';

    }else{
        // do something
        if (!mysqli_query($db,$query))
        {

              $datecreated = date('Y-m-d');
        // Insert Posted Data
       mysqli_query($db,"INSERT INTO stock (`image`,`genusid`,`datecreated`, `productcode`, `9cm`, `1litre`, `2litre`, `3litre`, `5litre`, `7litre`) VALUES ('None.gif','5','$datecreated', '$productcode', '$v9cm', '$v1litre', '$v2litre', '$v3litre', '$v5litre', '$v7litre')") or die ('Unable to execute query. '. mysqli_error());
            echo $productcode.' - Added<br/ >';
        }
    }


                    }}}

答案 2 :(得分:0)

使用mysql的ON DUPLICATE KEY UPDATE子句(http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html)可能更容易。

请参阅hjpotter92的答案:On Duplicate Key Update same as insert。您的查询需要修改为以下内容:

INSERT INTO table (id,a,b,c,d,e,f,g)
    VALUES (1,2,3,4,5,6,7,8) 
    ON DUPLICATE KEY
        UPDATE a=a, b=b, c=c, d=d, e=e, f=f, g=g;

这应该允许您删除大多数条件逻辑,并减少您运行的查询数量。