2015-10-05 64 views
0

我有一個包含來自設備的數據的文件,我需要將此數據插入到數據庫中。該文本文件是這樣的:使用PHP將TXT文件中的行插入到SQL數據庫中

10/01/15-20:37:30 = 40.2,25.4,42.3,54.3,70.0,66.6 
10/01/15-20:38:26 = 67.3,18.4,30.6,39.3,70.0,66.6 
10/01/15-20:39:21 = 74.5,16.8,28.2,36.0,70.0,66.6 
10/01/15-20:40:16 = 76.8,16.6,27.6,35.2,70.0,66.6 
10/01/15-20:41:12 = 78.1,16.4,27.3,34.9,70.0,66.6 

而且我的代碼目前看起來是這樣的:

<?php 
    $servername = "localhost"; 
    $username = "root"; 
    $password = "pass"; 
    $dbname = "dbase"; 


    // Create connection 
    $conn = new mysqli($servername, $username, $password, $dbname); 
    // Check connection 
    if ($conn->connect_error) { 
     die("Connection failed: " . $conn->connect_error); 
    } 
?> 

<?PHP 

    $file_handle = fopen("datalog.txt", "r"); 

    while (!feof($file_handle)) { 

    $line_of_text = fgets($file_handle); 
    $parts = explode(' ', $line_of_text); 

    print $parts[0] . $parts[1]. "<BR>"; 

} 

$datainsert = "INSERT INTO reading (val1, val2, val3, val4, val5, val6, val7, val8, val9, val10) VALUES ($parts[0])"; 

if (mysqli_query($conn, $datainsert)) { 
    echo "New record created successfully"; 
} else { 
    echo "Error: " . $datainsert . "<br>" . mysqli_error($conn); 
} 


?> 

<?php 
$conn->close(); 
?> 

我得到的錯誤是這樣的:

Error:

INSERT INTO reading (Box_ID, Time_Stamp, Temperature, Humidity, CO_Level, VOC_Reading_UOM, VOC_Reading_V1, VOC_Reading_V2, VOC_Reading_V3, VOC_Reading_V4) VALUES() Column count doesn't match value count at row 1

我的數據庫和網站都連接不錯誤,而這個頁面是唯一有問題的頁面。出了什麼問題?

+0

從查看該錯誤消息,您不會在SQL的VALUES部分添加任何內容。檢查'$ parts [0]'是否包含你認爲它包含的內容。 – andrewsi

+0

錯誤消息表明它沒有在'VALUES()'中傳遞任何數據,所以查詢當然會失敗 – RiggsFolly

+0

我將$ parts [0]放在值區域中,因爲我認爲這是代碼拉的地方來自的信息。如果您在代碼中看起來稍早,您將看到$ parts = explode,然後將值拉出並分開。所以我沒有正確地訪問這些信息就是你所說的? – graphicdesigner88

回答

0

您似乎是由包含兩個空格的字符串爆炸。然而,在你的文本文件中,你的'字段'被一個空格分開。你應該改變你的電話explode()使用一個單一的空間(或看中,看看preg_split())。

+0

順便說一句,就我所知,你仍然需要做一些比你現在做的更有趣的事情,因爲你的數據庫列不能真正匹配你的文本文件的數據。你真的不應該有名爲'val1','val2'等的列,因爲這樣就不可能說出它們實際上的含義。 –

+0

我在爆炸中有一個選項卡來分隔數據。我這樣做是爲了確保我的數據能夠很好地分離,並且它的結果非常好。我還沒有聽說過preg_split命令,請不要偷看它。我剛剛開始學習如何在一週前做到這一點,所以新的信息總是很好 – graphicdesigner88

+0

10這些值確實有不同的名稱,但我改變了他們,因爲我參與的項目。我整個項目都傾倒在我身上,我爭先恐後地玩趕上並嘗試,只是讓這個數據庫讀取這個文件,所以我們可以做一個測試服務器。沒有人明白,作爲一名平面設計師,我的代碼知識有限。我可以設計一些東西,讓它們看起來很棒,但我不能總是讓它們正常工作。我期望更多的代碼人們這樣做,但我被告知不,我的預算很便宜,我不得不做更多的事情。 – graphicdesigner88

0

它在我看來你想explode()你的線串使用空格作爲分隔符。但是,根據你的問題,這不是如何組合在一起的。

這裏是一個線串,數字顯示它是如何用空間爆炸的。

10/01/15-20:37:30 = 40.2,25.4,42.3,54.3,70.0,66.6 
00000000000000000 1 22222222222222222222222222222 

也許你想要讓兩個explode()調用序列:

$a = explode (' = ', $line_of_text); 
    $vals = explode(',' $a[1]); 

這將打破你的線,像這樣

10/01/15-20:37:30 = 40.2,25.4,42.3,54.3,70.0,66.6 
00000000000000000 11111111111111111111111111111 
        0000 1111 2222 3333 4444 5555 

在的這兩個結束explode()叫你會有一個$ vals數組和你的六個數字。然後你可以像這樣做你的插入。

INSERT INTO reading 
     (tstamp, val1, val2, val3, val4, val5, val6) 
VALUES (STR_TO_DATE('%m/%d/%y %H:%i:%s',?), ?,?,?,?,?,?) 

可以綁定$a[0] - 從你的觀察線的時間戳 - 在第一?佔位符,並$vals的佔位符的其餘六大要素。

編輯好的,讓我們來談談佔位符。他們與bind_param() in MySQLi一起去。請閱讀。認真。

您的代碼可能是這個樣子:

$linecount = 0; 

$file_handle = fopen("datalog.txt", "r"); 
while (!feof($file_handle)) { 
    $line_of_text = fgets($file_handle); 
    $a = explode (' = ', $line_of_text); 
    $vals = explode(',' $a[1]); 

    if ($linecount == 0) { 
     /* rig up your SQL statement, just once */ 
     $sql = "INSERT INTO reading (tstamp, val1, val2, val3, val4, val5, val6) VALUES (STR_TO_DATE('%m/%d/%y %H:%i:%s',?), ?,?,?,?,?,?)"; 
     $stmt = $mysqli->prepare($sql); 
     $stmt->bind_param('dssssss', $a[0], $vals[0],$vals[1],$vals[2],$vals[3],$vals[4],$vals[5]); 
    } 
    if (!$stmt->execute()) { 
     printf("Error: %s.\n", $stmt->error); 
    } 
    $linecount++; 
} 

$stmt->close(); 

請注意:我還沒有機會調試代碼;如果你使用它,那留給你。

+0

哇!好吧,這看起來很有趣。我理解這兩個爆炸,這是有道理的。爆炸後我在VALUES區域顯示數字時感到困惑。 STR_TO_DATE有點有道理,但問題標記正在扔我。對不起,手拿着,我非常非常新。我非常感謝大家的幫助 – graphicdesigner88

+0

謝謝你讓我知道在哪裏運行。我也會玩這個。我很欣賞代碼片段,我感謝您給予的幫助。我一定會考慮綁定參數。我可能會在關於過程的問題上提出幾個問題,但這會有所幫助 – graphicdesigner88

相關問題