0

毎年さまざまなイベントに参加しているチームをデータベース テーブルの 1 つに入力するという単調な作業のための非常に大まかなスクリプトがあります。しかし、毎回戻ってデータベースの年を修正する必要がなければ、ずっといいでしょう。

クエリを実行する年次イベントのテーブルがあり、スクリプトはそのイベントのチームのリストを取得できます。年は以下を使用して設定されます。

$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);
    }
}
?>
4

4 に答える 4

1

年は 1901 ~ 2155 のみを受け入れます

MySQLのyear タイプは、特定の範囲内の年のみを受け入れます。無効な値を挿入すると、ゼロが返されます。

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 がこのように動作することを考えると、挿入される値が数値ではないか、この範囲内の数値ではない可能性が非常に高くなります。

于 2012-12-04T09:19:59.300 に答える
1

MYSQL の年フィールドのデータ型は何ですか? 日時フィールドとして設定されている場合、日付は無効であり、年には 0000 が返されます。(無効な日付は 0000-00-00 00:00:00 として mysql datetime に格納されます)

データベース フィールドを変更して、機能させるために INT を要求することができます。もう 1 つのオプションは、年を $year.'-01-01 01:01:01' として送信し、日付の 1 月 1 日として保存することです。しかし、それが偽の年であることを考えると、なぜ余分なデータを保存するのでしょうか? 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:

関数で $year を使用していますが、グローバルな $year が含まれていません。

function getTeamList($event) {
    global $year;
    //....
}
于 2012-12-04T09:09:11.603 に答える
0

あなたが試すことができます ::

INSERT INTO 
attendance (`team`,`event`,`year`) 
VALUES  ('$team','$event',YEAR(CURRENT_DATE))
于 2012-12-04T09:04:14.917 に答える
0

フィールドのタイプが整数の場合は、次のように変更します。

INSERT INTO attendance (`team`,`event`,`year`) VALUES ('$team','$event',$year);
于 2012-12-04T09:04:58.980 に答える