2012-06-25 4 views
0

나는 열매를 맺고 누군가가 도울 수 있기를 바라고있는 문제가 있습니다. 나는 최근에 기존의 방법과 반대로 mysql PDO를 배우기 시작했다. 값을 배열에 집어 넣은 다음 루프에서 처리하는 양식을 작성했습니다. 내가 뭘하는지 보여주기 위해 아래에 단순화 한 있지만 문제는 로컬 컴퓨터에서 잘 작동하지만로드 된 라이브 때 어떻게 든 for 루프 동안 mysql 연결이 손실됩니다 생각합니다.PDO가 for 루프 내에서 연결이 끊어 졌습니까?

<form method="post" action="next.php"> 
    <table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;"> 
    <tr> 
     <td><input type="checkbox" onClick="toggle(this)" /><br/></td> 
     <td><b>Sub Service Code</b></td> 
     <td><b>Criteria Value</b></td> 
     <td><b>Criteria Value 2</b></td> 
    </tr> 
    <tr> 
     <td><input type="checkbox" name="ID[]" value="2" /></td> 
     <td>&nbsp;John</td> 
     <td>&nbsp;</td> 
     <td>&nbsp;</td> 
    </tr> 
    <tr> 
     <td><input type="checkbox" name="ID[]" value="3" /></td> 
     <td>&nbsp;Paul</td> 
     <td>&nbsp;</td> 
     <td>&nbsp;</td> 
    </tr> 
    <tr> 
     <td><input type="checkbox" name="ID[]" value="4"checked /></td> 
     <td>&nbsp;Mary</td> 
     <td>&nbsp;</td> 
     <td>&nbsp;</td> 
    </tr> 
    </table> 
    <input type="submit" value="Submit" name="next"> 
</form> 

내가이 양식을 처리하기 위해 사용하고있는 PHP 스크립트는 다음과 같습니다 : 여기

양식 인 로컬이 아닌 환경에서

<?php 
if (isset($_POST['next'])) { 
?> 
<form method="post" action="next-2.php"> 
<table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;"> 
<tr> 
<td><input type="checkbox" onClick="toggle(this)" /><br/></td> 
<td><b>Name</b></td> 
<td><b>Value</b></td> 
<td><b>Value 2</b></td> 
<td><b>Select # of Levels</b></td> 
</tr> 

<?php 
    $id = $_POST['ID']; 
    if (empty($id)) { 
    echo("<p>You didn't select any names.</p>"); 
    } else { 
    $N = count($id); 
    echo("<p>You selected $N names(s):</p>"); 
    for($i=0; $i < $N; $i++) { 
     //echo($id[$i] . " "); 
     $stmt = $db->query('SELECT * FROM services_main'); 
     while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 

     if ($row['ID'] == $id[$i]) { 

     echo ' 
<tr> 
    <td><input type="checkbox" name="ID[]" value="'.$row['ID'].'" checked /></td> 
    <td>&nbsp;'.$row['Name'].'</td> 
    <td>&nbsp;'.$row['Value'].'</td> 
    <td>&nbsp;'.$row['Value 2'].'</td> 
    <td> 
    <select name="rate_'.$row['ID'].'" > 
     <option value="1">1</option> 
     <option value="2">2</option> 
     <option value="3">3</option> 
     <option value="4">4</option> 
     <option value="5">5</option> 
    </select>      
    </td> 
</tr>'; 
     } 
     } 
    } 
    } 
} 
?> 
</table> 
<input type="submit" value="Submit" name="next-2"> 
</form> 

,이 무엇입니까 :

<form method="post" action="next-2.php"> 
    <table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;"> 
    <tr> 
     <td><input type="checkbox" onClick="toggle(this)" /><br/></td> 
     <td><b>Name</b></td> 
     <td><b>Value</b></td> 
     <td><b>Value 2</b></td> 
     <td><b>Select # of Levels</b></td> 
    </tr> 
    <p>You selected 3 names(s):</p> 
    <tr> 
     <td><input type="checkbox" name="ID[]" value="2" checked /></td> 
     <td>&nbsp;John</td> 
     <td>&nbsp;</td> 
     <td>&nbsp;</td> 
     <td> 
      <select name="rate_2" > 
       <option value="1">1</option> 
       <option value="2">2</option> 
       <option value="3">3</option> 
       <option value="4">4</option> 
       <option value="5">5</option> 
      </select>      
     </td> 
    </tr> 
    </table> 
    <input type="submit" value="Submit" name="next-2"> 
</form> 

내가 db 연결을 잃을 수 있다고 생각하는 이유는 '사용자가 $ N 개의 이름을 선택했습니다.'라고 설정했기 때문입니다. N의 값에 대해 3을 올바르게 나타내고 있습니다. 이는 각 이름에 대한 3 개의 ID 값 각각에 대해 매번 db를 쿼리하는 3 번 반복해야 함을 의미합니다. 다시 말하지만, 로컬 환경에서는 완벽하게 작동하지만 라이브 서버에서는 정상적으로 작동하지 않습니다. 나는 왜 그것이 단지 살아있는 환경에서 다른 두 사람도 아닌 첫 번째 이름 결과 (John)를 돌려주는 이유를 이해할 수 없다.

