2010-04-28 4 views
1

사용자가 체크 한 체크 박스를 기반으로 MySQL 데이터베이스에 데이터를 표시하는 테이블을 PHP에서 생성하려고합니다. 여기 http://www.mypicx.com/04282010/1/PHP의 테이블 문제

내 코드입니다 :이 스크린 샷에서 볼 수 있듯이 마지막이 될 일 전에 체크 박스에 체크하지 않은 경우 , 그것은 문제가됩니다

if($_POST['general'] == 'ADDRESS'){ 
$result2 = mysql_query("SELECT * FROM student WHERE ADDRESS='$saddress'"); 
?> 



<table border='1'> 
<tr> 
<th>IDNO</th> 
<th>YEAR</th> 
<th>SECTION</th> 

<?php if ($ShowLastName) 
echo "<th>LASTNAME</th>" ?> 

<?php if ($ShowFirstName ) 
echo "<th>FIRSTNAME</th>" ?> 


<?php if ($ShowMidName ) 
echo "<th>MIDNAME</th>" ?> 


<?php if ($ShowAddress ) 
echo "<th>ADDRESS</th>" ?> 


<?php if ($ShowGender ) 
echo "<th>GENDER</th>" ?> 

<?php if ($ShowReligion ) 
echo "<th>RELIGION</th>" ?> 

<?php if ($ShowBday ) 
echo "<th>BIRTHDAY</th>" ?> 

<?php if ($ShowContact ) 
echo "<th>CONTACT</th>" ?> 
</tr> 


<?php 
while($row = mysql_fetch_array($result2)) 
    {?> 
    <tr> 
    <td><?php echo $row['IDNO']?> </td> 
<td><?php echo $row['YEAR'] ?> </td> 
    <td><?php echo $row['SECTION'] ?></td> 


    <td><?php 
    if ($ShowLastName ) 
    echo $row['LASTNAME'] ?></td> 

    <td><?php 
    if ($ShowFirstName ) 
    echo $row['FIRSTNAME'] ?></td> 

      <td><?php 
    if ($ShowMidName ) 
    echo $row['MI'] ?></td> 


    <td><?php 
    if ($ShowAddress ) 
    echo $row['ADDRESS'] ?></td> 

    <td><?php 
    if ($ShowGender ) 
    echo $row['GENDER'] ?></td> 



    <td><?php 
    if ($ShowReligion ) 
    echo $row['RELIGION'] ?></td> 

    <td><?php 
    if ($ShowBday ) 
    echo $row['BIRTHDAY'] ?></td> 

    <td><?php 
    if ($ShowContact ) 
    echo $row['S_CONTACTNUM'] ?></td> 



    </tr> 

<?PHP } ?> 
    </table> 

<?PHP } 






mysql_close($con); 
?> 

무엇 http://www.mypicx.com/04282010/2/ alt text http://www.mypicx.com/uploadimg/1702270558_04282010_1.png

+0

와우, 이것은 단순한 학업이 아니라면 훨씬 더 많은 어려움을 겪습니다. 코드는 SQL 인젝션과 XSS 인젝션에 영향을받습니다. 적어도 mysql_real_escape_string과 htmlspecialchars 같은 것을 사용하는 법을 배워야한다. –

+0

공정하기 때문에'$ saddress'가 인용되지 않았다는 것을 알 수 없습니다. 여전히 제기해야 할 매우 중요한 주제입니다. XSS 벡터는 어디에 있습니까? 표의 값은? – outis

+0

이 좋습니다 : $ syear = mysql_real_escape_string ($ _ POST [ 'specific']); 나머지 코드는 표시하지 않았습니다. 나는 초보자 일 뿐이며 입력 유형이 "텍스트"일 때만 mysql_real_escape_string이 필요할 것이라고 생각합니다. 내가 틀렸다면이 믿음에 대해 가르쳐주세요. – user225269

답변

2

확인을 먼저 최초, 그것을 읽을 너무 어렵 기 때문에 이제, 코드를 위로 청소하도록하는 것은 현재의 형식 :

<?php 
     if($_POST['general'] == 'ADDRESS'){ 
     $result2 = mysql_query("SELECT * FROM student WHERE ADDRESS='$saddress'"); 
?> 
<table border='1'> 
     <tr> 
       <th>IDNO</th> 
       <th>YEAR</th> 
       <th>SECTION</th> 
       <?php if ($ShowLastName) { ?><th>LASTNAME</th><?php } ?> 
       <?php if ($ShowFirstName) { ?><th>FIRSTNAME</th><?php } ?> 
       <?php if ($ShowMidName) { ?><th>MIDNAME</th><?php } ?> 
       <?php if ($ShowAddress) { ?><th>ADDRESS</th><?php } ?> 
       <?php if ($ShowGender) { ?><th>GENDER</th><?php } ?> 
       <?php if ($ShowReligion) { ?><th>RELIGION</th><?php } ?> 
       <?php if ($ShowBday) { ?><th>BIRTHDAY</th><?php } ?> 
       <?php if ($ShowContact) { ?><th>CONTACT</th><?php } ?> 
     </tr> 

<?php while($row = mysql_fetch_array($result2)) {?> 
     <tr> 
       <td><?php echo $row['IDNO']?> </td> 
       <td><?php echo $row['YEAR'] ?> </td> 
       <td><?php echo $row['SECTION'] ?></td> 
       <?php if ($ShowLastName) { echo('<td>'.$row['LASTNAME'].'</td>'); } ?></td> 
       <?php if ($ShowFirstName) { echo('<td>'.$row['FIRSTNAME'].'</td>'); } ?> 
       <?php if ($ShowMidName) { echo('<td>'.$row['MI'].'</td>'); } ?> 
       <?php if ($ShowAddress) { echo('<td>'.$row['ADDRESS'].'</td>'); } ?> 
       <?php if ($ShowGender) { echo('<td>'.$row['GENDER'].'</td>'); } ?> 
       <?php if ($ShowReligion) { echo('<td>'.$row['RELIGION'].'</td>'); }?> 
       <?php if ($ShowBday) { echo('<td>'.$row['BIRTHDAY'].'</td>'); }?> 
       <?php if ($ShowContact) { echo('<td>'.$row['S_CONTACTNUM'].'</td>'); }?> 
     </tr> 
<?php } ?> 
</table> 
<?php } 
     mysql_close($con); 
