PHP MySQL 插入日期格式

63

我正在使用jQuery日期选择器,日期格式如下:08/25/2012

当我插入到数据库时出现错误,只插入了0000-00-00 00:00:00

我的代码如下:

<?php
$id = $_POST['id'];
$name = $_POST['name'];
$date = $_POST['date'];
$sql = mysql_query( "INSERT INTO user_date VALUE( '', '$name', '$date')" ) or die ( mysql_error() );
echo 'insert successful';
?>

我确定我的插入操作是正确的。


25
请勿使用 mysql_* 函数编写新代码。它们已不再维护,社区已开始 弃用过程。看到*红色框*了吗?相反,您应该了解预处理语句,并使用 PDOMySQLi之一。如果您无法决定使用哪个,请参考本文。如果选择PDO,则可以使用这个好的教程 - Madara's Ghost
11个回答

183

日期和时间文字中所述:

MySQL识别以下格式的DATE值:
  • 字符串格式为'YYYY-MM-DD''YY-MM-DD'。允许使用“宽松”语法:任何标点符号字符都可以用作日期部分之间的分隔符。例如,'2012-12-31''2012/12/31''2012^12^31''2012@12@31'是等效的。

  • 没有分隔符的字符串格式为'YYYYMMDD''YYMMDD',只要该字符串作为日期有意义即可。例如,'20070523''070523'被解释为'2007-05-23',但'071332'是不合法的(它具有无意义的月份和日期部分),并变成'0000-00-00'

  • 数字格式为YYYYMMDDYYMMDD,只要该数字作为日期有意义即可。例如,19830905830905被解释为'1983-09-05'

因此,字符串'08/25/2012'不是有效的MySQL日期字面量。您有四个选项(按照某种模糊的优先顺序,没有更多关于您需求的信息):
  1. Configure Datepicker to provide dates in a supported format using an altField together with its altFormat option:

    <input type="hidden" id="actualDate" name="actualDate"/>
    
    $( "selector" ).datepicker({
        altField : "#actualDate"
        altFormat: "yyyy-mm-dd"
    });
    

    Or, if you're happy for users to see the date in YYYY-MM-DD format, simply set the dateFormat option instead:

    $( "selector" ).datepicker({
        dateFormat: "yyyy-mm-dd"
    });
    
  2. Use MySQL's STR_TO_DATE() function to convert the string:

    INSERT INTO user_date VALUES ('', '$name', STR_TO_DATE('$date', '%m/%d/%Y'))
    
  3. Convert the string received from jQuery into something that PHP understands as a date, such as a DateTime object:

    $dt = \DateTime::createFromFormat('m/d/Y', $_POST['date']);
    

    and then either:

    • obtain a suitable formatted string:

      $date = $dt->format('Y-m-d');
      
    • obtain the UNIX timestamp:

      $timestamp = $dt->getTimestamp();
      

      which is then passed directly to MySQL's FROM_UNIXTIME() function:

      INSERT INTO user_date VALUES ('', '$name', FROM_UNIXTIME($timestamp))
      
  4. Manually manipulate the string into a valid literal:

    $parts = explode('/', $_POST['date']);
    $date  = "$parts[2]-$parts[0]-$parts[1]";
    

警告

  1. 您的代码容易受到SQL注入攻击。 您应该使用准备好的语句,其中将变量作为参数传递,这些参数不会被解释为SQL。如果您不知道我在说什么或如何修复它,请阅读Bobby Tables的故事。

  2. 此外,正如PHP手册章节中关于mysql_*函数所述:

    从PHP 5.5.0开始,此扩展已被弃用,不建议编写新代码,因为它将在未来被删除。相反,应使用mysqliPDO_MySQL扩展。在选择MySQL API时,还可以参考MySQL API概述获取更多帮助。

  3. 您似乎正在使用DATETIMETIMESTAMP列来保存日期值;我建议您考虑使用MySQL的DATE类型。如DATEDATETIMETIMESTAMP类型所述:

    DATE类型用于具有日期部分但没有时间部分的值。 MySQL以'YYYY-MM-DD'格式检索和显示DATE值。支持的范围是'1000-01-01''9999-12-31'

    DATETIME类型用于同时包含日期和时间部分的值。 MySQL以'YYYY-MM-DD HH:MM:SS'格式检索和显示DATETIME值。支持的范围是'1000-01-01 00:00:00''9999-12-31 23:59:59'

    TIMESTAMP数据类型用于同时包含日期和时间部分的值。TIMESTAMP的范围为UTC'1970-01-01 00:00:01''2038-01-19 03:14:07'


10
你应该考虑使用mktime()从那个日期创建一个时间戳。
例如:
$date = explode('/', $_POST['date']);
$time = mktime(0,0,0,$date[0],$date[1],$date[2]);
$mysqldate = date( 'Y-m-d H:i:s', $time );

9
$date_field         = date('Y-m-d',strtotime($_POST['date_field']));
$sql = mysql_query("INSERT INTO user_date (column_name,column_name,column_name) VALUES('',$name,$date_field)") or die (mysql_error());

2
感谢,你给了我提示。 date('Y-m-d',strtotime($_POST['date_field'])); 它能正常工作,这正是我想要的。 - Christhofer Natalius
有没有办法将这个推高一点?它非常简单且有效。被接受的答案很详细,但似乎没有这个选项。 - ssaltman

1

您必须确保jQuery输出的日期格式为YYYY-MM-DD。我发现jQuery返回的格式为MM-DD-YYYY,这不是有效的MySQL日期格式,因此会出现错误。

