2012-07-23 94 views
1

如何將(從表單中)的值插入到MySQL日期字段中。我想這樣的:如何將HTML輸入字段的值插入到MySQL中?

<form action="enviar.php" autocomplete="off" method="post"> 
    <label for="nacimiento" class="youpasswd" data-icon="p"> 
     Fecha de Nacimiento 
    </label> 
    <br> 
    <input id="nacimiento" name="nacimiento" 
      required type="datetime" placeholder="DD/MM/YYYY" /> 
</form> 

enviar.php

$nacimiento= $_POST['nacimiento']; 
mysql_query("INSERT INTO voluntarios(nacimiento) VALUES ('$nacimiento')");` 

這是工作的所有其他領域,但不與日期字段;它是空的。我究竟做錯了什麼?

謝謝

+6

使用參數化的SQL查詢或您_Will_會被黑客入侵。您的網站目前對SQL注入開放。請參閱http://bobby-tables.com/ – Lusitanian 2012-07-23 22:36:00

+1

mysql_函數已棄用(即將來將被刪除)。切換到mysqli_或更好,以PDO。減輕你的問題,你確定你的數據庫將接受格式爲dd/mm/yyyy的日期字符串嗎?很可能正確的格式必須是YYYY-MM-DD – fvu 2012-07-23 22:39:05

+0

正如@Lusitanian所述,除非有充分的理由不應該使用參數化查詢(例如PDO)。否則,您可以這樣做:'$ nacimiento = mysql_real_escape_string($ _ POST ['nacimiento']);' – Andy0708 2012-07-23 22:39:05

回答

4

seem to have problems even getting the value from your input field to the server閱讀起來。這需要首先得到解決。 Debugvar_dump)您的$_POST數據並檢查發生了什麼。如果您需要更多幫助,請致電Provide more code。從你寫的內容來看,我不明白,爲什麼價值不應該發送。

後你有你的日期字符串,convert值的字符串文字格式MySQL recognizes

$mysqldate = date('Y-m-d H:i:s', $phpdate); 

然後使用mysqli_query插入:

mysqli_query(sprintf("INSERT INTO voluntarios(nacimiento) VALUES ('%s')"), 
         mysql_real_escape_string($mysqldate)); 

使用PDO做到這一點:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
$q = $dbh->prepare("INSERT INTO voluntarios(nacimiento) VALUE (:nacimiento)"); 
$q->bindParam(':nacimiento', $mysqldate, PDO::PARAM_STR); 
$success = $q->execute(); 
+0

+1! – 2012-07-23 23:02:02

+0

@Wolfram請檢查JSFIDDLE中表單的完整代碼。謝謝 – 2012-07-24 14:40:09

+0

做一個var_dump我看到我在變量中有一個錯誤,這是固定的。現在'$ nacimiento'正在接受日期,我可以將其存儲在數據庫中。在這個時候,我正在閱讀和學習PDO做安全代碼。 – 2012-07-24 15:56:26

0

使用STR_TO_DATE將文本轉換爲有效的日期格式:

STR_TO_DATE('12/15/2008', '%m/%d/%Y'); 
2

嘗試和回聲$_POST['nacimiento'];,看看它做什麼?它似乎也沒有發佈你的整個SQL查詢,也許在查詢中有錯誤?

編輯:您也可以嘗試,看看是什麼錯誤使用mysql_ *函數使用mysql_error


下面的代碼很容易受到SQL injection

$nacimiento= $_POST['nacimiento']; 
mysql_query("INSERT INTO voluntarios(nacimiento) VALUES ('$nacimiento')");` 

停止,因爲他們正在過時。改爲使用PHP database objects (PDO),因爲PDO允許使用參數綁定來保護您免受sql注入。

您可以使用PDO here

+1

或者使用比PDO簡單的mysqli。無論如何,原始的mysql函數都被棄用了。 – Aatch 2012-07-23 22:47:17

+0

正在做echo $ _POST ['nacimiento'];結果是空的 – 2012-07-23 22:50:58

+0

@Aatch - _simpler_只是一個意見問題,但我認爲PDO被更廣泛地採用,這就是爲什麼我推薦它:) – Kush 2012-07-23 22:51:08

1

MySQL expec ts YYYY-MM-DD格式的日期文字as explained in the manual。雖然它接受的內容相當寬鬆,但是您提供的格式不可接受。

你可能會擺脫一些字符串雜耍大概,但請自己幫忙,正確 - 也就是使用PDO prepared statements。您不僅可以輕鬆推遲日期解析&預先檢查到PHP,您的代碼將是一個更安全和未來的證明。

的代碼看起來像這樣,使用元素從你的例子

$stmt = $dbh->prepare("INSERT INTO voluntarios(nacimiento) VALUES (:nacimiento)"); 
$stmt->bindParam(':nacimiento', $nacimiento); 
// WARNING - strtotime strtotime expects '-' separators if you feed it dd-mm-yyyy 
// you should modify that in your form. 
$nacimiento = strtotime($_POST['nacimiento']); 
$stmt->execute(); 
1

你的問題很可能是日期需要被格式化成SQL標準(YYYY-MM-DD)。如果你想確保格式,那麼你可以使用類似這樣

$formatted_date = date('Y-m-d',strtotime($_POST['nacimiento'])); 

如果你是用什麼將來到您在POST相當有信心,那麼你可以使用這個

preg_match('#^(\d{1,2})/(\d{1,2})/(\d{4})$#', $_POST['nacimiento'], $matches); 
if(count($matches)) 
{ 
    $formatted_date = $matches[3].'-'.str_pad($matches[1],2,0,STR_PAD_LEFT).'-'.str_pad($matches[2],2,0,STR_PAD_LEFT); 
    // Use formatted date in query 
} 
else // handle error 
相關問題