仅在工作日pdo查询中插入日期

时间:2018-01-05 21:13:00

标签: php mysql pdo

我已经设法在查询中休息一天,但我希望它只能回到工作日

编辑:o)

这是我的查询

$query = $db->prepare("INSERT INTO users(email, name, dob, reminder reminder1, reminder2, reminder3) VALUES (:email, :name, :dob  IF (WEEKDAY(:reminder) > 4, DATE_SUB(:reminder1, INTERVAL (WEEKDAY(:reminder2) - 4) DAY),:reminder3))");
        $query->bindParam("email", $email, PDO::PARAM_STR);
        $query->bindParam("name", $name, PDO::PARAM_STR);
        $query->bindParam("dob", $dob, PDO::PARAM_STR);
        $query->bindParam("reminder", $dob, PDO::PARAM_STR);
        $query->bindParam("reminder1", $dob, PDO::PARAM_STR);
        $query->bindParam("reminder2", $dob, PDO::PARAM_STR);
        $query->bindParam("reminder3", $dob, PDO::PARAM_STR);
        $query->execute();
        return $db->lastInsertId();
    } catch (PDOException $e) {
        exit($e->getMessage());
    }

表格给我确定数据已被添加,但没有任何内容被添加到数据库没有错误

提前致谢

1 个答案:

答案 0 :(得分:0)

我对一个非常基本的解决方案的建议是使用WEEKDAY()函数与MySQL IF()函数一起使用。

前者将为您提供发生当周的给定日期的索引(0表示星期一)。后者提供了您可能在其他编程语言中看到的三元运算符的熟悉服务。

$query = $db->prepare('
    INSERT INTO users
    VALUES (
        :email, :name, :dob,
        IF (
          WEEKDAY(:reminder0) > 4,
          DATE_SUB(:reminder1, INTERVAL (WEEKDAY(:reminder2) - 4) DAY),
          :reminder3
        )
    )
');

您必须使用唯一的命名占位符(请参阅prepare()的文档)。只需将同一日期绑定到:reminder0 ... :reminder3即可。示例执行如下:

$query->execute([
    ':email' => 'example@example.org',
    ':name' => 'Example',
    ':dob' => '1970-01-01',
    ':reminder0' => '2018-12-12',
    ':reminder1' => '2018-12-12',
    ':reminder2' => '2018-12-12',
    ':reminder3' => '2018-12-12'
]);

在这一点上,似乎更容易在包含原始预准备语句的函数中使用一些PHP代码执行:reminder的日期计算。这是你的电话。

您还应该记住,这不会考虑假期。您的用例将决定该事实是否重要。