2010-05-06 103 views
1

嘗試向MySQL中插入日期時,我遇到了一個典型問題。PHP - 在MySQL中插入日期時發生錯誤

在MySQL中定義的列是DATE類型的。我的PHP版本是5.3.0

除了這個日期相關的問題,我的代碼的其餘部分工作得很好。

這是我的PHP腳本來做到這一點:

$tablename = BOOKS_TABLE; 
    $insert = mysql_query("INSERT INTO $tablename (barcode, book_name, volume_num,". 
    " author, publisher, item_type, buy_price, buy_date) VALUES ". 
    "(". 
     "'" . $barcode  . "', ". 
     "'" . $bookname  . "', ". 
     "'" . $volumenum . "', ". 
     "'" . $author  . "', ". 
     "'" . $publisher . "', ". 
     "'" . $itemtype  . "', ". 
     "'" . $buyprice  . "', ". 
     "'" . getMySQLDateString($buydate). "'". 
     //"'STR_TO_DATE('".$buydate ."', '%d/%m/%Y'))'". //nothing changes in MySQL 
    ")"); 

這是錯誤的功能:

function getMySQLDateString($buydate) //typical buydate : 04/21/2009 
{ 
    $mysqlDateString = date('Y-m-d H:i:s', $strtotime($buydate)); 

    return $mysqlDateString; 
} 

第一註釋掉行不會做任何事情,在執行腳本沒有錯誤,但是,在此之後,數據庫中沒有任何變化。

當前方法將導致致命錯誤,說明函數名稱必須是此行中的字符串。

其實我也跟着this thread on SO,但就是無法日期傳遞到MySQL的

誰能幫我找出哪一部分是不正確的?

你會怎麼做,在這種情況下,它是正確的?

對不起,這種熟練的問題,非常感謝提前。

更新時間:

謝謝你提醒我這一點,並在這裏是作爲HTML輸出確切的錯誤信息:

致命錯誤:函數名必須是在C字符串:\ XAMPP \ htdocs中\上線漫畫\應用\ insertBookIntoDB.php 85

這點到符合

$mysqlDateString = date('Y-m-d H:i:s', $strtotime($buydate)); 
+1

即使您沒有將錯誤消息作爲任何信息的來源進行評估,其他人也會覺得它很有用。所以,然後在這裏提出問題,通過複製粘貼到你的問題,總是帶來確切的和完整的錯誤信息。它會幫助別人猜測特定的錯誤是什麼 – 2010-05-06 10:52:24

回答

2

在以下行中:

$mysqlDateString = date('Y-m-d H:i:s', $strtotime($buydate)); 

應該是這樣的:

$mysqlDateString = date('Y-m-d H:i:s', strtotime($buydate)); 

(例如,刪除功能上的美元)?

+0

@ David_001:啊......這是原因。我沒有想到從另一個線程複製... – 2010-05-06 10:57:06

0

在米開始y的意見,使用明確的日期格式存儲日期是煩人的,所有的字符串轉換刺激我。我建議在日期字段中使用BIGINT,並在數據庫中存儲曆元時間值。

你可以得到劃時代的時間與PHP:

time(); 

或者,更精確:

microtime(); 

另外,你可以輕鬆地操縱它們。要更改日期第二天:

$myTime + 86400; 

這種劃時代的時間格式是很容易的存儲和使用,而不是所有的字符串轉換廢話竊聽。爲了得到價值整潔的字符串:

date("FORMAT STRING", $myTime); 
+0

@Delan Azabani:其實$ buydate來自瀏覽器,它是由一個JavaScript datepicker小部件進行genreated,這將符合aussies寫一個日期的方式(DD/MM/YYYY)。它是我的客戶的「規則」的一部分:) – 2010-05-06 10:45:35

+1

我寫了一個腳本,它自動用基於用戶友好的下拉式輸入(僅包含腳本)替換文本字段(保存時代時間戳)。即使輸入是友好的,紀元的時間戳仍然會被髮送:http://azabani.com/43 – 2010-05-06 10:51:41

+0

這是我用來獲取在澳大利亞寫作日期的「正確」方式的jquery插件(DD/MM/YYYY ): http://www.eyecon.ro/datepicker/,這真的很不錯:) – 2010-05-06 11:12:36

1

不知道你的問題的原因,但你似乎在這裏失去收盤:

"'" . getMySQLDateString($buydate). 

應該

"'" . getMySQLDateString($buydate)."'" 
+0

@Soufiane Hassou:對不起,這是我從源代碼複製它的錯誤,它仍然有同樣的問題。所以我想說這似乎不是麻煩製造者 – 2010-05-06 10:49:31

1

這必須是一個評論,但爲了代碼格式化。

儘管花哨的格式,你的代碼可以幫助你沒有這種情況。
爲了使它更有用,您必須在其中添加一些調試功能。
明智的變量名也有助於
除了從字符串構建

$sqldate = getMySQLDateString($buydate); 
$sqldate = mysql_real_escape_string($sqldate); 
//we name this variable $sql because it contains an SQL query 
$sql = "INSERT INTO $tablename (barcode, book_name, volume_num, 
     author, publisher, item_type, buy_price, buy_date) VALUES 
     (
     '$barcode', 
     '$bookname', 
     '$volumenum', 
     '$author', 
     '$publisher', 
     '$itemtype', 
     '$buyprice', 
     '$sqldate' 
     )"; 
//we name this variable $res because it's a resource 
//type variable contains query result 
$res = mysql_query($sql) or trigger_error(mysql_error().htmlspecialchars($sql)); 

在執行刪除函數調用,該代碼會告訴你全面的信息上的錯誤,如果有發生。

+0

@Col。碎片:完全同意,這使得代碼必須更易於編碼和閱讀。 – 2010-05-06 11:05:36