2014-09-01 3 views
0

이렇게 좋은 연습인지 아닌지 궁금 해서요. 또는 어떤 이유로이 유형의 코드가 시스템의 속도와 기능에 영향을 줍니까?prepared statement while prepared statement while while prepared statement

$foo = "bar"; 
$stmt = $db->prepare('SELECT * FROM table WHERE bar=?'); 
$stmt->bind_param('s',$foo); 
$stmt->execute(); 
$result = $stmt->get_result(); 
    while($row = $result->fetch_assoc()){ 
     $val1 = $row['val1']; 
     $val2 = $row['val2']; 
     echo "<section>"; 
      $stmt2 = $db->prepare('SELECT * FROM table2 WHERE bar=?'); 
      $stmt2->bind_param('s',$foo); 
      $stmt2->execute(); 
      $result2 = $stmt2->get_result(); 
      while($row = $result2->fetch_assoc()){ 
       $val1 = $row['val1']; 
       $val2 = $row['val2']; 
      } 
      $stmt->close(); 
     echo "</section>"; 
    } 
$stmt->close(); 

제 문이 나쁜, 즉 서로 50 이상 STMT이 생성 될 것임을 의미하며, 50 개 이상의 데이터를 생성 할 수 있을까? 대답 해줘서 고마워.

+1

루프 내부의 데이터베이스 쿼리는 거의 좋은 아이디어가 아닙니다. 오히려 하나의 쿼리를 사용하여 필요한 모든 데이터를 가져와야합니다. JOIN을 살펴보십시오. – CBroe

답변

1

성명서를 작성할 때마다 값 비싼 MySQL에 대한 호출이 필요합니다. 그것이 같은 성명이라면, 이것은 불필요하며 시간 낭비입니다.

매개 변수를 한 번만 바인딩하면됩니다. bind_param은 매개 변수를 변수에 대한 참조와 연결합니다. 따라서 루프는 변수 값을 업데이트하고 execute으로 호출하면됩니다.

코드에서 루프를 통해 매번 내부 쿼리를 반복하는 것처럼 보이지는 않습니다. 그것은 외부 쿼리에서 검색된 것에 종속되지 않으므로 매번 같은 결과 집합을 반환합니다. 한 번 수행하고 결과를 배열에 저장 한 다음 매번 배열을 반복하면 데이터베이스가 불필요하게 누적되지 않습니다.

이것은 단지 인공적인 예제이고 외부 쿼리에서 반환 된 데이터와 내부 쿼리의 매개 변수 사이에 실제로 종속 관계가있는 경우 두 쿼리 사이에 JOIN을 포함하는 단일 쿼리로 처리해야합니다 테이블.

+0

고마워요. 내 선택의 일부로 지금이 일을 못 하겠어. – Bobski

1

일반적으로 나쁜 습관으로 받아 들여집니다.

당신은 코드를 읽기보다 어렵게 만들고 필요 이상으로 복잡하게 만듭니다. 미래에 오류가 발생할 가능성을 높이고 나중에 코드를 지원해야한다면 다른 사람들이 이해하기가 더 어려워집니다.

위에서 확인한 바와 같이 JOIN을 사용해야합니다.

+0

답장을 보내 주셔서 감사합니다. 감사 – Bobski