我正在使用jQuery datepicker
datepicker的格式是08/25/2012
插入我的数据库时出错,它只插入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';
?>
我确定我的插页是正确的....
答案 0 :(得分:168)
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'
。作为
YYYYMMDD
或YYMMDD
格式的数字,前提是该数字作为日期有意义。例如,19830905
和830905
被解释为'1983-09-05'
。
因此,字符串'08/25/2012'
不是有效的MySQL日期文字。您有四种选择(在某些模糊的优先顺序中,没有任何关于您的要求的进一步信息):
使用altField
及其altFormat
option配置Datepicker以支持的格式提供日期:
<input type="hidden" id="actualDate" name="actualDate"/>
$( "selector" ).datepicker({
altField : "#actualDate"
altFormat: "yyyy-mm-dd"
});
或者,如果您希望用户看到YYYY-MM-DD
格式的日期,只需设置dateFormat
option代替:
$( "selector" ).datepicker({
dateFormat: "yyyy-mm-dd"
});
使用MySQL的STR_TO_DATE()
函数转换字符串:
INSERT INTO user_date VALUES ('', '$name', STR_TO_DATE('$date', '%m/%d/%Y'))
将从jQuery接收的字符串转换为PHP理解为日期的字符串,例如DateTime
对象:
$dt = \DateTime::createFromFormat('m/d/Y', $_POST['date']);
然后是:
获取合适的格式化字符串:
$date = $dt->format('Y-m-d');
获取UNIX时间戳:
$timestamp = $dt->getTimestamp();
然后直接传递给MySQL的FROM_UNIXTIME()
函数:
INSERT INTO user_date VALUES ('', '$name', FROM_UNIXTIME($timestamp))
手动将字符串操作为有效的文字:
$parts = explode('/', $_POST['date']);
$date = "$parts[2]-$parts[0]-$parts[1]";
您的代码容易受到SQL注入攻击。您真的应该使用prepared statements,您将变量作为参数传递到其中得到SQL的评估。如果您不知道我在说什么,或者如何解决它,请阅读Bobby Tables的故事。
另外,正如the introduction中关于mysql_*
函数的PHP手册章节所述:
从PHP 5.5.0开始,不推荐使用此扩展,不建议用于编写新代码,因为将来会删除它。相反,应使用mysqli或PDO_MySQL扩展名。在选择MySQL API时,另请参阅MySQL API Overview以获得进一步的帮助。
您似乎使用DATETIME
或TIMESTAMP
列来保存日期值;我建议您考虑使用MySQL的DATE
类型。如The DATE
, DATETIME
, and TIMESTAMP
Types中所述:
DATE
类型用于具有日期部分但没有时间部分的值。 MySQL以'YYYY-MM-DD'
格式检索并显示DATE值。支持的范围是'1000-01-01'
到'9999-12-31'
。
DATETIME
类型用于包含日期和时间部分的值。 MySQL以DATETIME
格式检索并显示'YYYY-MM-DD HH:MM:SS'
个值。支持的范围是'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'
UTC。
答案 1 :(得分: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 );
答案 2 :(得分:6)
$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());
答案 3 :(得分:1)
您必须确保jQuery输出上的日期格式为YYYY-MM-DD。我可以看到jQuery返回MM-DD-YYYY,这不是有效的MySQL date format,这就是它返回错误的原因。
要将其转换为正确的,您可以这样做:
$dateFormated = split('/', $date);
$date = $dateFormated[2].'-'.$dateFormated[0].'-'.$dateFormated[1];
然后你会得到格式化的日期,它是有效的MySQL格式,即YYYY-MM-DD,即 2012-08-25
我还建议您在将数据插入数据库时使用mysql_real_escape_string,以防止SQL injections作为快速解决方案或更好地使用PDO或MySQLi。
使用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() );
答案 4 :(得分: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());
答案 5 :(得分:0)
使用
从jquery日期选择器获取日期对象var myDate = $('element').datepicker('getDate')
对于mysql,日期需要采用正确的格式。处理任何时区问题的一个选项是使用moment.js
moment(myDate).format('YYYY-MM-DD HH:mm:ss')
答案 6 :(得分: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')";
答案 7 :(得分: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 ();
?>
答案 8 :(得分:-2)
尝试这样的事情......
echo "The time is " . date("2:50:20");
$d=strtotime("3.00pm july 28 2014");
echo "Created date is " . date("d-m-y h:i:sa",$d);
答案 9 :(得分:-2)
首先存储$date=$_POST['your date field name'];
insert into **Your_Table Name** values('$date',**other fields**);
您必须在单个cote('')
中包含日期我希望这有帮助。