마지막으로, 내 각 페이지에 나는 내가 철저하게 충분히이 문제를 설명했고 나는 아마 내가 어떻게 든 내려다하고 간단한 뭔가 같은데요 희망 다음 DB 연결이

$db = new PDO('mysql:host=sitename.org;dbname=name;charset=UTF-8', 'user', 'pwd'); 

파일을 포함하고있다. 그것을 보아 주셔서 감사합니다 ...

+1

이 라인의 의도가 무엇인가하는 경우 ($ 행 [ 'ID'] == $ 아이디 [$ I])? 당신이 그것을 주석 처리한다면 어떻게됩니까? – blearn

+2

while 루프 다음에'$ stmt-> closeCursor()'를 추가해보십시오. 또한 왜 각 ID에 대한 데이터베이스에서 모든 것을 가져 오는 중입니까? 왜 SELECT * FROM services_main WHERE ID IN (...) 쿼리를 만들지 않겠습니까? 이것은 훨씬 더 빨리 실행됩니다. – cdhowie

+0

어디에 문제가 있습니까? 여기에 어떤 질문도 표시되지 않습니다. –

답변

3

좋아, 우선 결과를 확인하기 위해 하나씩 레코드를 비교할 필요가 없습니다. 단지 결과를 처리하기 위해 MySQL WHERE을 사용하십시오. 다른 문제는 구조에 관한 것이므로 <table><p> 요소를 추가 할 수 없습니다.

그래서 내가하는 일은 체크가 $_POST['ID']으로 설정되어 있는지 확인한 다음이 변수가 배열인지 확인하는 것입니다. 그런 다음 나는 $_POST['ID']의 모든 값을 이스케이프 처리 한 후 해당 배열을 SQL에 implode합니다.

참고 : SQL에서는 코드에서 요청한 필드 만 선택했습니다.

그래서,이 코드는 작동합니다 :

<?php 
if (isset($_POST['next'])) { 
?> 
<form method="post" action="next-2.php"> 
<table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;"> 
<tr> 
<td><input type="checkbox" onClick="toggle(this)" /><br/></td> 
<td><b>Name</b></td> 
<td><b>Value</b></td> 
<td><b>Value 2</b></td> 
<td><b>Select # of Levels</b></td> 
</tr> 

<?php 
    // Check the existence of the "$_POST['ID']" and check if this is a array 
    if (isset($_POST['ID']) && is_array($_POST['ID']) { 
    $id = $_POST['ID']; 
    // Here we can't add '<p>' element to the table, so I used '<tr>' 
    echo '<tr><td colspan="5">You selected ' . count($id) . 'names(s):</td></tr>'; 

    // Create a function to escape the value. 
    function escape($value) { 
     // Only integer value can be returned. 
     return (int) $value; 
    } 

    // Escaping '$id' values. 
    $id = array_map('escape', $id); 

    // SQL, here we implode all value to the condition. 
    $stmt = $db->query('SELECT `ID`, `Name`, `Value`, `Value 2` FROM `services_main` WHERE `ID` IN (' . implode(',', $id) . ')'); 

    // Loop all results 
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     echo ' 
<tr> 
    <td><input type="checkbox" name="ID[]" value="' . $row['ID'] . '" checked /></td> 
    <td>&nbsp;' . $row['Name'] . '</td> 
    <td>&nbsp;' . $row['Value'] . '</td> 
    <td>&nbsp;' . $row['Value 2'] . '</td> 
    <td> 
    <select name="rate_' . $row['ID'] . '" > 
     <option value="1">1</option> 
     <option value="2">2</option> 
     <option value="3">3</option> 
     <option value="4">4</option> 
     <option value="5">5</option> 
    </select>      
    </td> 
</tr>'; 
    } 

    unset($stmt, $id); 
    } else { 
    // Here we can't add '<p>' element to the table, so I used '<tr>' 
    echo '<tr><td colspan="5">You didn\'t select any names.</td></tr>'; 
    } 
} 
?> 
</table> 
<input type="submit" value="Submit" name="next-2"> 
</form> 
+0

감사합니다 Fong-Wan! 이 작동하는 것 및 cdhowie의 의견을 읽은 후 코드를 조정하는 방법을 비슷합니다. 내 유일한 문제는 내가 아니라 (내가 간단하게하고 싶었 기 때문에 내가 코드를 게시 내 원래이 포함되지 않은) 각 행 (ID) 값을 에코 필요가있다. 우리는 'for'루프 초기을 제거하고 현재 값을 내파에 의해 작업 쿼리를 얻을 수 있기 때문에, 지금 내가 모든 이름으로 그것을 밖으로 반향 할 수 있도록 각 id 값에 액세스하는 방법을 알아낼 수 없습니다. 즉, 이제는 할 수 없습니다. ' $ row [ 'Name']. '. $ id [$ i].' 자세한 답변을 보내 주셔서 감사합니다. –

+0

신경 쓰지 마라. 알아 냈어. 나는 $ id [$ i] 대신 $ row [ 'ID']를 사용할 수 있습니다. 도와 주신 모든 분들께 다시 한번 감사드립니다! –

관련 문제