可以';t添加开关例程时不会出错


Can't add a switch routine without error

这对我来说是一个学习项目,我已经在这个网站上做了一些查询,这教会了我很多。但我在"切换"程序上遇到了问题,如果能提供任何指导,我将不胜感激。这个切换程序是一个建议,但我会出错。我已经做了很多研究,但我仍然不知道如何完成这个过程。我也不明白"date_create("@$qucls")"中的"@"是什么意思。它是否存在似乎并不重要,但这是一个建议和常规。

查询一直到得到我想要生成的内容,但一旦我尝试更新时间字符串,它就会陷入困境。错误是,"date_format()要求参数1为DateTime,布尔值以…给定"。据我所知,$qucls应该是一个数字字符串,而不是真/假。在这些表字段中肯定有一个数字字符串,其形式为int。

只是为了重复我的其他帖子,我无法在不经过深思熟虑的情况下更改数据库。我需要从中获取信息,以便从日历程序中制作电子邮件提醒。这些表格中包含了不同寻常的日期/时间字符串形式和长度,因此这个脚本的内容比这里显示的要多得多。在我的过程中,这就是我要弄清楚的地方,对于一个70多岁的老人来说,这还不错。在我弄清楚获得正确结果的过程后,我会去清理它。

以下是脚本的适用部分:

date_default_timezone_set('UTC');
$today = date("Ymd");
mysql_select_db($dbname);
$querydel = "SELECT cal_entry_id, cal_type FROM webcal_entry_log WHERE cal_type = 'D'";
$delqu = mysql_query($querydel);
$i = 0;
while ($row = mysql_fetch_array($delqu, MYSQL_NUM)) {
    $qudel[$i] = $row[0];
}
$query1 = "SELECT cal_id, cal_name, cal_date, cal_time, cal_type, cal_description FROM webcal_entry WHERE cal_type = 'M' AND cal_date != ' . $today . ' AND cal_id != " . $qudel[$i];
$wequ1 = mysql_query($query1);
while ($row = mysql_fetch_array($wequ1, MYSQL_NUM)) {
    $quid1[$i] = $row[0];
    $quname[$i] = $row[1];
    $qutime[$i] = $row[3];
    $qudesc[$i] = $row[5];
    $query2 = "SELECT cal_id, cal_type FROM webcal_entry_repeats WHERE cal_id = " . $quid1[$i];
    $wer1 = mysql_query($query2);
    if ($row = mysql_fetch_array($wer1, MYSQL_NUM)) {        
        $qutype[$i] = $row[1];
    }
    $query3 = "SELECT cal_id, cal_last_sent FROM webcal_reminders WHERE cal_id = " . $quid1[$i];
    $wer2 = mysql_query($query3);
    if ($row = mysql_fetch_array($wer2, MYSQL_NUM)) {
        $qucls[$i++] = $row[1];
    }
}
for ($j = 0; $j < $i; $j++) {
}
// date calculations - switch routine
$dateObj = date_create("@$qucls");
switch($qutype) {
  case "daily":
    date_add($dateObj, date_interval_create_from_date_string("1 day"));
    break;
  case "weekly":
    date_add($dateObj, date_interval_create_from_date_string("1 week"));
    break;
  case "monthly":
    date_add($dateObj, date_interval_create_from_date_string("1 month"));
    break;
  case "yearly":
    date_add($dateObj, date_interval_create_from_date_string("1 year"));
    break;
}
$qucls = date_format($dateObj, "U");

谢谢!

编辑:$qucls在查询循环结束后以int()类型输出一个Unix时间戳数组。一旦它编码-$dateObj=date_create("@$qucls"),$dateObj就会返回false。我似乎找不到窍门。

在查看代码时,$qucls似乎是一个数组(基于行$qucls[$i++] = $row[1];)。date_create不接受数组作为第一个参数。

@符号将向date_create指示您正在传递unix时间戳。

我建议检查if ($dateObj === false),看看date_create是否返回了正确的值。

$qutype似乎也是一个数组。不太确定switch对传递数组有何反应。。。

在尝试调用date_create之前。。。您应该使用print_r($qutype)print_r($qucls)来确保您知道要处理的数据类型。

那么,你想做这样的事情吗:

foreach($qutype as $key => $type){
    $time    = $qucls[$key];
    $dateObj = date_create("@$time");
    switch($type) {
      case "daily":
        date_add($dateObj, date_interval_create_from_date_string("1 day"));
        break;
      case "weekly":
        date_add($dateObj, date_interval_create_from_date_string("1 week"));
        break;
      case "monthly":
        date_add($dateObj, date_interval_create_from_date_string("1 month"));
        break;
      case "yearly":
        date_add($dateObj, date_interval_create_from_date_string("1 year"));
        break;
    }
    $qucls[$key] = date_format($dateObj, "U");
}

您可以在循环前后进行print_r,以确保所有$qucls值都在更新。。。