PHP实现MSSQL数据表格对齐:ORDER NUMBER与状态匹配问题
解决MSSQL数据表格对齐问题
我从MSSQL数据库获取数据,想要在表格中展示订单号、支付状态、订单状态三类信息,但当前PHP代码生成的表格里,订单号无法和对应的支付状态、订单状态对齐,没法形成规整表格。以下是我的代码和运行效果:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" href="css/clientsS.css"> <title></title> </head> <body> <div class="BLOC1"> <div class="NUMBER"> <center><table> <tr> <th>NUMERO COMMANDE</th> <th>STATUT PAIEMENT</th> <th>STATUT COMMANDE</th> </tr> <tr> <td><?php //CONNEXION ODBC SERVER// $dsn=""; $user=""; $password=""; $conn=odbc_connect($dsn ,$user, $password); //REQUETES $sql = <<<EOF SELECT top 10 [enc_cmd_num] FROM [encaissement] WHERE enc_date= '20221220' EOF; $results = odbc_exec($conn,$sql); while($resultrow = odbc_fetch_array($results)){ echo $resultrow["enc_cmd_num"]."<br/>" ; } ?> </td> </div> <div class="TITRE"> <td><?php //CONNEXION ODBC SERVER// $dsn=""; $user=""; $password=""; $conn=odbc_connect($dsn,$user, $password); //REQUETES $sql = <<<EOF SELECT top 10 [enc_paye] FROM [encaissement] WHERE enc_date= '20221220' EOF; $results = odbc_exec($conn,$sql); //CONDITION while($resultrow = odbc_fetch_array($results)) { switch($resultrow['enc_paye']){ case 0: echo "<p>En attente paiement</p> \r\n"; break; case 1: echo "<p class='green'>Commande payée<p/>\r\n"; break; } } ?> </td> <td><?php //CONNEXION ODBC SERVER// $dsn=""; $user=""; $password=""; $conn=odbc_connect($dsn,$user, $password); //REQUETES $sql = <<<EOF SELECT top 10 [enc_prepared] FROM [encaissement] WHERE enc_date= '20221220' EOF; $results = odbc_exec($conn,$sql); //CONDITION while($resultrow = odbc_fetch_array($results)) { switch($resultrow['enc_prepared']){ case 0: echo "<p>Commande en attente</p> \r\n"; break; case 1: echo "<p class='yellow'>Commande en cours de préparation<p/>\r\n"; break; } } ?> </td> </tr> </table> </div>

问题原因
你现在的写法犯了两个关键错误:
- 把所有订单号、支付状态、订单状态分别塞进同一个
<td>单元格,相当于三个单元格各装了10条数据,自然没法逐行对应对齐。 - 重复三次连接数据库,既浪费服务器资源,也可能因为三次查询的结果顺序不一致(虽然这里用了top10,但如果没有排序的话有风险),导致数据对应不上。
修正方案
只需要一次数据库连接,一次查询获取三个字段,然后循环每条数据生成一行表格即可:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" href="css/clientsS.css"> <title></title> <style> .green { color: green; } .yellow { color: orange; } table { border-collapse: collapse; margin: 0 auto; } th, td { border: 1px solid #ccc; padding: 8px 12px; text-align: left; } </style> </head> <body> <div class="BLOC1"> <div class="NUMBER"> <table> <tr> <th>NUMERO COMMANDE</th> <th>STATUT PAIEMENT</th> <th>STATUT COMMANDE</th> </tr> <?php // 只连接一次数据库 $dsn = ""; $user = ""; $password = ""; $conn = odbc_connect($dsn, $user, $password); // 一次查询获取需要的三个字段,建议加上排序保证顺序稳定 $sql = <<<EOF SELECT top 10 [enc_cmd_num], [enc_paye], [enc_prepared] FROM [encaissement] WHERE enc_date= '20221220' ORDER BY enc_cmd_num EOF; $results = odbc_exec($conn, $sql); // 循环每条数据,生成一行表格 while($resultrow = odbc_fetch_array($results)){ echo "<tr>"; // 订单号 echo "<td>" . $resultrow["enc_cmd_num"] . "</td>"; // 支付状态处理 echo "<td>"; switch($resultrow['enc_paye']){ case 0: echo "<p>En attente paiement</p>"; break; case 1: echo "<p class='green'>Commande payée</p>"; break; } echo "</td>"; // 订单状态处理 echo "<td>"; switch($resultrow['enc_prepared']){ case 0: echo "<p>Commande en attente</p>"; break; case 1: echo "<p class='yellow'>Commande en cours de préparation</p>"; break; } echo "</td>"; echo "</tr>"; } // 关闭数据库连接 odbc_close($conn); ?> </table> </div> </div> </body> </html>
关键改进点
- 单次数据库连接+单次查询,减少资源消耗,保证数据顺序一致
- 每条数据对应一个
<tr>,三个字段分别对应<td>,实现逐行对齐 - 增加了基础的表格样式(可选,你可以保留自己的css文件)
- 加上了
ORDER BY保证查询结果顺序稳定,避免top10返回随机顺序的问题
内容的提问来源于stack exchange,提问作者SHEYPT
相关产品推荐
相关产品推荐

