2012-09-21 3 views
-1

좋아 - 이것은 바보 같은 질문 일 수 있지만 완벽에 대한 내 욕망이 나를 자극하고 있으므로 바보 같고 무의미한 경우 그냥 알려주세요.변수 선언을 사용하여 PHP MySql 쿼리 성능

데이터베이스 테이블에서 행을 가져 오는 mysql 쿼리가 있는데 수집하는 모든 열에 대해 일부 셰이프 또는 양식의 값이 필요합니다. 다음 샘플 코드를보고 (이 대신 출력을 수집하기 위해 배열을 사용할 수 있습니다 - 근본적인 문제는 동일해야합니다) :

$query="SELECT A,B,C,D FROM table1 WHERE 'X'='Y'"; 
$result=mysql_query($query,$resource); 
while($row=mysql_fetch_assoc($result)){ 
    $var1=$row['A']; $var2=$row['B']; 

    echo '<li class="' . $row['C'] . '" id="' . $row['D'] . '">'; 
} 

내 질문은 다음과 같다 :

나는 단지 $ 행 [ '을 필요로 A ']와 $ row ['B ']는이 경우 모든 행에 대해 동일한 값을 갖기 때문에 한 번 필요하지만 한 번 필요합니다. 다른 값은 모든 행마다 다르며이 예제에서와 마찬가지로 값이 필요합니다.

루프 전체에서 변수를 계속 설정하는 데 문제가 있습니까? 아니면 if(!isset ...을 사용하는 것이 더 낫습니까? 아니면 이것을 할 수있는 다른 방법이 있습니까? 또는이 질문을 부적절하게 만들 정도로 성능이 저하 되었습니까?

감사합니다.

+0

가 어떻게 '정확히 ('경우 (!의는 isset을 사용식이 DO-동안 함께 할 수 있습니까? –

+0

If (! isset ($ var1)) {$ var1 = $ row [ 'A'];} – user1167442

+0

왜 이것을 왜곡하여 왜 편집 했나요? – user1167442

답변

1

왜 루프 바깥에 변수를 설정하지 않았습니까?

$result=mysql_query($query,$resource); 
$result_new = mysql_fetch_assoc($result); 
$var1 = $result_new['A']; //considering $result_new['A'] always exists 
$var2=$result_new['B']; //considering $result_new['B'] always exists 
while($row=$result_new){ 
echo '<li class="' . $row['C'] . '" id="' . $row['D'] . '">'; 
} 
+0

좋습니다. 이것이 제가 끝내 준 것입니다. – user1167442

+0

내가 찾던 결과를 명확하게 과학적으로 보여 주었기 때문에 나는 다른 대답을 받아 들였다. 당신의 대답은 최고의 techinque-wise였습니다. 왜냐하면 이런 종류의 명백한 (우리는 모두 얼굴 앞에서 맹목적입니다) 제가 찾고 있던 답변 이었기 때문입니다. 내가 두 가지를 받아 들일 수 있었습니까? 나는 그것을 upvoted. – user1167442

+0

ooh, thts k, 나는 이미 답변을 수락했음을 알 수 있습니다 :) –

1

정말 걱정하지 마십시오. 수백만 건의 레코드를 반복하지 않는 한. 당신이 더 빠른 속도가 필요한 경우

, while 루프에 표시하지 않습니다

$result=mysql_query($query,$resource); 
    $string =''; 
if ($result) { 
$row=mysql_fetch_assoc($result); 
$string .= '<li class="' . $row['C'] . '" id="' . $row['D'] . '">'; 
$var1=$row['A']; 
$var2=$row['B']; 

    while($row=mysql_fetch_assoc($result)){ 

    $var1=$row['A']; $var2=$row['B']; 
    $string .= '<li class="' . $row['C'] . '" id="' . $row['D'] . '">'; 
    } 
    } 
    echo $string; 

두 가지 더있다. mysql_ *을 사용하지 마라 :이 확장 기능의 사용은 권장하지 않는다!

그리고 (누군가 다른 사람이 생각한 것처럼) a/b가 항상 같으면 데이터베이스 구조를 다시 생각해 봐야합니다.

편집 : 질문에 대한 실제 답변을 제공하려면 : 작은 테스트를 수행했습니다. 각 루프의 값 설정 (1,000 번)은 0.00027 초입니다. 값이 이미 설정되어 있으면 루프 내부를 검사하면 0.00030 초가 걸립니다. 따라서 매번 설정하는 것만 으로 점검하는 것보다 빠릅니다. 이 질문은 당신이 할당하는 상황이 될 것 중요 것 내가 생각할 수있는 유일한 시나리오를, -

+0

어쩌면 A와 B는이 'WHERE' 필터와 동일합니다.) - 그렇지만 달리 동의 함 – cypherabe

+0

예 그렇지만 그 사람은 이미 어디서이 루프를 만들지 않으시겠습니까? – Nin

+0

감사합니다.> 멋진 테스트입니다. 그것이 제가 찾던 답의 핵심입니다. – user1167442

1
  1. 이 시나리오에서 성능 저하는 if(isset..) 경비원 작은 조금 더 오래 걸릴 경우 사실 내가 추측 것, 무관 어떻게 든 (더 큰) 개체 또는 $var1에 배열과 사본이 아니라 참조를 만들기 위해 PHP를 강제로가 (내가 관련된 수) 심미적 인 이유로 당신을 귀찮게하는 경우

  2. ), 당신이 할 일을 사용할 수 있습니다 - 루프 동안 :

    //assuming you always get at least one result 
    $result=mysql_query($query,$resource); 
    $row=mysql_fetch_assoc($result); 
    $var1=$row['A']; $var2=$row['B']; 
    
    do { 
        // the loop stuff - stringify or echo the list 
    } while ($row=mysql_fetch_assoc($result)) ; 
    
+0

내 것과 거의 같지만 mysql이 빈 결과 집합을 반환하면 어떻게 될까? –

+0

그 원리를 보여주는 것은 단지 빠른 예일뿐입니다. 그래서 저는 거기에 주석을 달았습니다.). 물론, 실제 응용 프로그램에서는 여기에서 몇 가지 오류 검사가 필요합니다 ... (ok, 저는 게으르며 많은 형식의 코드를 stackoverflow에 입력하는 것을 좋아하지 않습니다) – cypherabe

+0

알아,하지만 다른 모든 사람들은 완벽 주의자입니다.) –

1

당신은

$query="SELECT A,B,C,D FROM table1 WHERE 'X'='Y'"; 
$result=mysql_query($query,$resource); 
if($row=mysql_fetch_assoc($result)) { 
    $var1=$row['A']; $var2=$row['B']; 
    do { 
     echo '<li class="' . $row['C'] . '" id="' . $row['D'] . '">'; 
    } while($row=mysql_fetch_assoc($result)); 
}