?> 

가장 좋은 방법은이 코드를 넣고이 향상되는지 우리에게 이야기하려고하는 것 소지품?

편집

아, 다른 사람들이 <td> 태그 당신의 상태의 외부 앉아 말했듯이, 여전히, 위의 코드 읽기가 훨씬 용이하고

4

대신

의 : 출력은 다음과 같이하지 않도록 체크 박스 앞에 체크 박스 당신이 하나를 클릭하지 않을 때 당신은 추천 할 수 있습니다
<td><?php 
     if ($ShowGender ) 
     echo $row['GENDER'] ?> 
    </td> 

당신이

<?php 
    if ($ShowGender ) 
    echo "<td>".$row['GENDER']."</td>" ?> 

같은 뭔가해야 그래서 <td> 태그는 나타나는 경우 문이 참 "만일".

+1

"+"는 PHP에서 작동하지 않으며 문자열을 "."과 병합합니다. 대신. –

+0

편집 ... php ... – Vinze

+0

에 대한 클리너 코드를 작성한 이후로이 작업을 수행해야합니다. ". $ row [ 'GENDER']. "": ''?> – pixeline

2

$isField 변수가 설정되어 있지만 셀 내용을 인쇄할지 여부를 테스트하는 경우에만 모든 표 셀을 인쇄하면 표 머리글 요소 (<th>) 만 인쇄됩니다.

대신 모든 필드를 반복하여 인쇄하십시오. 모든 분야를 테스트 할 필요가 없습니다.

예 양식 :

<form action="..." method="POST"> 
    <h4>Student Information</h4> 
    <?php foreach ($studentFields as $key => $label) { ?> 
    <input type="checkbox" name="show[<?php echo $key; ?>]" id="show_<?php echo $key; ?>"/><label for="show_<?php echo $key; ?>"><?php echo $label; ?></label> 
    <?php } ?> 
    <h4>Parent Information</h4> 
    <?php foreach ($parentFields as $key => $label) { ?> 
    <input type="checkbox" name="show[<?php echo $key; ?>]" id="show_<?php echo $key; ?>"/><label for="show_<?php echo $key; ?>"><?php echo $label; ?></label> 
    <?php } ?> 
</form> 

양식 처리기 :

<table> 
    <thead><tr> 
    <?php foreach ($fields as $key => $label) { ?> 
     <th><?php echo $label; ?></th> 
    <?php } ?> 
    </tr></thead> 
    <tbody> 
    <?php foreach ($results as $row) { ?> 
     <tr> 
     <?php foreach ($fields as $key => $label) { ?> 
      <td><?php echo $row[$key]; ?></td> 
     <?php } ?> 
     </tr> 
    <?php ?> 
    </tbody> 

foreach ($results as $row) { 필요는 오래된 MySQL의 드라이버를 고수 경우 while 루프로 다시 있지만, PDOStatement와 함께 작동합니다. PDO로 전환하면 prepared statement 매개 변수가 취약하지 않으므로 취약성을 쉽게 주입 할 수 있습니다. SELECT *을 다시 작성하여 요청 된 열만 가져와 DB로드를 줄일 수도 있습니다.

$validFields = array('last' => 'Last Name', 'first' => 'First Name', 'stAddr' => 'Address', ...); 
$fields = array_intersect($validFields, $_POST['show']); 

당신은이 별도의 테이블 쿼리를 발생할 것입니다 불구하고, DB 테이블 (들)을 검사하여 $validFields 배열을 구성하여 그것 자체 구성을 만들 수 있습니다.

1

예, td 태그 주위에서 if 문을 사용하여 th 태그를 수행 한 것과 같은 방식으로 수행하십시오. 지금까지 해본 방법은 체크 박스가 선택 되더라도 항상 9 개의 열을 표시합니다.

1

:-) 미래 디버깅 도움이 될 것입니다 반복에서 셀을 인쇄하고 있지만 내용은 조건에 따라 다릅니다.

<?php 
if ($ShowContact ) 
echo '<td>' . $row['S_CONTACTNUM'] . '</td>' ?>