2013-07-08 31 views
-1

所以我正在開發一個Web應用程序,它抓取一個.csv文件並解析它。然後將它提交給mysql數據庫。我正在成功檢索數據,並且能夠輸入所有正在檢索的數值。我遇到的一個問題是將日期插入到sql數據庫中。使用PHP插入日期到mySql數據庫,這是一個格式問題?

我沒有收到我知道的錯誤,並且日期值僅爲0000-00-00。當我運行腳本時,通過在PHP中回顯數據來檢查錯誤。它回聲良好,格式爲yyyy-mm-dd。如果你想給它一個測試運行,下面是php代碼運行良好,不幸的是我沒有一個公共服務器讓你測試它,如果你的系統上沒有運行wamp/lamp/equivalent。

我是否缺少一些簡單的東西?爲什麼這個日期不能正確插入?這是錯誤的格式嗎?它看起來是正確的格式,但是誰知道?

<?php 

    //Connect to Database 
    $con=mysqli_connect("localhost","root","","stockmarket"); 
    // Check connection 
    if (mysqli_connect_errno($con)) 
    { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 


    // Setup URL to download csv file 
    $requestUrl = "http://ichart.yahoo.com/table.csv?s=GOOG"; 


    // Pull data (download CSV as file) 
    $CSV = file_get_contents($requestUrl); 
    // Split results, trim way the extra line break at the end 
    $quotes = explode("\n",trim($CSV)); 

    //Explore array with .csv contents 
    foreach($quotes as $quoteraw) { 
    $quoteraw = str_replace(", I", " I", $quoteraw); 
    $quote = explode(",", $quoteraw); 
    echo $quote[0];//error check, should print dates in correct format  

     //Insert contents into database 
    mysqli_query($con,"INSERT INTO nasdaq (Symbol,Date,Open,High,Low,Close,Volume,Adjusted Close) VALUES ('goog',$quote[0],$quote[1],$quote[2],$quote[3],$quote[4],$quote[5],$quote[6])"); 
    } 

    mysqli_close($con); 
?> 
+1

如果您檢查了mysql錯誤,您可能會看到它。首先,日期是一個保​​留字。 – Jessica

+0

好的,這只是一個簡單的線路來檢查錯誤? –

+3

@Jessica'date'是一個保留關鍵字,但允許在不轉義的情況下使用。真正的問題是其中的一列包含空格。對於OP,您需要使用單引號將其轉義。 –

回答

2

您必須記得引用進入MySQL查詢的值。

INSERT INTO nasdaq (Symbol,Date,Open,High,Low,Close,Volume,Adjusted Close) 
VALUES ('goog','".$quote[0]."','".$quote[1]."','".$quote[2]."'"); -- and so on 

您的查詢爲您提供了SQL錯誤。您必須始終檢查mysql_query的結果以查看它是否正確。正如其他人所指出的那樣,您應該採取進一步的措施確保您避開單個的$quote值,並且最好使用預準備的語句。

+0

公平的評論我會編輯我的答案 – apartridge

+0

非常感謝你的回答Daryl Gill今晚似乎處於一種脾氣暴躁的狀態,低調錶示我的問題並告訴你你錯了,但是你的回答完全解決了我的問題。我非常感謝你的反饋,因爲我在這個問題上停留了幾個小時,對你有很大的幫助:)。祝你有個好的一週,+1,最好的回答,謝謝你:) :) –

+1

很高興我能幫忙。 – apartridge

1

如上所述,您需要引用您的字符串。 我不推薦apartridge的方法,因爲如果你的任何字符串包含引號字符,它將會失敗。它也會打開SQL注入攻擊。

例如:運行該查詢將失敗:

<?php 
$name = "O'Brien"; 
$query = "INSERT INTO table (LastName) VALUES ('$name')"; 
[...] 
?> 

幫助我,我用一個簡單的函數來逃避爲一步引用的每個變量,使用的MySQLi自己的逃生功能:

<?php 

function sq($mysql_obj, $value) { 
    // this function quotes $value to make it safe in an SQL statement 
    return "'" . $mysql_obj->real_escape_string($value) . "'"; 
} 

$mi = new mysqli("hostname", "username", "password", "database"); 
$name = "O'Brien"; 
$query = "INSERT INTO table (LastName) VALUES (".sq($mi,$name).")"; 
[...] 
?> 

請注意,你也可以引用數值數據,MySQL會很高興地處理它。所以你也可以這樣引用一切。

您可以做更多的事情來清理輸入並防止攻擊,但這超出了回答問題的範圍。

+0

很酷,謝謝你,+1。作爲第一個答案,我保持獨立,因爲我可以將這行代碼複製到我的.php文件中,並使其工作(並且)。但是我會記住這一點,並且在我去之前執行它(如果)。 –