2017-10-28 64 views
2

我对将大量原始数据插入数据库的最佳方式有什么问题。将大量原始数据插入到数据库中PHP

的原始数据看起来是这样的(这是一个很多,但我不认为我需要用我的例子都):

CUSACODE - 游戏 - 控制台 - 大区 - DOWNLOADURL

CUSA00475 Akiba's Trip 2 PS4 JP http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00475_00/4/f_28d6a38b6ebac96d17a8b4de7616f6e5de43da365ef30d8354fb55df94eb0a4a/f/JP0048-CUSA00475_00-AKIBASNEXTAPP000.pkg 
CUSA00363 Alien: Isolation - 0 PS4 US http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_0.pkg 
CUSA00363 Alien: Isolation - 1 PS4 US http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_1.pkg 
CUSA00363 Alien: Isolation - 2 PS4 US http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_2.pkg 

使用空格分隔。

所以我认为这将是一个很好的做法,首先制作一个数组。一旦它在数组中,通过whilewhile循环一个SQL INSERT查询。

或者更好的做一个SQL查询呢?有什么方法可以生成这个SQL查询,所以我不必手动添加所有东西?

我试着这样做:

$data = "CUSA00475|Akiba's Trip 2|PS4|JP|http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00475_00/4/f_28d6a38b6ebac96d17a8b4de7616f6e5de43da365ef30d8354fb55df94eb0a4a/f/JP0048-CUSA00475_00-AKIBASNEXTAPP000.pkg, 
CUSA00363|Alien: Isolation - 0|PS4|US|http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_0.pkg, 
CUSA00363|Alien: Isolation - 1|PS4|US|http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_1.pkg, 
CUSA00363|Alien: Isolation - 2|PS4|US|http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00363_00/3/f_e0ebc06845e6271392d9e3060bed29f7a1fb71bc4d8a966714ddc6df50934638/f/UP0177-CUSA00363_00-ALIENISOLATIONP4_2.pkg"; 

$result = explode("|", $data); 

foreach($result as $res) { 
     $sub = explode(",",$res); 
     $mainCategory[$sub[0]] = explode("|",$sub[1]); 
} 

但是,可怕的失败。我希望有人能帮助我解决这个问题!

+0

哪些错误与进行SQL在while循环中插入?那里有什么问题? –

+0

您的原始数据是否在文件中?最好不要将所有数据加载到内存中(如果您的数据量很大)。 – nand42

+0

@FabianN。我不知道如何将这些信息放入数组中,所以我可以使用该数组将其插入到数据库中。 – Mitch

回答

1

如果涉及大量数据,一个好主意是使用准备好的语句,在循环之前初始化。然后在循环中绑定当前数据并执行语句。

这将是这个样子:

$sql = "INSERT INTO tableName(CUSACODE, GAME, CONSOLE, REGION, DOWNLOADURL) VALUES (?, ?, ?, ?, ?)"; 
$pstmt = $connection->prepare($sql); 

foreach($allData as $data){ 
    $pstmt->bind_param("sssss", $data[0], $data[1], $data[2], $data[3], $data[4]); 
    $pstmt->execute(); 
} 

$pstmt->close(); 

对于如何使在数据环几种方法,这取决于你如何存储数据。

例如,如果你的数据在某个地方保存为文本文件,你可以使用这样的事情:

$handle = fopen("inputfile.txt", "r"); 
if ($handle) { 

    $sql = "INSERT INTO tableName(CUSACODE, GAME, CONSOLE, REGION, DOWNLOADURL) VALUES (?, ?, ?, ?, ?)"; 
    $pstmt = $connection->prepare($sql); 

    while (($line = fgets($handle)) !== false) { 

     $data = explode("\t", $line); //if the original delimiter is a tab, which was guessed, because only "whietspace" would make no sense 

     $pstmt->bind_param("sssss", $data[0], $data[1], $data[2], $data[3], $data[4]); 
     $pstmt->execute(); 
    } 

    fclose($handle); 
    $pstmt->close(); 
} 

编辑:在已经转化为你|,格式的数据inmemory,你肯定会先制作一个遍历explode(',', $data)再与|爆炸,所以是这样的:

$sql = "INSERT INTO tableName(CUSACODE, GAME, CONSOLE, REGION, DOWNLOADURL) VALUES (?, ?, ?, ?, ?)"; 
$pstmt = $connection->prepare($sql); 

$seperatedData = explode(',', $data); 

foreach($seperatedData as $oneDataSet){ 
    $seperatedOneData = explode('|', oneDataSet); 

    $pstmt->bind_param("sssss", $seperatedOneData[0], $seperatedOneData[1], $seperatedOneData[2], $seperatedOneData[3], $seperatedOneData[4]); 
    $pstmt->execute(); 
} 

$pstmt->close(); 
+0

恕我直言,这将在大型数据集或大型文件的情况下爆炸。 –

+0

@M Noeini,在内存方法,当然,但逐行阅读文件是完全正确的,因为当一行太多的内​​存,然后米奇应该仍然考虑以不同的方式读取数据 –

+0

所以我修改你的第一个代码以满足我的需要(阅读你的编辑太迟了),但它给我$数据是未定义的。请看我编辑的问题。 – Mitch