2011-02-15 199 views
0

嘿,大家好。我試圖用三十分鐘的時間間隔打印一份時間表,並想要查詢一個數據庫以獲取當時發生的任何事情。如果我手動輸入時間(小時,分鐘,上午/下午(月,年,日工作))我得到事件。只是當我讓查詢從循環中抽出時間,這不起作用。有任何想法嗎?循環中的SQL查詢循環中

$day = date('d'); 
$year = date('Y'); 
$month = date('m'); 
$start = mktime(0,0,0); 


$thing_query="SELECT thing FROM things WHERE day='$day' AND month='$month' AND year='$year' AND hour='$hour' AND minute='$minute' AND ampm='$am'"; 


$result=mysql_query($thing_query); 

for($min = 0; $min < 24 * 60 * 60; $min += 30 * 60) 
{ 
    $hour=date("h", $start + $min); 
    $minute=date("i", $start + $min); 
    $am=date("A", $start + $min); 

    while ($row=mysql_fetch_array($result)) { 
     $thing = $row[0]; 
} 

    printf("<tr><td>%s</td><td>$thing</td></tr>", 
      date("g:i a", $start + $min)); 


} 
+0

任何錯誤?查詢是否失敗? – 2011-02-15 17:42:30

+0

爲什麼不在數據庫中查詢某一天發生的所有事情,通過每隔30分鐘的時間間隔進行一次迭代,以及當時是否有事件顯示它。這將消除不斷髮送每個間隔的查詢。 – 2011-02-15 17:44:43

+0

順便說一句:永遠不要把變量放在printf字符串中。該變量可能包含'%'字符,並且printf可能會失敗。 – 2011-02-15 18:02:21

回答

1

我想象這是因爲在查詢數據庫之前,您沒有設置小時分鐘和ampm。

你可能需要在每個循環中用新的小時,分​​鍾等等循環查詢數據庫,但是可能有更高效的方法來做到這一點......即打一天數據庫的數據,然後使用PHP來迭代信息。 1分貝通話insted的24 * 60 * 60

下面的代碼是未經測試,所以請叫我上去就可以了,如果它不完全是工作,但它應該給你一個想法:

$day = date('d'); 
$year = date('Y'); 
$month = date('m'); 
$start = mktime(0,0,0); 



$thing_query="SELECT thing FROM things WHERE day='$day' AND month='$month' AND year='$year'; 


$result=mysql_query($thing_query); 


    while ($row=mysql_fetch_array($result)) { 
     // Loop through your hours mins etc and output desired values 
} 



} 

所有您需要的數據存儲在mysql_fetch_array($result)中,然後您可以循環查看所需的數據。你不想超過必要的數據庫。

從我能看到你有PHP能夠做到這一點 - 我認爲它是一個結構的事情,你正在努力。

+0

查詢返回undefined $的東西,因爲$ hour $ minute和$ am是空白的。我不認爲我有足夠的PHP技能來知道如何存儲數據,進程,並用for循環的正確時間進行回顯? – user618273 2011-02-15 17:47:51

+0

我已經通過上面的回答更新了大致說明了我在說什麼。 – diagonalbatman 2011-02-15 18:07:36

1

您的循環結構是錯誤的 - 您正在使用圍繞父for循環的第一次運行中的整個查詢結果集。而您的內部while循環只是簡單地將$thing設置爲一個字段的值,所以$ thing最終成爲查詢返回的LAST值。

評論後續。做你想做會是怎樣的一種低效的方法:

$day = ... 
$year = ... 
$month = ... 
$start = ... 

for ($min = 0; ....) { 
    $hour = ... 
    $min = ... 
    $am = ... 

    $thing_query = "SELECT ...." 
    $result = mysql_query($thing_query) or die(mysql_error()); 
    while($row = mysql_fetch_array($result)) { 
     printf(.... $row[0] ...); 
    } 
} 

但這將運行你檢查每一個時間點的查詢。爲什麼不將事件的日期/時間存儲在單個日期/時間字段中? YOu可以減少您的查詢到

SELECT ... WHERE timestampfield BETWEEN startdatetime AND enddatetime 

然後使用PHP中的結果來建立你的事件。一個「較大」的查詢比一小串「小」查詢更有效率。

1

字符串中的變量引用僅在賦值時有效;他們不繼續,如果你改變這些變量更新,所以當你

$thing_query="SELECT thing FROM things WHERE day='$day' AND month='$month' AND year='$year' AND hour='$hour' AND minute='$minute' AND ampm='$am'"; 

它equivilent到

$thing_query="SELECT thing FROM things WHERE day='15' AND month='2' AND year='2011' AND hour='' AND minute='' AND ampm=''"; 

因爲$小時,$分鐘,我還沒有設置$,和因此查詢不返回任何內容。

即使他們更新字符串也不會更新數據庫查詢;你需要在新字符串上調用mysql_query()來獲取這些數據。

如果您將$ thing_query =和$ res =行移動到while循環之前,它應該可以工作,但它只會返回每個時隙中的最後一個事件,因爲每次通過時都會覆蓋$ thing循環。它還會繼續在每個時隙中列出一個事件,直到它到達一個新事件,因爲您沒有清理$事情。

正如Andy所說,目前這不是一種非常有效的方法來做你想做的事情,但由於你大概剛剛開始,我猜它對你來說更重要,因爲它現在可以工作而不是高效,所以希望這有助於現在。

1

你很糟糕地混淆了你的陳述的順序。這裏是正確的方式,以及一些額外的意見:

$day = date('d'); 
$year = date('Y'); 
$month = date('m'); 
$start = mktime(0,0,0); 



for($min = 0; $min < 24 * 60 * 60; $min += 30 * 60) 
{ 
    $hour=date("h", $start + $min); 
    $minute=date("i", $start + $min); 
    $am=date("A", $start + $min); 

    // you must set the string after $hour/$minute/$date have the right value 
    $thing_query="SELECT thing FROM things WHERE day='$day' AND month='$month' AND year='$year' AND hour='$hour' AND minute='$minute' AND ampm='$am'"; 

    // query the database with the string 
    $result=mysql_query($thing_query); 

    // put things in an array 
    $things = array(); 
    while ($row=mysql_fetch_array($result)) { 
     $things[] = $row[0]; 
    } 

    // join the array so I have a comma separated list of things 
    $listOfThings = implode(", ", $things); 

    // ALWAYS use htmlspecialchars when sending data from the database to the browser!!!! 
    echo "<tr><td>" . date("g:i a", $start + $min) . "</td><td>" . htmlspecialchars($listOfThings) . "</td></tr>"; 


}