要将其转换为正确的格式,可以执行以下操作:

$dateFormated = split('/', $date);
$date = $dateFormated[2].'-'.$dateFormated[0].'-'.$dateFormated[1];

然后您将获得格式化日期,它将是有效的MySQL格式,即YYYY-MM-DD,例如2012-08-25

我还建议在插入数据到数据库时使用mysql_real_escape_string来防止SQL注入作为快速解决方案,或者更好地使用PDOMySQLi

您使用mysql_real_escape_string的插入查询应该像这样:

$sql = mysql_query( "INSERT INTO user_date VALUE( '', '" .mysql_real_escape_string($name). "', '" .mysql_real_escape_string($date). "'" ) or die ( mysql_error() );

1
从jQuery日期选择器中获取日期对象
var myDate = $('element').datepicker('getDate')

对于mysql,日期需要以正确的格式呈现。一个处理任何时区问题的选项是使用moment.js。

moment(myDate).format('YYYY-MM-DD HH:mm:ss')

0
假设您收到一个圣诞日期:2021年12月25日(西班牙语为"25 de Diciembre del año 2021"),以字符串格式"d-m-Y"表示,例如"12-25-2021"。首先从接收到的格式创建一个有效的DateTime对象:
var_dump(DateTime::createFromFormat("d-m-Y","25-12-2021", new DateTimeZone("America/Argentina/Buenos_Aires")));

这将生成以下输出:

object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2021-12-25 10:21:11.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(30) "America/Argentina/Buenos_Aires"
}

现在我们使用format("Y-m-d H:i:s"))从DateTime对象中获取日期字段:

var_dump(DateTime::createFromFormat("d-m-Y","25-12-2021",new DateTimeZone("America/Argentina/Buenos_Aires"))->format("Y-m-d H:i:s"));

这将生成一个输出,其中包含可以直接插入的值:

string(19) "2021-12-25 10:56:30"

简而言之,现在您可以像这样在MySQL中插入格式化日期(“DD-MM-YYYY”):

<?php
//string input post like "25-12-2021"
$date_input = $_POST['date_input']; 
//create DateTime object
$date_time_obj=DateTime::createFromFormat("d-m-Y","25-12-2021",new DateTimeZone("America/Argentina/Buenos_Aires"));
//format date ready to insert as string at MySQL
$str_date=$date_time_obj->format("Y-m-d H:i:s");
?>

现在可以直接从PHP运行MySQL查询:

<?php
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');

//verify connection
if (mysqli_connect_errno()) {
    printf("Error de conexión: %s\n", mysqli_connect_error());
    exit();
}
//prepare the query to execute
$stmt = $mysqli->prepare("INSERT INTO table_example (DATE_FIELD) VALUES (?)");
//prevent sql injection
$stmt->bind_param('s', $str_date);
//execute prepared statements
$stmt->execute ();
?>

为什么要使用DateTime::createFromFormat("dmY", str_replace("-","","25-12-2021"), new DateTimeZone("America/Argentina/Buenos_Aires"))而不是DateTime::createFromFormat("d-m-Y", "25-12-2021", new DateTimeZone("America/Argentina/Buenos_Aires")) - shaedrich
"INSERT INTO table_example (DATE_FIELD) VALUES ('$str_date')" 存在 SQL 注入的风险。请改用参数绑定。 - shaedrich

0

最简单的方法是

$dateArray = explode('/', $_POST['date']);
$date = $dateArray[2].'-'.$dateArray[0].'-'.$dateArray[1];

$sql = mysql_query("INSERT INTO user_date (column,column,column) VALUES('',$name,$date)") or die (mysql_error());

0

最近我对日期不是很熟练。幸好有以下的工作,我可以按照自己想要的格式打印日期。

$year = $_POST['year'];
$month = $_POST['month'];
$day = $_POST['day'];
$scr = strtotime($year . '-' . $month . '-' . $day);
$gelis_tarihi = date('Y-m-d', $scr);

$yil = $_POST['yil'];
$ay = $_POST['ay'];
$gun = $_POST['gun'];
$birlestir = strtotime($yil . '-' . $ay . '-' . $gun);
$gelis_tarihi = date('Y-m-d', $birlestir);

你的回答目前写得不清楚。请编辑并添加更多细节,以帮助其他人理解您如何回答问题。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0

HTML:

<div class="form-group">
  <label for="pt_date" class="col-2 col-form-label">Date</label>
  <input class="form-control" type="date" value=<?php echo  date("Y-m-d") ;?> id="pt_date" name="pt_date">
</div>

SQL

$pt_date = $_POST['pt_date'];

$sql = "INSERT INTO `table` ( `pt_date`) VALUES ( '$pt_date')";

<div class="form-group"> <label for="pt_date" class="col-2 col-form-label">日期</label> <input class="form-control" type="date" value=<?php echo date("Y-m-d") ;?> id="pt_date" name="pt_date"> </div> - Pupan Poulkaew
请在您的答案中添加一些解释,以便其他人可以从中学习。此外,请将所有信息都放在您的答案中,不要使用评论部分来包含更多信息。 - Nico Haase
没有研究人员应该使用这个查询 - 它是不安全/不稳定的。 - mickmackusa

-2
首先,将$date=$_POST['your date field name'];存储起来。
insert into **Your_Table Name** values('$date',**other fields**);

你必须在单引号 (' ') 中包含日期。

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接