为什么它只返回一行?

问题描述:

我正在使用以下代码将数据库表导出为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)您没有生成Excel文件。你正在生成一些HTML,Excel正好能够假装是一个Excel文件。

2)您生成的HTML无效并被破坏。你不能把<caption>放在你所在的位置。一个HTML表格必须看起来像

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

<caption>必须是内<td>,或完全不在表。

3)您很容易受到SQL injection attacks的影响。请勿在生产环境中使用此代码。你只会让你的服务器遭到破坏。

4)你有没有做过ANY自己调试?例如捕获生成的查询并在外部工具中自己运行它?它在那里返回多行吗?如果不是,那么这就是你的查询被破坏了,而不是PHP代码。