2012-11-16 93 views
1

可能重複:
Convert MMDDYYYY to date for PHP
PHP mysql insert date formatPDO逃脫斜線

我用PDO插入我的數據庫中的數據,但是我必須在形式的date,這裏是部分的代碼:

$name = "John Doe"; // from form 
$bdate = 05/13/1989; // from form 

$query = "INSERT INTO details (name, bdate) VALUES (:name, :bdate)"; 
$stmt = $this->handle->prepare($query); 
$stmt->bindParam(':name',$name,PDO::PARAM_STR); 
$stmt->bindParam(':bdate',$bdate,PDO::PARAM_STR); 
$stmt->execute(); 

在運行腳本時,我在日誌中遇到此錯誤:「SQLSTATE [22007]:日期時間格式無效:1292錯誤的日期值:'05/13/1989'列1中的'bdate'列'

我的數據庫:

+-------+--------------+ 
| name | varchar(100) | 
+-------+--------------+ 
| bdate | date  | 
+-------+--------------+ 

回答

3

的MySQL通常需要在YYYY-MM-DD格式的日期。最好將你的大砍日期轉換成。

這不是斜槓的問題,因爲斜槓不是首先被轉義出來的。只有可能破壞字符串轉義的東西纔會改變。很顯然,MYSQL正在獲取正確的字符串,但由於格式化問題而拒絕它。

1

在將任何東西插入到數據庫之前,最好確保它包含諸如「,/,」等字符,因此更好的辦法是創建一個函數來添加或條帶斜線並返回無風險字符串以插入到數據庫中。 。 所以你可以做的是,

$bdate = 05/13/1989; 
$bdate = mysql_prep($bdate); 

function mysql_prep($value) { 
    $magic_quotes_active = get_magic_quotes_gpc(); 
    $new_enough_php = function_exists("mysql_real_escape_string"); // PHP >= v4.3.0 
    if ($new_enough_php) { 
     if ($magic_quotes_active) { 
      $value = stripslashes($value); 
     } 
     $value = mysql_real_escape_string($value); 
    } else { // before PHP v4.3.0 
     if (!$magic_quotes_active) { 
      $value = addslashes($value); 
     } 
    } 
    return $value; 
} 
+1

請向OP瞭解如何使用預處理語句。 –

+0

OP使用的是PDO,而不是'mysql_';爲什麼你仍然關心低於PHP 5.2的任何內容,更不用說PHP 4;不要對任何東西使用'addslashes';這甚至不是問題。 – deceze

1

要輸入日期到它需要YYYY-MM-DD的數據庫,或在您的案件1989年5月13日,只需創建一個函數,互換日期以正確順序排列

function swap_date($date) { 
    $newDate = explode("/", $date); 
    return "{$newDate[2]}-{$newDate[0]}-{$newDate[1]}"; 
} 

// ----- --------

$name = "John Doe"; 
$bdate = swap_date("05/13/1989"); // swap_date($_GET['date']) or whatever you use 

$query = "INSERT INTO details (name, bdate) VALUES (:name, :bdate)"; 
$stmt = $this->handle->prepare($query); 
$stmt->bindParam(':name',$name,PDO::PARAM_STR); 
$stmt->bindParam(':bdate',$bdate,PDO::PARAM_STR); 
$stmt->execute();