2012-03-02 7 views
1

あなたには新しいトリックを学ぶ古い犬(71歳)の時間がありますように願っています。私はPHPとmysqlで約1週間の経験を持っていますが、それがどのように動作するかを面白く見ていて、いくらか進歩しました。しかし、私はこのクエリ/ロジック/構文の問題を抱えています。あなたが私の蛇行をあまりにも激しく笑っていないなら、私はいくつかの入力をしたいと思います。変更された桁数のためにSQLテーブルの時間のクエリが正しくありません

私は彼らが欲しい方法でリマインダーを出すことができないカレンダープログラムを持っています。私は面白いことを見つけ出すことに亀裂を入れるだろうと思ったが、テーブル全体の内容を変更することはできないので、プログラム全体を駄目にすることはできない。私は、「時間」テーブルのエントリを取り、それらをソートし、それらを私が望むものにフィルタリングすることによって、1つの電子メールで1日分のすべてのリマインダーを送信することを望んでいたことに成功しました。しかし、数日後、私は17時前(GMT -7)までのエントリーは大丈夫だと気付いたが、そのあとの時間がごみだった。だから、テーブルを見てみると、私は23:59 GMTが5桁で、それ以前は6桁であった時はいつでも気づいた。だから私は問題を発見した。私はIFを中間に置き、それに応じて余分な数字を追加し、strtotimeでUNIXエポックタイムに変更してからdate()を実行し、時間と分のみを使用する必要があると考えました。あなたはまだ笑っていますか?私は、PHPとmysqlについてはほとんど分かりませんが、私は学んでおり、それが私を幸せにしてくれるかもしれません。

ここに私が持っているものがあります。データベースに接続してメールを送信すると正常に動作するため、クエリを送信するだけです。この最初のものは

date_default_timezone_set('America/Denver'); 
$today = date("Ymd"); 
mysql_select_db($dbname); 
$query = sprintf("SELECT cal_name, cal_time, cal_description, cal_date FROM webcal_entry WHERE cal_date = '".$today."'"); 
$result = mysql_query($query); 
$body = ''; 
$mail = ''; 
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { 
    $mail = sprintf("Event: %s \nTime: %s \nDesc: %s \n\n", $row[0], date("H:i",((strtotime($row[1])-25200))), $row[2]); 
} 
mysql_free_result($result); 

これは本当に何かが欠けている狂気の修正です...

date_default_timezone_set('America/Denver'); 
$today = date("Ymd"); 
mysql_select_db($dbname); 
$query = sprintf("SELECT cal_name, cal_time, cal_description, cal_date FROM webcal_entry WHERE cal_date = '".$today."'"); 
$result = mysql_query($query); 
$body = ''; 
$mail = ''; 
$stt = ''; 
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { 
    $mail = sprintf("Event: %s \nTime: %s \nDesc: %s \n\n", $row[0], ($stt = { if ($row[1] < 100000, + 1234500000) ELSE ($row[1] + 1234000000) }) date("H:i",((strtotime($stt)-25200))), $row[2]) 
}; 

私はあなたの1がしたい願っています...前述の問題を除いて...作品これを取って、古い男をユーモアして...そして笑いを止める!

+0

タイプ 'DATE'と' TIME'の 'cal_date'と' cal_time'カラムはありますか? – Chris

+0

私は答えがノーだと信じています。 cal_dateは例えば20120301のような日付を表し、時間は5桁または6桁の数字で表されます。 01:30 = 13000と13:00 = 130000です。表の型を意味する場合は、両方ともint(11)です。 – defacto7

答えて

1

以下を試してください。私は理解を容易にするため、コメントを追加しました:日付と時刻の値を含む

/* I assume that the times and dates in your database are stored in UTC, 
    so set the UTC timezone first. */ 
date_default_timezone_set('UTC'); 

/* $today might now contain a value of tomorrow if it's past 17:00 in your timezone. 
    This is required though, as there could be an event at e.g. 18:00 of your time which would 
    not be returned otherwise. sprintf is not needed, as you don't format anyting here */ 
$today = date("Ymd"); 
$query = "SELECT cal_name, cal_time, cal_description, cal_date FROM webcal_entry WHERE cal_date = " . $today; 

mysql_select_db($dbname); 
$result = mysql_query($query); 

$body = ''; 
$mail = ''; 

while ($row = mysql_fetch_array($result, MYSQL_NUM)) { 
    // Store the value of the returned time in a $fixedTime 
    $fixedTime = $row[1]; 

    /* Simple approach: While the length of the time is less than 6 digits, prepend a leading 0 
     This will even work for times like 00:00:15 */ 
    while (strlen($fixedTime) < 6) 
     $fixedTime = '0' . $fixedTime; 

    // Now store the unix timestamp (still in UTC!) 
    $unixEpoch = strtotime($fixedTime); 

    // Set the timezone to your local time ... 
    date_default_timezone_set('America/Denver'); 

    // ... and $formattedTime receives the formatted time value in your timezone 
    $formattedTime = date("H:i", $unixEpoch); 

    // Now create the mail content 
$mail .= sprintf("Event: %s \nTime: %s \nDesc: %s \n\n", $row[0], $formattedTime, $row[2]); 
} 

mysql_free_result($result); 

データベースのカラムはいえDATETIMEまたはDATETIMEとして宣言する必要があります。
これは、MySQLがタイムゾーンの変換と日付/時刻の両方のフォーマットを扱うことができるため、ここでの作業がより簡単になります。

+0

ハ...夢のように動作します!どうもありがとうございました。時間は私がそれらを必要とする方法を設定しますが、最大の助けは、私はPHP/SQLで動作する方法のいくつかの指摘を拾ったということです。今、私はこのスクリプトでもう一つ大きな飛躍を遂げましたが、私はしばらく自分で作業し、あなたが教えてくれたいくつかのプリンシパルを適用します。私が壁に当たったら、私は戻ってきますが、私はそれを私のベストショットにしたいと思います。 *自己に - >今、どのように投票するのですか? * – defacto7

+0

@ defacto7:私は助けることができてうれしいです。あなたはまだ獲得された評判ポイントが15ではないので、+投票をまだ与えることはできません(アップフォース)。しかし、あなたが望むなら答えを受け入れることができます:-)。 [回答の受付方法](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を参照してください。 – Chris

関連する問題