【问题标题】:inserting dates into mysql database将日期插入mysql数据库
【发布时间】:2013-02-12 06:42:15
【问题描述】:

我有一个简单的表单,它有一个隐藏字段,其值为:

<?php echo date('Y-m-d'); ?>

当我通过我的 php 处理脚本提交表单时,除了日期之外,表单上的所有内容都会进入数据库。

这是我的 sql:

$sql = "INSERT INTO wp_reminders (dateofentry, ipaddress, type) VALUES ('$_POST[dateofentry]','$_POST[ipaddress]' ,'$_POST[type]')";

当我在处理页面上回显日期时,它显示正常。

我在我的数据库中设置了以下列:

 dateofentry date NOT NULL

如果以上有什么问题,有什么想法吗?

【问题讨论】:

  • 添加 $_POST 的 var_dump
  • 您的代码容易受到SQL injection 的攻击。在进行查询之前,您需要使用数据库库的适当方法来转义数据。
  • 您发布的代码似乎没有任何问题。我建议您回显$sql 以协助调试问题。这将缩小问题所在,即是否是 SQL 语句中提供的日期文字有问题,或者 SQL 语句是否正常并且问题出在 MySQL 服务器端。
  • 我刚刚做了一个 var 转储,发现以下 ["dateofentry"]=> string(10) "02/11/2013"。不确定发生了什么,因为我已将日期设置为 Y-m-d
  • 在开始手动使用 SQL 查询之前,请先尝试popular PHP framework。如果您遵循最佳实践,您在此处所犯的错误将更难解决。

标签: php mysql


【解决方案1】:

任何插入 MySQL 的日期都必须符合one of the formats that MySQL can parse,否则必须进行转换。 ISO 8601 是首选格式,通常是 YYYY-MM-DD HH:MM:SS

如果您使用 PDO:

$sql = "INSERT INTO wp_reminders (dateofentry, ipaddress, type) VALUES (:dateofentry, :ipaddress, :type)";
$statement = $pdo->prepare($sql);
$statement->bindParam(":dateofentry", strtotime(date("Y-m-d H:i:s")), PDO::PARAM_STR);
$statement->bindParam(":ipaddress", $_POST['ipaddress'], PDO::PARAM_STR);
$statement->bindParam(":type", $_POST['type']), PDO::PARAM_STR);
$statement->execute();

除非您预计表单需要很长时间来处理,否则在创建查询时提供日期可能是有意义的。如果没有,您可以随时将 strtotime 调用放入您的表单中。

【讨论】:

    【解决方案2】:

    您必须使用此语法来创建您的 sql 查询:

    $sql = "INSERT INTO wp_reminders (dateofentry, ipaddress, type) VALUES ('".addslashes($_POST['dateofentry'])."','".addslashes($_POST['ipaddress'])."' ,'".addslashes($_POST['type'])."')";

    在您的示例中,您没有用双引号将索引键括起来......

    而且你真的不应该把一个 php 变量放入一个字符串中,最好将它连接起来。

    【讨论】:

    • 请不要发布存在巨大安全漏洞的答案。您应该从不$_POST 数据直接插入到查询字符串中。连接与插值甚至不是问题,它根本不是“更好”。它们是一样的。
    • 有人已经谈到了安全性,在我的解释中不增加复杂性的情况下更容易解释错误。此外,我的回答是关于他的问题,帮助解决问题,而不是教他如何安全。没有句号。
    • 以上代码纯属测试用,只是想知道有没有人能看出什么问题,不要抨击我的编码能力。
    • “连接与插值甚至不是问题” 所以你说如果 php 会解析字符串以替换变量的好方法最好忽略?这也许就是为什么可以使用 {$_POST[key]} 的原因......我只是在这里给出一个建议,评论我的答案告诉我它是否好用有什么意义,你宁愿帮助他并给出你的答案.
    • 您的答案可以解决问题,而不会包含危险的错误代码。我的意思是失去你的工作并摧毁你的职业生涯很糟糕。逃避它或不要发布它。这要求太多了吗?
    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多