2013-07-10 126 views
-3

我正在使用以下代碼將數據庫表導出爲ex​​cel。這段代碼的問題在於它只返回Excel中的一行。我不知道代碼有什麼問題。 mysql代碼或php代碼。我一直在嘗試糾正代碼。但我還沒辦法。所以我真的需要你的幫助。這是代碼。爲什麼它只返回一行?

<?php 

$dbHost = 'localhost';   // database host 
$dbUser = 'root';  // database user 
$dbPass = 'passwrd';  // database password 
$dbName = 'mydatabase';   // database name 
$dbTable = 'table';   // table name 

$connection = @mysql_connect($dbHost, $dbUser, $dbPass) or die("Couldn't connect."); 
$db = mysql_select_db($dbName, $connection) or die("Couldn't select database."); 

$f=$_GET['fdate']; 
$t=$_GET['tdate']; 
$y=$_GET['Year']; 

$sql = "SELECT regd, Roll_no, Name_of_Student, 
SUM(IF(`Subject` = 'ENG-I', Mark_score, 0)) AS Eng_I, 
SUM(IF(`Subject` = 'ENG-II', Mark_score, 0)) AS Eng_II, 
SUM(IF(`Subject` = 'Mizo', Mark_score, 0)) AS Mizo, 
SUM(IF(`Subject` = 'Hindi', Mark_score, 0)) AS Hindi, 
SUM(IF(`Subject` = 'EVS', Mark_score, 0)) AS EVS, 
SUM(IF(`Subject` = 'Mathematics', Mark_score, 0)) AS Maths, 
SUM(IF(`Subject` = 'GK', Mark_score, 0)) AS GK, 
Sum(Full_mark) as Fullmark, Sum(Mark_score) as Totalscore, 
Sum(Mark_score)/sum(Full_mark)*100 as Percentage FROM $dbTable 
WHERE Test_date Between '$f' and '$t' and Year='$y' and Class='IV' GROUP BY Subject && regd Order by Totalscore Desc"; 
$result = @mysql_query($sql) or die("Couldn't execute query:<br>".mysql_error().'<br>'.mysql_errno()); 

header('Content-Type: application/vnd.ms-excel'); 
header('Content-Disposition: attachment; filename=Class-IV-'.date('d-M-Y').'.xls'); 
header('Pragma: no-cache'); 
header('Expires: 0'); 

echo '<table border="1"><caption><b>AR ELLS SCHOOL<br >CHALTLANG : MIZORAM<br />WEEKLY TEST BETWEEN '.$f.' AND '.$t.'&nbsp; <br /> CLASS : IV</b></caption><tr bgcolor="silver">'; 
for ($i = 0; $i < mysql_num_fields($result); $i++) 
    echo '<th>'.mysql_field_name($result, $i).'</th>'; 
print('</tr>'); 

while($row = mysql_fetch_row($result)) 
{ 
    //set_time_limit(60); 
    $output = '<tr style="background-color:white">'; 
    for($j=0; $j<mysql_num_fields($result); $j++) 
    { 
     if(!isset($row[$j])) 
      $output .= '<td>&nbsp;</td>'; 
     else 
      $output .= "<td>$row[$j]</td>"; 
    } 
    print(trim($output))."</tr>\t\n"; 
} 
echo('</table>'); 
?> 

我是新手。請幫助我..

+0

@ user20232359723568423357842364那麼,什麼? –

+0

如果要返回所有行,請不要聚合(SUM&GROUP BY)。 –

+0

@ X.L.Ant我不只是想返回所有的行,我想使用主題的名稱作爲列標題,每個標記在每個標記下打分。同時,我想查找每個學生的排名。但有人已經三次投下了......我無望...... –

回答

1

你的代碼有多個問題。

1)您沒有生成Excel文件。你正在生成一些HTML,Excel正好能夠假裝是一個Excel文件。

2)您生成的HTML無效並被破壞。你不能把<caption>放在你所在的位置。一個HTML表格必須看起來像

<table> 
<tr> 
    <td>...</td> 
</tr> 
</table> 

<caption>必須是內<td>,或完全不在表。

3)您很容易受到SQL injection attacks的影響。請勿在生產環境中使用此代碼。你只會讓你的服務器遭到破壞。

4)你有沒有做過ANY自己調試?例如捕獲生成的查詢並在外部工具中自己運行它?它在那裏返回多行嗎?如果不是,那麼這就是你的查詢被破壞了,而不是PHP代碼。