2014-08-28 71 views
0

我有我寫了下面的腳本:PHP腳本只能插入5000行到phpMyAdmin的數據庫

<?php 

$filename = "readingDataFromThis.LOG"; 
$filterarray= array("stuff to remove from the file", "and more stuff"); 
if (file_exists($filename) && is_readable ($filename)) { 
    ini_set('memory_limit','16M'); 
    ini_set('max_execution_time', 600); 
    $con=mysqli_connect("server","username","password","database_name"); 
    $count = 0; 

    $fh = fopen($filename, "r"); 
    if ($fh) { 
     while (($line = fgets($fh)) != false) { 

      if (mysqli_connect_errno()) { 
       echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
      } 
      if (strpos_arr($line, $filterarray) == false) { 
       $month = substr($line, 3,5); 
       $day = substr($line, 0,2); 
       $year = substr($line, 6,8); 
       $timestamp = substr($line, 9, 17); 
       $message = substr($line, 18); 

       mysqli_query($con,"INSERT INTO Conversation (Month, Day, Year, Time, Message) 
       VALUES ('$month', '$day', '$year', '$timestamp', '$message')"); 
       echo "Inserted record " . $count++ . "<br>"; 
      } 
     } 
    } 
    fclose($fh); 
    mysqli_close($con); 
    echo "Complete."; 
} 

function strpos_arr($haystack, $needle) { 
    if(!is_array($needle)) $needle = array($needle); 
    foreach($needle as $what) { 
     if(($pos = strpos($haystack, $what))!==false) return $pos; 
    } 
    return false; 
} 
?> 

當我運行它,我沒有問題,我收到了屏幕上的輸出基本上是這樣的:

Inserted record 0 
Inserted record 1 
... 
Inserted record 14000+ 
Complete. 

但是,當我到數據庫本身的表中時,我發現只有前5000條記錄才被插入到數據庫中。這裏發生了什麼?

+3

'phpMyAdmin'對它一次顯示的行數有限制。你確定這不是你遇到的? 'SELECT COUNT(*)FROM Conversation'顯示什麼? – Barmar 2014-08-28 03:58:06

+0

SELECT COUNT(*)FROM 通話 >返回> COUNT(*) ----所以,我手動插入一條記錄,我可以從我的主表視圖中看到5001分的記錄。 – cuckoo 2014-08-28 04:03:15

+0

是否有任何列具有唯一索引?您可能有重複的內容。 – Barmar 2014-08-28 04:06:43

回答

0

使用:

$message = mysqli_real_escape_string($con, substr($line, 18)); 

,以確保該消息可以被適當地替換到所述查詢。否則,如果$message包含一個引號字符,則當它被抽象到查詢中時,將獲得無效的SQL語法。

使用mysqli_prepare()mysqli_stmt_bind_param()重新編碼會更好。

0

是否有可能將它們複製到您的密鑰上,因此未插入或正在更新以前的值。 如果時間太長,可能會超時。然而,PHPMyAdmin有一個功能,如果即將到達超時,它將停止執行 - 這也意味着它可以讓你從正確的位置恢復。

+1

如果超時,它將如何打印出所有'插入的記錄N'行?他已經在評論中說過沒有重複的數據。 – Barmar 2014-08-28 04:22:02

+2

他沒有使用PHPMyAdmin來執行插入,他使用的是PHP腳本。 – Barmar 2014-08-28 04:22:31

0

在討論與Barmar合作,我們結束了修改下面的代碼行:

$message = mysqli_real_escape_string($con,substr($line, 18)); 

這本質上處理文本的怪行具有字符,如「在其中,這將打破語法SQL INSERT語句。

mysqli_query($con,"INSERT INTO Conversation (Month, Day, Year, Time, Message) 
    VALUES ('$month', '$day', '$year', '$timestamp', '$message')") or die(mysqli_error($con)); 

在這個代碼塊,我們添加了或死亡(mysqli_error($ CON));

這告訴程序暫停執行並輸出錯誤原因。這與下面的錯誤給我提供:

用戶「my_sa」已經超過了「max_updates」資源(當前值:5000)

我使用的是免費的虛擬主機,所以基於一些谷歌搜索,我們確定這可能是一個速率限制問題,可以通過迭代運行程序來一次插入一段記錄來解決。