2010-04-28 52 views
1

我試圖在php中創建一個表格,該表格會根據用戶檢查的複選框顯示mysql數據庫中的數據。 正如你在這個屏幕截圖中看到,它就會有問題,當你沒有在一個前的複選框,這將是最後的檢查: 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之類的東西。 – 2010-04-28 09:07:52

+0

公平起見,我們不知道'$ saddress'沒有被引用。仍然是非常重要的話題。你在哪裏看到XSS矢量?表中的值? – outis 2010-04-28 09:28:56

+0

是這樣的:$ syear = mysql_real_escape_string($ _ POST ['specific']); 我沒有顯示其餘的代碼。我只是一個初學者,我相信當輸入類型=「text」時,我只需要mysql_real_escape_string。如果我錯了,請給我關於這個信念的啓發。 – user225269 2010-04-28 09:50:46

回答

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中不起作用,用「。」合併字符串。代替。 – 2010-04-28 09:02:06

+0

編輯...已經有一段時間,因爲我曾與PHP ... – Vinze 2010-04-28 09:34:51

+0

清潔的代碼,這應該這樣做:<?php echo($ ShowGender)? 「​​」。$ row ['GENDER']。「」:''?> – pixeline 2010-04-28 09:37:57

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 *重寫爲只讀取請求的列,從而減少數據庫負載。

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

你甚至可以通過檢查數據庫表(S),儘管這會產生額外表查詢構建$validFields陣列使其自我配置。

1

是的,就像你做第五個標籤一樣,if語句圍繞着td標籤,而不是在裏面。無論選中哪個複選框,現在您完成的方式總是顯示9列。

1

你在迭代中打印單元格,但只有內容取決於條件。

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