2011-08-10 46 views
0

在 「form.php的」奇怪的行爲時的日期到數據庫

<html> 
    <body> 
     <form action="process.php" method="post"> 
      <input type="text" name="dat" /> 
      <input type="submit" value="submit" /> 
     </form> 
    </body> 
</html> 

在 「process.php」:

<?php 
    echo $_POST['dat']; 

    mysql_connect("localhost", "root", "123456") 
      or die("can't connect"); 
    mysql_select_db("st") 
     or die("can't selectdb"); 

    $query = "INSERT INTO sts (time) VALUES (" . $_POST['dat']. " ) "; 


    $result = mysql_query($query) 
     or die(mysql_error()); 

    $mysql_close(); 

?> 

這給我0000-00-00數據庫,在類型「日期」的字段名稱「時間」中。 如果使用這樣的:

$time = explode("-", $_POST['dat']); 
    $query = "INSERT INTO sts (time) VALUES (" . date("m-d-Y", mktime(0, 0, 0, $time[1], $time[2], $time[0])). " ) "; 

- >不工作,要麼

編輯: 我從「MDY」到「年月日」變更爲適當的語義,但它仍然無法正常工作

但是,如果我改變這樣的代碼:

$query = "INSERT INTO sts (time) VALUES ('1991-10-05') "; 

它的工作原理。

任何人都可以解釋這對我嗎?

+0

'日期( 「MDY」)=日期(「YMD! 「)'。你如何格式化'dat'? – Problematic

+0

'$ query =「INSERT INTO sts(time)VALUES(」。$ _POST ['dat']。「)」;'小心避免這樣的代碼,這只是SQL注入的調用。 – SirDarius

+1

請嘗試使用PDO並準備好語句。這不是更困難,你會花很少的時間來學習它。 –

回答

0

無論是如果你的兩個PHP例子有日期被引用。他們會產生疑問,看起來像:

INSERT INTO sts (time) VALUES (2009-01-02); 

將被解析到

INSERT INTO sts (time) VALUES (2006) 

2009-01-02是數字文字有兩個減法,不是約會。爲了讓讓MySQL把它當作一個日期值,則必須使用引號:

INSERT INTO sts (time) VALUES ('2009-01-02'); 
           ^----------^--- quotes MUST be present 

所以你的PHP應該是這樣的:

$date = mysql_real_escape_string($_POST['dat']); 

$query = "INSERT INTO sts (time) VALUES ('$dat');"; 
+0

$ newdate = mysql_real_escape_string($ _ POST ['dat']); $ query =「INSERT INTO sts(time)VALUES($ newdate)」;它仍然是0000-00-00 – Silentbang

+0

啊我忘了報價。它現在有效 – Silentbang

2

你想date("Y-m-d"沒有date("m-d-Y"

See here for explanation of what date/time formats MySQL accepts

如果你使用這種格式還需要各地至今的報價,因爲沒有他們,MySQL的覺得你插入nymber:1991-10-05 = 1976

$query = "INSERT INTO sts (time) VALUES ('" . date("Y-m-d", mktime(0, 0, 0, $time[1], $time[2], $time[0])). "' ) "; 

或可替代短格式,不帶引號

$query = "INSERT INTO sts (time) VALUES (" . date("Ymd", mktime(0, 0, 0, $time[1], $time[2], $time[0])). " ) "; 

和個人而言,我會怎麼做:

$ts = strtotime($_POST['dat']); 
if($ts != 0) { 
    $date = date('Ymd',$ts);  
    $query = "INSERT INTO sts (time) VALUES ($date) "; 
} else { 
// invalid date format 
} 

就如同別人評論說:從來沒有把$_POST(或$_GET或任何不受信任的數據)直接在您的查詢中。首先逃避/消毒數據。

+0

我已經改變它爲Ymd,如你所說。但仍然0000-00-00 – Silentbang

+0

什麼在$ _POST ['dat']呢? – Mchl

+0

如果我回顯$ _POST ['dat']這正是我想要的。例如:2009-01-02 – Silentbang

1

的日期被存儲爲Y-M-d

所以,你的代碼應該做的:

$query = "INSERT INTO sts (time) VALUES (" . date("Y-m-d", mktime(0, 0, 0, $time[1], $time[2], $time[0])). " ) ";