0

私は2つのフィールドを持つテーブルを持っています

competition {stateTime, endTime}

そのテーブルに挿入するとき、挿入したい値がそのテーブルのどの行のピリオドにもないことを確認したいのですが、この関数を入力します (PDO データベース)

function isCompetitionInAnotherCompetition($startTime, $endTime) {
        $query = "SELECT * FROM competition";
        $sth = $this->db->prepare($query);
        $sth->execute(array());
        while ($row = $sth->fetch()) {
            if ($startTime >= $row['startTime'] && $startTime <= $row['endTime'])
                return true;
            if ($endTime >= $row['startTime'] && $endTime <= $row['endTime'])
                return true;
        }
        return false;
    }

しかし、うまくいきません。データベース内のすべての日付はyyyy-mm-dd、例です2012-01-15

4

1 に答える 1

1

存在をテストし、レコードを返す bool を返す関数を作成するのではなく、このようにして、何も返されなかったかどうかを後でテストできますが、必要に応じてそれらを使用できます。Alvin Wong が示唆しているようBETWEENに、SQL で使用できるので、このようなものが得られます。

function getCompetitionsBetween($startTime, $endTime) {     

    $startTime = date("Y-m-d", $startTime);
    $endTome = date("Y-m-d", $startTime);

    $query = "SELECT * FROM competition 
               WHERE start_time BETWEEN ? AND ? 
               OR end_time BETWEEN ? AND ?";

    $sth = $this->db->prepare( $query );

    $sth->execute( array($startTime, $endTime, $startTime, $endTime) );

    return $sth->fetchAll();
}

その後/別の場所

$competitions = getCompetitionsBetween($startTime, $endTime);

if (empty(competitions)) {
    $this->save();
} else {
    echo ('sorry the following competitions conflict with these dates');
    foreach($competitions as $k => $v) {
        echo ($k . ':' . $v);
    }
}
于 2012-07-01T15:15:35.153 に答える