2011-02-15 7 views
0

안녕하세요. 나는 30 분 간격으로 일정을 출력하려고하고 있으며 그 시간에 무슨 일이 일어나고 있는지 DB에 쿼리하고 싶습니다. 수동으로 시간 (시, 분, 오전/오후 (월, 년, 일이있는 그대로)을 입력하면) 이벤트가 발생합니다. 그것은 단지 쿼리가 루프에서 시간을 끌어 오면 작동하지 않습니다. 어떤 아이디어?루프 내의 루프 내의 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

오류가 있습니까? 쿼리가 실패합니까? –

+0

하루에 일어나는 모든 일에 대해 데이터베이스를 쿼리하지 않고 30 분 간격으로 반복하고 그 시간에 이벤트가 표시되는 이유는 무엇입니까? 이렇게하면 각 간격에 대해 지속적으로 쿼리를 보내지 않아도됩니다. –

+0

BTW : 변수를 printf 문자열 안에 넣지 마십시오. 변수는 '%'문자를 포함 할 수 있으며 printf는 비참하게 실패 할 수 있습니다. –

답변

1

데이터베이스를 쿼리하기 전에 시간 분 및 ampm을 설정하지 않았기 때문에 이것이 상상됩니다.

아마도 새로운 시간, 분 등이있는 루프를 통해 매 사이클마다 DB를 다시 쿼리해야합니다. 그러나이 작업을 수행하는 데 더 효율적인 방법이있을 것입니다. 예를 들어 하루 동안 데이터를 한 번 저장 한 다음 PHP를 사용하여 정보를 반복합니다. 1dB 호출은 24의 insted * 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)에 저장되어 있으면 필요에 따라 루프 할 수 있습니다. 당신은 필요 이상으로 DB를 치고 싶지 않습니다.

내가 볼 수있는 것은 PHP가 그것을 할 수 있다는 것입니다. 나는 당신이 고심하고있는 구조적인 것 같아요.

+0

$ hour $ minute 및 $ am이 공백이기 때문에 쿼리는 undefined $ thing을 반환합니다. 나는 데이터, 프로세스를 저장하는 방법을 알고 충분한 PHP 기술을 가지고 있다고 생각하지 않으며, for 루프의 정확한 시간을 출력한다. – user618273

+0

나는 위에서 말한 내용을 대략 설명하기 위해 위의 대답으로 업데이트했습니다. – diagonalbatman

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] ...); 
    } 
} 

하지만 확인하는 모든 단일 시점에 대해 쿼리가 실행됩니다. 이벤트의 날짜/시간을 단일 날짜/시간 필드에 저장하는 것만으로는 안됩니다. 그런 다음

SELECT ... WHERE timestampfield BETWEEN startdatetime AND enddatetime 

에 쿼리를 줄이고 이벤트를 구축하는 PHP에서 그 결과를 사용할 수 있습니다. 단일 "큰"쿼리는 긴 일련의 "작은"쿼리보다 효율적입니다.

+0

내 루프 구조는 어떻게 생겼을 까? 나는 매 시간마다 새로운 시간과 분으로 다시 질의하는 방법을 제시했다. – user618273

+0

아니요. 루프 외부에서 쿼리를 작성하고 실행했습니다. 쿼리가 실행되면 PHP는 삽입 한 날짜/시간 값을 수정할 수 없습니다. –

+0

나는 원래 for 루프 안에 쿼리를 넣으려고했는데 같은 결과를 얻었습니까? 나는이 방법을 수백만 가지 방법으로 시도해 왔으며 계속 나다로 끝내고있다. – user618273

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'"; 

는,

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

에 equivilent이고 따라서 쿼리는 아무것도 반환하지 않습니다.

문자열을 업데이트해도 데이터베이스 쿼리가 업데이트되지 않습니다. 새로운 문자열에 대해 mysql_query()를 호출하여 해당 데이터를 가져와야한다.

$ thing_query = 및 $ res = 줄을 while 루프 바로 앞에 놓으면 각 timeslot의 마지막 이벤트 만 반환되지만 $ thing을 끝낼 때마다 재정의하므로 루프. 또한 $ times를 지우지 않기 때문에 새로운 timeslot에 도달 할 때까지 모든 timeslot에 이벤트를 계속 나열합니다.

Andy가 말했듯이, 이것은 현재 당신이 원하는 것을하기에 매우 효율적인 방법은 아니지만 아마도 당신이 시작한 것 같기 때문에 지금보다 더 중요한 것은 당신보다 더 효율적이라고 생각합니다. , 잘하면 지금이 도움이됩니다.

+0

당신은 선을 움직여서 결과를 얻었고 나는 이제 막 시작했습니다.하지만이 일을 올바르게 수행하는 방법을 배우고 싶습니다. 이 작업을 올바르게 수행하는 올바른 방법을 설명해 주시겠습니까? – user618273

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>"; 


} 
+0

도움을 주신 모든 분들께 감사드립니다! 이것은 내가 함께해온 최고의 그룹입니다. 이 솔루션은 훌륭하게 작동합니다. php.net을 더 잘 이해하고있는 것처럼 보입니다. – user618273

관련 문제