在PHP中循环通过csv - 插入和更新

时间:2016-04-25 14:17:39

标签: php mysql csv

我在PHP中循环使用csv并使用数据更新mysql数据库。运行我的代码时,它会插入相同的数据800次,然后继续下一条记录。一旦它到达第二条记录,它似乎将每行插入数据库中的一行,就像它应该的那样。

我在mysql可能正在纠正的循环(可能是无限循环)中是否有错误?

$link = mysql_connect('localhost', 'user', 'pass');
if (!$link) {
    die('Not connected : ' . mysql_error());
}

// make foo the current db
$db_selected = mysql_select_db('parsetest', $link);
if (!$db_selected) {
    die ('Can\'t use parsetest : ' . mysql_error());
}

function csv_to_array($filename='', $delimiter=',')
{
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    return $data;
}

$data = csv_to_array('stockimp.csv');

foreach ($data as $key) {

    $style = $key['Style'];
    $result = mysql_query("SELECT * FROM stocklink2 WHERE Style = '$style'");
    if($result === FALSE) { 
        die(mysql_error()); // TODO: better error handling
    }
    if( mysql_num_rows($result) > 0) {
        $result = mysql_query("UPDATE stocklink2 SET Style = '$style' ");
        if (!$result) {
            die('Invalid query on update: ' . mysql_error());
        }
        else {
            echo $key['Style']." Updated <br>";
        }

    }
    else
    {
        $result = mysql_query("INSERT INTO stocklink2 (Style) VALUES ('$style') ");
        if (!$result) {
            die('Invalid query on insert: ' . mysql_error());
        }
        else {
            echo $key['Style']." Inserted <br>";    
        }

    }


}

更新

原来的问题已经解决了。该表没有任何列设置为唯一,一旦我将表的第一列更改为&#34; unique&#34;记录按顺序插入。

循环的更新部分现在无法复制条目&#39; 2&#39;。

1 个答案:

答案 0 :(得分:0)

原来的问题已经解决了。一旦我将表的第一列更改为“唯一”按顺序插入的记录,表中没有任何列设置为唯一。

循环的更新部分失败,重复条目为“2”。 最终的工作解决方案:

$link = mysql_connect('localhost', 'user', 'pass');
if (!$link) {
    die('Not connected : ' . mysql_error());
}

// make foo the current db
$db_selected = mysql_select_db('parsetest', $link);
if (!$db_selected) {
    die ('Can\'t use foo : ' . mysql_error());
}


/*===============================================
=            Generate array from csv            =
===============================================*/

function csv_to_array($filename='', $delimiter=',')
{
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    return $data;
}

$data = csv_to_array('stockimp.csv');

foreach ($data as $key) {

    //set and print style
    $style = $key['Style'];
    $id = $key['Rec No'];
    echo $style."<br><br>";

    // See if the style exists
    $result = mysql_query("SELECT * FROM stocklink2 WHERE 'Rec No' = '$id'");
    print_r($result);
    // if there's an error, die
    if($result === FALSE) { 
        die(mysql_error()); // TODO: better error handling
    }
    // else do this
    else{
        $insert = mysql_query("INSERT INTO stocklink2 (`Rec No`,`Style`) VALUES ('$id','$style') ON DUPLICATE KEY UPDATE Style = '$style'; ");

    }

}

这不是最佳解决方案,因为仍然可以添加mysqli和预处理语句。