使用日期比较从mysql DB检索数据

时间:2017-06-22 12:48:55

标签: php mysql

我想在订阅结束前一个月向我的订阅者发送提醒,我的MYSQL数据库中有有效性和提醒(类型为VARCHAR)

存储在这些列中的

日期使用php日期函数

保存
$validity = date('d/m/Y',strtotime("6 months"));
$reminder = date('d/m/Y',strtotime("5 months"));

现在我想在当前日期等于提醒日期时发送邮件 我有一个测试条目,提醒值为22/06/2017,$ date变量回显相同的值。

$date = date('d/m/Y');

$q = 'SELECT * FROM subscriptions WHERE reminder = "$date"';
$r = mysql_query($q);

if(!$r){
echo 'query err';
}

$a = mysql_num_rows($r);
echo 'No of rows returned '.$a;

*mailing script after this line*

此脚本输出行返回0

有人可以告诉我应该如何处理这个问题

6 个答案:

答案 0 :(得分:1)

首先,我建议您的日期格式是数据库更改和类型更改日期时间。

此格式随后为您插入提醒日期

$reminderdate = date('Y-m-d');

然后在从数据库中获取数据时与currentdate进行比较:

$date=date('Y-m-d');
if($r['reminder']==$date)
{
    echo 'Mail sent here';
}
else
{
   echo 'date not match';
}

答案 1 :(得分:0)

您的脚本存在SQL注入攻击风险, see this

问题在于:

'SELECT * FROM subscriptions WHERE reminder = "$date"';

将其更改为:

"SELECT * FROM subscriptions WHERE reminder = '".$date."'";

要比较日期,您必须将其换成单引号'

答案 2 :(得分:0)

一些建议:

答案 3 :(得分:0)

首先,您不应将日期存储在varachar中。

现在首先要比较varchar中的日期,你必须将字符串(varchar)转换为日期。

为此你可以使用mysql的功能: str_to_date

您可以获取如何转换它的示例,然后将其进行比较以获得结果。

答案 4 :(得分:0)

$q = "SELECT * FROM subscriptions WHERE reminder = '{$date}'";

答案 5 :(得分:-1)

我知道你已经选择了答案并忽略了评论,因为你只想完成这项工作并继续前进,无论你怎么做。我将把这个答案作为一个社区WIKI。

以下是您需要注意的事项:

  1. 您使用的API很久以前已经折旧,而是使用mysqli甚至更好的PDO和预先准备好的语句。

  2. 此外,我确定在您的网站上使用下标时,您应该有一个列,用于存储订阅的持续时间和实际过期日期以及用于标识过期订阅的标志。

  3. Mysql确实提供了自己的日期时间函数,您可以使用这些函数并在这些列上使用日期类型。

  4. 使用仍然有效并且维护的mysqli_*pdo的API,它们都支持预准备语句。

    $host    = '127.0.0.1';
    $db      = 'DBNAME';
    $user    = 'root';
    $pass    = '';
    $charset = 'utf8';
    
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $opt = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false
    );
    
    $dbh = new PDO($dsn, $user, $pass, $opt);
    
    $stmt = $dbh->query("SELECT * FROM subscriptions WHERE subscriptionsExpireColumn  = DATE_ADD(CURDATE(), INTERVAL 1 MONTH)");
    if (!$stmt) {
    
        echo "\nPDO::errorInfo():\n";
        print_r($dbh->errorInfo());
    } else {
    
        $results = $stmt->fetchall();
    
        if (count($results) > 0) {
    
            foreach ($results as $row) {
    
                //DO WHAT EVER YOU WANT TO DO WITH THE RESULTS
            }
        } else {
    
            echo "no records found";
        }
    
    }
    ?>