【问题标题】:Is there something wrong with my while loops? My code syntax? Is it just too much? [closed]我的 while 循环有问题吗?我的代码语法?是不是太多了? [关闭]
【发布时间】:2016-07-28 22:33:26
【问题描述】:

我正在尝试构建一个动态数据库驱动的日历应用程序。我在第 1 步,尝试设置日历。与其手动输入所有内容,我想我会走捷径并制作一个 PHP 脚本将其全部添加到我的数据库中。

问题是,我的脚本涉及很多 while 循环。加载需要很长时间。执行脚本可能只需要一段时间,还是某处有错误?有没有更简单的方法来制作日历?

编辑:我的所有数据库配置都在这个块之前的另一个块中。这不是问题。

编辑 2:我注意到我的一些 SQL 包含保留关键字。我把它们改成了不同的词。

这是我的代码:

    <?php


       $calsql = "SELECT * FROM callender";

       $calquery = mysqli_query($db,$calsql);

       $calisfull = mysqli_num_rows($calquery);

       if ($calisfull < 1) {
        while ($all < 365) {
                $year = "2016";
                $month = 1;
                if ($month == 1){

                    $dayofmonth = 1;
                    while ($dayofmonth < 32) {
                        $d = 0;
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
                $month++;
            }
                if ($month == 2){

                    $dayofmonth = 1;
                    while ($dayofmonth < 30) {
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
                $month++;
            }
                if ($month == 3){

                    $dayofmonth = 1;
                    while ($dayofmonth < 32) {
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
                $month++;
            }
                if ($month == 4){

                    $dayofmonth = 1;
                    while ($dayofmonth < 31) {
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
                $month++;
            }
                if ($month == 5){

                    $dayofmonth = 1;
                    while ($dayofmonth < 31) {
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
                $month++;
            }
                if ($month == 6){

                    $dayofmonth = 1;
                    while ($dayofmonth < 31) {
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
                $month++;
            }
                if ($month == 7){

                    $dayofmonth = 1;
                    while ($dayofmonth < 32) {
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
                $month++;
            }
                if ($month == 8){

                    $dayofmonth = 1;
                    while ($dayofmonth < 32) {
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
                $month++;
            }
                if ($month == 9){

                    $dayofmonth = 1;
                    while ($dayofmonth < 31) {
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
                $month++;
            }
                if ($month == 10){

                    $dayofmonth = 1;
                    while ($dayofmonth < 32) {
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
            }
                if ($month == 11){

                    $dayofmonth = 1;
                    while ($dayofmonth < 31) {
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
                $month++;
            }
                if ($month == 12){

                    $dayofmonth = 1;
                    while ($dayofmonth < 32) {
                        while ($d < 7) {
                            if ($d == 0){
                                $day = "Friday";
                            }

                            else if ($d == 1){
                                $day = "Saturday";
                            }

                            else if ($d == 2){
                                $day = "Sunday";
                            }

                            else if ($d == 3){
                                $day = "Monday";
                            }

                            else if ($d == 4){
                                $day = "Tuesday";
                            }

                            else if ($d == 5){
                                $day = "Wednesday";
                            }

                            else if ($d == 6){
                                $day = "Thursday";
                            }

                        $fillsql = "INSERT INTO callender (month, date, year, day) VALUES ('$month', '$dayofmonth', '$year', '$day')";
                        $fquery = mysqli_query($db,$fillsql);
                        $perfectly = "Perfectly";
                        $dayofmonth++;
                        $all++;
                    }

                    $d = 0;
                }
                $month++;
            }
        }

       }

       echo "Code worked " . $perfectly;

       ?>

【问题讨论】:

  • 不要将日期组件(存储 y-m-d)分开,这将使 db 功能更容易。我不会像这样预先填写数据库,它不是电子表格,除非你需要,否则不要存储日期。
  • $allwhile ($all &lt; 365) @是什么
  • 您应该始终使用准备好的语句。它将允许您的数据库仅使用一个查询,并在循环时交换值。
  • 另外,考虑制作一个函数。你重复的代码太多了。
  • 您的查询中的date 是什么?我们不知道它来自哪里

标签: php mysql sql while-loop calendar


【解决方案1】:

您的代码需要很长时间,因为您正在执行 365 查询,而您可能只执行一个查询。您也不需要为一周中的每一天对每个月的值进行硬编码。下面我将你的大循环折叠成两行代码:

$start = strtotime('2016-01-01');
$end = strtotime('2016-12-31');
$current = $start;
$rows =[];

while ($current <=$end){
    //insert eg: ('1', '31', '2016', 'Sunday') for Jan 31 2016.
    $rows[] = strftime("('%m', '%d', '%Y', '%A')",$current);
    $current = strtotime('+1 day',$current); //to next day
}
//build one combined query
$sql='INSERT into callender (month, date, year, day) VALUES '.implode(',',$rows);
$fquery = mysqli_query($db,$sql);

if(!$fquery) die('DB error: '.mysqli_error($db));

echo 'Success: '.mysqli_num_rows($fquery).' rows inserted';

查看 PHP 最棒的两个函数:

  • strtotime 将人类可读的字符串转换为 UNIX 时间戳
  • strftime 将 UNIX 时间戳转换为您选择的格式的日期字符串

现在解决方案已经解决了:这种方法存在更大的问题。存储日期是对数据库空间和资源的浪费,因为它们的计算速度比从数据库中检索它们的速度要快。您可以修改上面的代码来创建一个函数,该函数接受 $startDate$endDate 并返回一个包含所有日历条目的数组以打印到您的 HTML 中。

【讨论】:

    【解决方案2】:

    您的代码非常复杂且冗长。只有很少的改进说明。您可以在数组中定义月份和日期的名称,然后通过数组索引访问名称。 数组定义如下

    $monthNames = array(1 => 'January', 'February',..., 'December');
    
    $dayNames = array(1 => 'Monday', 'Tuesday',...,'Sunday');
    

    另外还可以使用PHP函数date,通过这个函数你可以知道星期几,具体月份有多少天等等有用的信息。 其他有用的功能是mktime。 您可以找出星期几,例如这边

    $dayOfTheWeek = date('N', mktime(0, 0, 0, $month, $day, $year));
    

    一个月的天数,例如这边

    $daysInSelectedMonth = date('t', mktime(0, 0, 0, $month, 1, $year));
    

    其他东西自学:-)

    【讨论】:

      【解决方案3】:

      如果您只想知道一周中的哪一天对应于特定日期,您很可能不需要在数据库中为一年中的每一天添加一个条目。

      PHPMySQL 都具有将日期和时间表示为变量的方法,以及允许您对其进行操作的函数。

      例子:

      2016 年是闰年吗?

      PHP:

      <?php
      $year = 2016;
      $date = new DateTime();
      $date->setDate($year, 3, 1);
      $date->sub(new DateInterval('P1D'));
      if($date->format("d") == "29") {
          print "$year is leap";
      } else {
          print "$year is not leap";
      }
      

      MySQL:

      > select (dayofmonth(date_sub('2016-03-01', interval 1 day)) = 29) as isleap;
      +--------+
      | isleap |
      +--------+
      |      1 |
      +--------+
      

      星期几?

      PHP:

      print $date->format("w"); // 0 = Sunday, 6 = Saturday
      print $date->format("l"); // in English
      

      MySQL:

      select dayofweek(mydate);
      

      【讨论】:

        【解决方案4】:

        将您的数据库请求简化为一个。好吧,您可能想在 php.ini 中更改您的 php 脚本执行时间,或者在脚本开始时使用 php set 命令来调整它(仅针对每个脚本的基础)

        【讨论】:

          猜你喜欢
          • 2016-04-07
          • 1970-01-01
          • 2019-11-14
          • 2023-01-24
          • 2013-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-16
          相关资源
          最近更新 更多