我正在尝试构建一个动态数据库驱动的日历应用程序。我在第一步,试图设置日历。与其手动全部输入,我想我应该采取一个快捷方式并创建一个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;
?>发布于 2016-07-28 22:55:23
您的代码需要很长时间,因为您只需要执行一个查询就可以执行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时间戳转换为日期字符串。现在解决方案已经过时:这种方法有一个更大的问题。存储日期是对DB空间和资源的浪费,因为日期的计算速度比从数据库中检索日期要快得多。您可以修改上面的代码来创建一个函数,该函数接受$startDate、$endDate,并返回一个数组,其中包含所有要打印到HTML中的日历条目。
发布于 2016-07-28 22:50:55
您的代码非常复杂,而且很长。只有很少的音符需要改进。可以在数组中定义月份和天数的名称,然后通过数组索引访问名称。数组定义类似的
$monthNames = array(1 => 'January', 'February',..., 'December');
$dayNames = array(1 => 'Monday', 'Tuesday',...,'Sunday');此外,使用PHP函数日期也很好,您可以通过这个函数了解星期的哪一天、具体月份的天数以及许多其他有用的信息。其他有用的功能是mktime。你可以找出一周中的某一天,例如这样
$dayOfTheWeek = date('N', mktime(0, 0, 0, $month, $day, $year));月中的天数,例如这样
$daysInSelectedMonth = date('t', mktime(0, 0, 0, $month, 1, $year));其他东西是用来自学的:)
发布于 2016-07-28 23:12:40
如果您只想知道一周中哪一天对应于特定日期,则很可能不需要在数据库中为一年中的每一天添加条目。
PHP和MySQL都有将日期和时间表示为变量的方法,以及允许您使用它们操作的函数。
示例:
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 EnglishMySQL:
select dayofweek(mydate);https://stackoverflow.com/questions/38647804
复制相似问题