2012-02-10 2 views
0

현재 PHP 지식을 업데이트하고 있으며 데이터베이스에서 데이터를 가져 오는 동안 문제가 발생했습니다.너무 많은 연결; 함수에 db가 연결되었습니다.

내가 가지고있는 문제는 아마도 max_connection 설정으로 정렬 할 수 있지만 (예, 주위를 검색했습니다) 기본 설정을 변경하고 싶지 않기 때문에 문제가 해결 될 수도 있습니다. 필요하지 않은 경우.

나는 내 작은 "사다리"에 세 개의 "계단"을 가지고 있습니다. 내 메인은 사다리입니다. 모든 사다리에는 하나 이상의 (또는 그 이상의) 단계가 있으며 모든 단계마다 하나 이상의 (또는 그 이상의) 모듈이 있습니다.

그래서 내가하려는 것은이 모든 것을 검색하여 보여주는 함수입니다. 이제는 모든 함수가 내 데이터베이스에 연결합니다. 함수가 쿼리를 실행 한 다음 닫습니다. 내 첫 번째 단서는 내가 한 모든 함수 사이에서 데이터베이스를 닫는 것이 었습니다. 그러나 "한꺼번에"내 코드를 검색하고 있기 때문에 코드가 작동하지 않습니다.

어떻게하면 함수에서 한 데이터베이스 연결을 만들고 한 번 호출 한 다음 새 연결을 열지 않고도 모든 정보를 검색하는 방법은 무엇입니까?

내 질문에 답변하는 데 필요한 모든 정보가 있으면 좋겠다. 스택 오버플로 방식으로 게시하고 싶습니다.

미리 감사드립니다.

P.S :이 코드 도구를 올바르게 사용하면 Dunno가 구조적으로 보이지만 하이라이트가 없습니다.

CODE :

<?php 

    echo displayResult(); 

    function displayResult() { 

     $db = new mysqli ('localhost', 'website', 'dog', 'nplus'); 
     $sql = 'SELECT * FROM ladders'; 
     $result = $db->query($sql); 

     $r = ''; 

     $r .= '<table>'; 

     while ($row = $result->fetch_object()) { 

      $r .= '<tr>'; 
      $r .= '<td>' . htmlspecialchars($row->ladderID) . '</td>'; 


    $r .= '<td>' . htmlspecialchars($row->ladderName) . '</td>'; 
     $r .= '<td>' . htmlspecialchars($row->created) . '</td>'; 
     $r .= displayAssociateStep($row->ladderID); 
     $r .= '<tr><td>&nbsp</td></tr>'; 

    } 

    $r .= '</table>'; 

    $db->close(); 

    return $r; 
} 

function displayAssociateStep($ladderID) { 

    $r = ''; 

    $db = new mysqli ('localhost', 'website', 'dog', 'nplus'); 
    $sql = 'SELECT * FROM steps WHERE ladderID = '. $ladderID ; 
    $result = $db->query($sql); 

    $r = ''; 

    while ($row = $result->fetch_object()) { 

     $r .= '<tr>'; 
     $r .= '<td></td>'; 
     $r .= '<td></td>'; 
     $r .= '<td>' . htmlspecialchars($row->stepName) . '</td>'; 
     $r .= '<td>' . htmlspecialchars($row->created) . '</td>'; 
     $r .= '</tr>'; 

    } 

    $db->close(); 

    return $r; 

} 



?> 
+0

함수를 사용하기 전에 $ db 객체를 만드는 것이 어떻습니까? 당신은 그것을 생성하고, 함수에 인자로 넘겨 주며 (또는 함수에 접근 할 수 있도록 전역으로 만든다) 함수를 사용하고 닫는다. 그렇게하면 데이터베이스에 단 하나의 연결 만 있습니다. –

답변

1
에서만과 같이 한 번 데이터베이스에 연결하고 인수로 주위를 통과해야

:

<?php 

    function displayResult($db) { 

    $sql = " 
     SELECT * 
     FROM ladders 
    "; 
    $result = $db->query($sql); 

    // ADD ERROR CHECKING HERE 
    // What happens if the query fails? 

    $r = '<table>'; 
    while ($row = $result->fetch_object()) { 
     $r .= '<tr>'; 
     $r .= '<td>' . htmlspecialchars($row->ladderID) . '</td>'; 
     $r .= '<td>' . htmlspecialchars($row->ladderName) . '</td>'; 
     $r .= '<td>' . htmlspecialchars($row->created) . '</td>'; 
     $r .= '</tr>'; 
     $r .= displayAssociateStep($db, $row->ladderID); 
     $r .= '<tr><td colspan="3">&nbsp;</td></tr>'; 
    } 
    $r .= '</table>'; 

    return $r; 

    } 

    function displayAssociateStep($db, $ladderID) { 

    // Are you 100% certain $ladderID is always safe to use in a query? 
    // Does it need escaping? 
    $sql = " 
     SELECT * 
     FROM steps 
     WHERE ladderID = $ladderID 
    "; 
    $result = $db->query($sql); 

    // ADD ERROR CHECKING HERE 
    // What happens if the query fails? 

    $r = ''; 

    while ($row = $result->fetch_object()) { 
     $r .= '<tr>'; 
     $r .= '<td></td>'; 
     $r .= '<td>' . htmlspecialchars($row->stepName) . '</td>'; 
     $r .= '<td>' . htmlspecialchars($row->created) . '</td>'; 
     $r .= '</tr>'; 
    } 

    return $r; 

    } 

    // Connect once 
    $db = new mysqli ('localhost', 'website', 'dog', 'nplus'); 

    // Pass the connection in as an argument  
    echo displayResult($db); 

    // Close the connection 
    $db->close(); 
+0

그게 바로 해결! 또한 범위가 더 좋고 깨끗한 코드입니다. 감사! :) –

+1

걱정하지 마라. - 내가 만든 HTML이 아주 옳지 않다는 것을 알았지 만. $ r. = displayAssociateStep ($ db, $ row-> ladderID); '뒤에'$ r. =' ';'을 추가해야한다고 생각합니다. 그렇지 않으면 닫히지 않은 테이블 행이로드됩니다. 대부분의 브라우저는 자동으로이 문제를 해결하지만 수정하지 않으면 예상치 못한 결과가 발생할 수 있습니다. 마지막 행의''에'colspan = "4"'를 추가 할 필요가 있습니다. 수정 코드를 편집했습니다. – DaveRandom

+1

또 다른 작은 수정 - 테이블 구조의 오류를보고 싶다면 ''에'style = "border : 1px solid # 000000"'을 추가하십시오. 각 행에 동일한 개수의 셀이 있고 올바르게 모든 것을 닫거나 제대로 표시되지 않을 수 있습니다. – DaveRandom

0

내가 말할 것 ... $ 통과 db 변수를 추가 한 매개 변수로 displayAssociateStep에 displayResult로 가져 왔습니다. 그런 다음 displayAssociatesStep에서 연결을 열거 나 닫을 필요가 없습니다. 원하는대로 할 수 있습니까?