【问题标题】:Correct way to format user DOB's when inserting with PDO使用 PDO 插入时格式化用户 DOB 的正确方法
【发布时间】:2013-08-27 22:45:41
【问题描述】:

我在使用简单的$dob 表单输入和使用 PDO 将数据库插入到数据类型为 date 的 mysql 表中时遇到了一些奇怪的问题。

输入表单(示例):

<select name="dob-month">
    <option value="1">January</option>
</select>
<select name="dob-day">
    <option value="01">1</option>
</select>
<select name="dob-year">
    <option>2013</option>
</select>

PHP(基础):

$data = $_POST; //passed through mvc

$day = trim($data['dob-day']);
$month = trim($data['dob-month']);
$year = trim($data['dob-year']);

$birthdate = date('Y-m-d', strtotime($year."-".$month."-".$day));

$stmt = $this->core->dbh->prepare("INSERT INTO userinfo (birthdate) VALUES (:birthdate)");
$stmt->bindParam(':birthdate', $birthdate, PDO::PARAM_STR);
$stmt->execute();

但是它给出了没有日期的日期?所以只有 2013-12 工作正常,但这一天总是 -01?

和日期的选择格式有关吗?

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

首先,PHP date() 命令只接受一个官方的 UNIX 时间戳来转换成指定的格式。其次,虽然您的表单有名为dob-monthdob-daydob-year 的变量,但看起来好像您正试图在PHP 处理脚本中的变量$month$day$year 中使用它们。 为什么不从一个很好的 PHP date 教程开始,解释 DATE STRINGDATE OBJECTUNIX TIMESTAMP 之间的区别>。阅读 PHP 的 strtotime() 函数和 mySQL 的 DATE_FORMAT() 函数。当你完成这些事情时,你应该得到足够的信息来返回并提交一个受过云纹教育的问题。

修改/附加信息

<select name="dob-month">
    <option value="1">January</option>
    <option value="6">June</option>
    <option value="12">December</option>
</select>
<select name="dob-day">
    <option>1</option> // Same here - stick to a single digit
    <option>15</option>
    <option>31</option>
</select>
<select name="dob-year">
    <option>2013</option>
</select>

PHP

$day = intval(trim($data['dob-day']));
$month = intval(trim($data['dob-month']));
$year = intval(trim($data['dob-year']));
$birthdate = date('Y-m-d', mktime(0,0,0,$month,$day,$year));

【讨论】:

  • 感谢您的讽刺,由于帖子通过控制器传递,我编辑了 php,不想混淆所有人然后忘记将其放回。我了解类型,甚至使用 @ 987654333@我仍然遇到问题?
  • 这不是讽刺。它仍然是一个措辞不佳的问题,只有足够的支持代码来弄清楚你的脚本发生了什么。 strtotime() 可能不够可靠,无法在这种情况下使用。您可能需要通过mktime() 走很长的路。
  • 回显$birthdate 几次,看看它是否没有因为strtotime() 转换而消失。
【解决方案2】:

第二个参数

  date()

是一个整数值(自然数),而不是破折号分隔的字符串。阅读man-page of date()

很像你想做这样的事情:

date('Y-m-d', strtotime( $year."-".$month."-".$day ));

另一方面:这个操作构造了一个日期字符串,并将其传递给 date() - 反过来又返回相同的日期字符串 ;-)

【讨论】:

  • date 中插入日期时,您应该使用'Y-m-d' 格式的时间戳还是日期字符串?
  • @Silver89 不,您将整数值作为第二个参数传递给 date()。整数值是 UNIX 时间戳。当前时间作为 UNIX 时间戳的来源是 time()。因此,date('Y-m-d', time()) 就可以了。
【解决方案3】:

使用此代码

$birthdate = $_POST['dob-year']."/".$_POST['dob-month']."/".$_POST['dob-date'];

代替这段代码

$birthdate = date('Y-m-d', strtotime($year."-".$month."-".$day));
$birthdate = date('Y-m-d', mktime(0,0,0,$month,$day,$year));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2018-07-13
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多