2012-12-04 39 views
0

我有一個非常粗略的腳本,用於填充我的數據庫表中的每一個團隊參加不同事件的單調任務。但是如果我不必每次都回去糾正數據庫中的年份,情況就會好很多。MySQL年(4)和PHP日期時間不好玩

我有一個獲得查詢的年度事件表,這反過來又允許腳本獲取該事件的團隊列表。

$year = date('Y'); 

對於每個隊事件年結合下面的查詢火災:年使用以下設置

INSERT INTO attendance (`team`,`event`,`year`) VALUES ('$team','$event','$year'); 

一切都看起來不錯(我的眼睛),但同比保持恢復爲0000即使腳本在調試時打印2012

我的代碼如下:

// from shared parent script 

$year = (date('m') < 9) ? date('Y') : date('Y')+1; 

// attendance.php - file with code in question 

<?php 
header("Refresh: 43200;"); // refresh every 12 hours 
ob_start(); 

echo "<p>Filling event rosters for the {$year} season.</p>"; ob_flush(); flush(); 

function getTeamList($event) { 
    echo "<h3>Event '{$event}':</h3>"; ob_flush(); flush(); 

    echo "Removing old entries... "; ob_flush(); flush(); 
    mysql_query("DELETE FROM attendance WHERE event='$event' AND year='$year'"); 

    echo "Loading list from FIRST TIMS... "; ob_flush(); flush(); 
    $page = 
file_get_contents("https://my.usfirst.org/myarea/index.lasso?page=teamlist&event_type=FRC&event=$event&year=$year&sort_teams=number"); 
    $page = explode('<td nowrap>',$page); 
    $page = implode('<td>',array_slice($page,'1')); 
    if ($event == 'CMP') { 
     $page2 = 
file_get_contents("https://my.usfirst.org/myarea/index.lasso?page=teamlist&event_type=FRC&event=$event&year=$year&sort_teams=number&skip_teams=250"); 
     $page2 = explode('<td nowrap>',$page2); 
     $page2 = implode('<td>',array_slice($page2,'1')); 
     $page = '<html><body><center><table> 
<tr> 
<td>'.$page.' <tr bgcolor="#FFFFFF"> 
     <td>'.$page2; 
    } 
    $timsList = new DOMDocument; 
    $timsList->loadHTML($page); 
    $listings = $timsList->getElementsByTagName('a'); 

    echo "Adding all current entries... "; ob_flush(); flush(); 
    foreach ($listings as $listing) { 
     if (is_numeric($listing->nodeValue)) { 
      $team = $listing->nodeValue; 
      $query = "INSERT INTO attendance (`team`,`event`,`year`) VALUES ('$team','$event','$year')"; // Build SQL query for events 
      mysql_query($query); 
     } 
    } 
    echo "Done."; ob_flush(); flush(); 
    if ($event == 'CMP') { 
     $div = array('archimedes','curie','galileo','newton'); 
     foreach ($div as $division) { 
      mysql_query("DELETE FROM attendance WHERE event='$division' AND year='$year'"); 
      $page = 
file_get_contents("https://my.usfirst.org/myarea/index.lasso?page=teamlist&event_type=FRC&event=$event&division=$division&year=$year&sort=teamnum"); 
      $page = explode('<td nowrap>',$page); 
      $page = implode('<td>',array_slice($page,'1')); 
      $timsList = new DOMDocument; 
      @$timsList->loadHTML($page); 
      $listings = $timsList->getElementsByTagName('a'); 
      foreach ($listings as $listing) { 
       if (is_numeric($listing->nodeValue)) { 
        $team = $listing->nodeValue; 
        $query = "INSERT INTO attendance (`team`,`event`,`year`) VALUES ('$team','$division','$year')"; // Build SQL Query 
for Divisions 
        mysql_query($query); 
       } 
      } 
     } 
    } 
} 


if (isset($_GET["event"])) { 
    $event = strtoupper(mysql_real_escape_string($_GET["event"])); 
    mysql_select_db("frc"); 
    getTeamList($event); 
} else { 
    mysql_select_db("frc_{$year}scouting"); 
    $events = mysql_query("SELECT id FROM event WHERE event.start >= NOW()") or die(mysql_error()); 
    mysql_select_db("frc"); 
    while ($row = mysql_fetch_array($events)) { 
     $event = $row['id']; 
     getTeamList($event); 
    } 
} 
?> 
+0

