作者foxzgerald (O⊥M)
看板PHP
標題Re: [請益] php & xhtml
時間Sun Dec 17 15:19:50 2006
※ 引述《NUKnigel (簡簡單單)》之銘言:
: 今天第一次碰php & mysql
: 但剛剛忙了一個早上
: 發現如果用xhtml的方法來表示 table
: 會無法顯示 @@
: 但是一改成html就成功顯示...
: 是我的方法錯誤...還是php 和 xhtml本來就不相容呢?
方法錯誤。PHP和 XHTML是不同層面的技術;XHTML 只是
種資料的表現方式,若 PHP的輸出
符合 XHTML 的格式,
便不會有相容性上的問題。
請看下面的 code :
echo
"<table summary="教師資料">";
上頭有個基本、但不小心卻容易忽略的"脫序"問題。
我想 PHP 解析器應該會跟你抱怨看不懂程式碼。
正確的輸出格式應為
"<table summary=
\"教師資料
\">"; // A
或是
'<table summary="教師資料">'; // B
或
"<table summary='教師資料'>"; // C
一般我偏好使用 B 的方式,因為 xhtml規格中,我記得有定義
屬性的值以 " quote。
另外,像你這邊有另外一種寫法可以參考:
------------------------------------------------------
<?php
// $link =...
// ...
// 資料庫的連結. (略)
?>
<!-- 以下為原本用 echo 輸出 html 的內容 -->
<table summary="教師資料">
<colgroup span="1"></colgroup>
<!-- 略 -->
<thead>
<tr>
<th scope="col">product_id</th>;
<!-- 略 -->
<!-- 重點來了 :) -->
<!-- 如果 php.ini 的 short_open_tag = off
那麼底下用 <? 的地方需改為 <?php
<?= 則改為 <?php echo ..
這麼一來有點囉唆,所以還是開一下吧 :P -->
<? while($row = mysql_fetch_array($result)): ?>
<tr>
<td><?=$row['product_id']?></td>
<td><?=$row['product_name']?></td>
<!-- 略 -->
</tr>
<? endwhile ?>
</tbody>
</table>
<?php
// 回到 php 中
mysql_free_result($result);
?>
------------------------------------------------------
用上述的寫法有幾個好處:
1. 得到的 HTML是原生的(省掉一些針對 html 原始碼的縮排和脫序)
2. 即便 HTML和 PHP混在一起,還是能使程式碼簡潔
3. HTML的內容如果很複雜,如此編寫方式相對方便檢視除錯
將輸出與程式邏輯分開,有助於提升整體的可維護性。如果曾經
接手別人寫的案子、或維護自己幾個月前寫的程式碼,應該會感
謝前頭有人種樹 XD
現在 Web Application 流行使用 Model-View-Control 的開發方
式。上述例子的編寫方式,其實隱含著相同的精神。
: code
: -----------------------------
: <?php
: $link = mysql_pconnect("localhost", "xxxxxx", "");
: mysql_select_db("shopping") or die("無法選擇資料庫");
: $query = "SELECT * FROM product";
: $result = mysql_query($query) or die("無法送出" . mysql_error( ));
: echo "<table summary="教師資料">";
: echo "<colgroup span="1"></colgroup>";
: echo "<colgroup span="2"></colgroup>";
: echo "<colgroup span="3"></colgroup>";
: echo "<colgroup span="4"></colgroup>";
: echo "<colgroup span="5"></colgroup>";
: echo "<colgroup span="6"></colgroup>";
: echo "<thead>";
: echo "<tr>";
: echo "<th scope="col">product_id</th>";
: echo "<th scope="col">product_name</th>";
: echo "<th scope="col">price</th>";
: echo "<th scope="col">category</th>";
: echo "<th scope="col">product_family</th>";
: echo "<th scope="col">product_class</th>";
: echo "</tr>";
: echo "</thead>";
: echo "<tbody>";
: while ( $row = mysql_fetch_array($result) ){
: echo "<tr>";
: echo "<td scope="row">".$row['product_id']."</td>";
: echo "<td scope="row">".$row['product_name']."</td>";
: echo "<td scope="row">".$row['price']."</td>";
: echo "<td scope="row">".$row['category']."</td>";
: echo "<td scope="row">".$row['product_family']."</td>";
: echo "<td scope="row">".$row['product_class']."</td>";
: echo "</tr>";
: }
: echo "</tbody></table>";
: mysql_free_result($result);
: ?>
--
「640K ought to be enough for anybody.!」
- Bill Gates -
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.119.199.121
→ foxzgerald:PS: <!-- 這是 html 中所使用的註解 --> 12/17 15:20
推 superGA:我覺得用here document就差不多了 這樣寫有點累 12/17 15:31
→ superGA:這種寫法很接近用Smarty了 不如直接用Smarty 12/17 15:32
推 foxzgerald:看規模吧:P 若只是一兩千行的小作業,我覺得應該還過意 12/17 15:43
→ foxzgerald:得去。而且 Smarty的 cache tunning如果沒弄好,網頁大 12/17 15:47
→ foxzgerald:會慢到一種稍微不耐煩的境界 XD 12/17 15:48
推 NUKnigel:謝謝^^"...因為學過C就直接想實做,果然會出錯( ̄□ ̄|||) 12/17 16:11
推 NUKnigel:下面第二個重點~也受益良多^^這樣寫直觀多了~再次感謝 12/17 16:17
推 foxzgerald:如果輸出內容需要邏輯控制. 用 here document 也會挺繁 12/18 14:31
→ foxzgerald:瑣的;這種寫法和 smarty中的控制標籤類似,但是因為 12/18 14:32
→ foxzgerald:smarty 最後還是把它解析成 php .. 而這種方式是直接以 12/18 14:34
→ foxzgerald:php 控制,理論上效能應該會比較好一點 12/18 14:34