将CSV文件中的值插入到MySQL表中

4
我正在尝试将从csv文件中提取的值插入到mysql表中。程序可以运行,但是表格没有被填充。我已经尝试了XXXX进行调试,但是仍然找不到错误。使用echo输出值会给我正确的SQL语句,但是当它来到INSERT时就无法执行。谢谢您的帮助。
<?php 

$host = 'localhost';
$user = 'fulltime_admin';
$pass = 'secret';
$database = 'fulltime_db';

$db = mysql_connect($host, $user, $pass);
mysql_query($database, $db);

//////////////////////////////// EDIT //////////////////////////////////// 

$redirect_num = 500;   // Select how many rows to insert each time before refresh. 
// More rows = faster insertion. However cannot be too high otherwise it will timeout. 

$filename = "ps4_emails.csv"; // The file we are going to get the data from... 

$table = "`ps4_emails`"; 

////////////////////////////// END EDIT ////////////////////////////////// 

$file = file($filename); 
$lines = count($file); 

// Have we just redirected? 
$nextline = $_GET['nextline']; 
if (!isset($nextline)){ 
    $nextline = 0; 
} 

$query = "INSERT INTO ".$table." (email) VALUES ('".$final_line[0]."')";

for ($line=$nextline; $line<=$lines; $line++){ 

    $final_line = explode(",", $file[$line]); 

    if ($line!=$lines){ 
        mysql_query($query,$db); 

    } 

    if ($line % $redirect_num){ 

        // something needs to go here
    } else { 
        $nextline = $line+1; 
        exit ('<meta http-equiv="refresh" content="0;url=texttomysqlemails.php?nextline='.$nextline.'" />'); 
    } 

    echo  ( $line==$lines ) ? "Done" : ""; 

} 
?>

1
不要使用mysql_*函数。请改用带有预处理语句的mysqli_*或PDO。 - Maru
1
请更改您的数据库密码。 - ThiefMaster
1
那么你预计这个脚本要运行多久?你要加载多少行到数据库中? - RiggsFolly
测试CSV文件有超过4000行,但我心目中的文件有超过1800万行和约48列数据。 - baselinej70
保存4000条记录的测试文件到数据库需要多长时间?你试过使用1800万条记录的文件吗? - Fernando León
显示剩余2条评论
3个回答

1
将查询放在循环内以便与变量$final_line一起使用。

尝试这样做:

$final_line = explode(",", $file[$line]); 

if ($line!=$lines){ 
   $query = "INSERT INTO ".$table." (email) VALUES ('".$final_line[0]."')";
    mysql_query($query,$db); 
} 

不要使用mysql_*。它已被弃用并从PHP 7中删除。请使用mysqli_*PDO

我需要将$final_line定义为数组吗? - baselinej70
不,你不需要这样做。PHP是弱类型的。 - Mr. Engineer
我尝试过了,但它不起作用。我已经测试了数据库连接 - 没问题。我已经回显了 "INSERT INTO ".$table." (email) VALUES ('".$final_line[0]."')"; - 也没问题。我可以在 SQL 中看到电子邮件值。AAARRRRRgh :) - baselinej70
在phpadmin中运行该查询并查看发生了什么。 - Mr. Engineer
1
请检查您的第6行代码:mysql_query($database, $db)。应该改成mysql_select_db() - Mr. Engineer
显示剩余2条评论

1
这似乎是一个完美的脚本,可以从命令行PHP CLI运行,因此您可以忘记所有刷新的复杂性。
如果文件很大,就像您的评论建议的那样,将整个文件加载到内存中可能也会使您遇到PHP内存限制问题,因此最好逐行读取而不是使用意图用于读取csv文件的fgetcsv()读取整个文件。
<?php 

    $host = 'localhost';
    $user = 'fulltime_admin';
    $pass = 'secret';
    $database = 'fulltime_db';

    $db = mysql_connect($host, $user, $pass);
    mysql_query($database, $db);

    $filename = "ps4_emails.csv"; 
    $table = ""; 

    $handle = fopen('ps4_emails.csv', 'r');
    if ( ! $handle ) {
        echo 'File does not exists in this location';
        exit;
    }

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {

        $query = "INSERT INTO `ps4_emails` (email) VALUES( '{$data[0]}')";        

        mysql_query($query,$db); 
    }
?>

现在你只需从命令行/终端运行此脚本,如下所示:

>php script.php

它可以在几分钟/几小时/几天内运行,没有爆炸任何限制的可能性。

我必须提到这一点,否则会有人因为我没有说而唠叨我

请不要使用mysql_数据库扩展,它已被弃用(在PHP7中已经消失) 特别是如果你正在学习PHP,花费精力学习PDOmysqli_数据库扩展, 这里有一些帮助来决定使用哪个

当您需要上传真实文件时,最好添加重新启动机制,这样您就可以从发生问题的地方或某个人关闭数据库进行备份或其他未预见的故障处重新启动进程。

<?php 

    $host = 'localhost';
    $user = 'fulltime_admin';
    $pass = 'secret';
    $database = 'fulltime_db';

    $restart_from = 0;

    $db = mysql_connect($host, $user, $pass);
    mysql_query($database, $db);

    $filename = "ps4_emails.csv"; 
    $table = ""; 

    $handle = fopen('ps4_emails.csv', 'r');
    if ( ! $handle ) {
        echo 'File does not exists in this location';
        exit;
    }

    // is it a restart?
    if ( file_exists('restart.txt') ) {
        // its a restart
        $restart_from = file_get_contents('restart.txt');

        // read up the file to the last good row inserted
        for ( $i=0; $i<=$restart_from; $i++ ) {
            $data = fget($handle, 1000);
        }
    }

    $upd_cnt = restart_from;
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {

        $query = "INSERT INTO `ps4_emails` (email) VALUES( '{$data[0]}')";        

        mysql_query($query,$db); 

        $upd_cnt++;
        file_put_contents('restart.txt', $upd_cnt);
    }
?>

上述重启代码未经测试,但我过去曾经使用过类似的代码非常成功。因此,您需要检查我是否犯了任何愚蠢的错误,但它应该可以让您了解如何在崩溃前成功更新最后一行并重新启动。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接