數據庫表中的字段類型是什麼? –

+0

我應該注意,今年並不總是今年......我只是在問題中展示它,因爲錯誤以任何方式發生。 – qsheets

+0

@DipeshParmar'團隊'是'INT(11)','event'是'VARCHAR(16)','year'是'YEAR(4)' – qsheets

回答

1

MYSQL中的year字段的數據類型是什麼?如果將其設置爲日期時間字段,那麼您的日期無效,並且該年將返回0000。 (無效的日期在mysql datetime中存儲爲0000-00-00 00:00:00)

您可以改變數據庫字段以要求INT使其工作。另一種選擇是以年份發送。'01-01 01:01:01'將它作爲日期的第一個存儲。但考慮到這是一個虛假的年份,爲什麼要存儲額外的數據?只需使用INT。

更新:

您顯示的代碼是正確的。它沒有錯。代碼中一定會有一些事情沒有顯示出來,或者你認爲你把所有的東西都設置爲像你說的那樣,但沒有。

$mysqli = new mysqli(...); 

$team = 10; 
$event = 'Testing'; 
$year = date('Y'); 
$query = "INSERT INTO attendance (`team`,`event`,`year`) VALUES ('$team','$event','$year')"; 

print $query; 
$mysqli->query($query); 

就像在MySQL中使用確切的日期類型那樣工作。

更新2:

您正在使用$一年的功能,但沒有包括全球一年$;

function getTeamList($event) { 
    global $year; 
    //.... 
} 
+0

字段類型是[YEAR(4)](http://dev.mysql.com /doc/refman/5.0/en/year.html)。我真的很想知道如何做到這一點,而不是完全避免使用INT的問題,因爲YEAR可以證明是數據庫中的一個節省空間的工具(表中有將近40,000個條目)。 – qsheets

+0

謝謝。爲什麼總是最簡單的事情將我們推上了牆? :) – qsheets

+0

因爲你期望你正在做他們正確的自動:) –

0

您可以嘗試::

INSERT INTO 
attendance (`team`,`event`,`year`) 
VALUES ('$team','$event',YEAR(CURRENT_DATE)) 
0

如果字段的類型是整數,恰克到:

INSERT INTO attendance (`team`,`event`,`year`) VALUES ('$team','$event',$year); 
+1

Mysql不敏感類型https://gist.github.com/4202065 – AD7six

1

年只接受1901至2155年

MySQL year type只接受特定範圍內年。如果你插入一個無效值這將返回零:

mysql> create database so; 
Query OK, 1 row affected (0.00 sec) 

mysql> use so; 
Database changed 
mysql> create table example (y year(4)); 
Query OK, 0 rows affected (0.09 sec) 

mysql> insert into example values (1234); 
Query OK, 1 row affected, 1 warning (0.08 sec) 

mysql> select * from example; 
+------+ 
| y | 
+------+ 
| 0000 | 
+------+ 
1 row in set (0.00 sec) 

mysql> insert into example values (2012); 
Query OK, 1 row affected (0.07 sec) 

mysql> select * from example; 
+------+ 
| y | 
+------+ 
| 0000 | 
| 2012 | 
+------+ 
3 rows in set (0.00 sec) 

mysql> 

鑑於這是MySQL的是如何起作用 - 這是很有可能被插入的值不是一個數字,或者不在此範圍內的數字。

+0

我知道數據類型的侷限性。我試圖避免的是手動輸入日期,就像你在這裏所做的一樣。 – qsheets

+0

我在說的是我知道我可以每次都手動輸入,比如說「2014」,這比我現在的要好,但是我想要的是PHP的日期('Y')的結果。 '(其中*應該*返回一個4位數的年份)代替手動輸入的年份工作。 – qsheets

+1

我在說的是使用數字和使用'date('Y')'的結果沒有什麼區別 - 也就是說你沒有在mysql中插入date('Y')的結果,因爲_is_是有效的價值 - 你的代碼在哪裏)? – AD7six