2015-09-29 45 views
1

我通過從php視圖文件中加載動態生成的html來創建電子郵件,但是當包含以下html代碼似乎執行兩次。
<table background="#000">
(我甚至不知道,如果background="#000"屬性是有效的,但不應該在這方面重要)爲什麼打印某個字符串會導致代碼執行兩次?

下面是一個簡單的例子來說明這個問題。

$body = '<table background="#000">'; 

print $body; 

$handle = fopen('error.log', 'a'); 
fwrite($handle, '########################'.date('Y-m-d H:i:s')."########################\n".$body."\n\n"); 
fclose($handle); 

這將在日誌文件中生成2行文本(它應該只生成1)。
(我用a作爲fopen第二個參數,使得第二寫入附加該error.log文件將不得不重新加載頁面之前手動刪除。)

如果print $body;被註釋掉或然後刪除日誌文件只有1行寫入它。

如果我改變#000任何非十六進制值(如紅色),或更改table到別的(如DIV),或者如果我改變background屬性爲任何其他日誌文件只有1線被寫入它。

我已經在運行PHP 5.6.12和5.5.9以及Apache 2.4.7和2.4.16的2個不同服務器上嘗試了這一點。

+0

按我期望的那樣工作 –

+0

我只是在第三臺服務器上嘗試了相同的代碼,得到了相同的結果。但是,我注意到在'background'屬性後面添加'style =「background:#000」'會導致它正常工作。 – nickradford

+1

你期望一個日期,一個換行符,''table background =「#000」>'和每次執行2個換行符 - 正確嗎? –

回答

4

TL; DR:瀏覽器將background="#000"作爲背景圖像屬性,使用相對URL爲#000作爲圖像的源,導致頁面加載兩次。

當瀏覽器發出請求到PHP文件時,會收到以下回:

<table background="#000"> 

瀏覽器試圖通過清除它,把它變成這個解析畸形的HTML文檔:

<html> 
    <head></head> 
    <body> 
    <table background="#000"></table> 
    </body> 
</html> 

沒有什麼令人興奮的或意外的。有趣的是table標籤中的background屬性。如果您檢查在Chrome的devtools頁面,你看一下表的風格,你會發現,該表具有以下CSS應用(如果該頁面位於http://example.com/index.html

background-image: url('http://example.com/index.html#000'); 

事實證明,背景屬性以前是在table標籤(其中幾個人)有效,但至今已取得obsolete in the HTML5 spec

tabletheadtbodytfoottrtdth元素具有設置爲非空值的背景屬性,則預計將相對於該元素解析新值,並且如果這是成功的,則用戶代理需要將該屬性視爲表示提示設置該元素的'background-image'屬性爲生成的絕對URL。

HTML5 Spec, Section 10.3.9 (Tables)

正在發生的事情是,#000被視爲相對URL,所以瀏覽器正在完全相同的網址第二請求(在網絡上發送不包含哈希的URL串)。

+0

很好的捕獲。自從我看過「背景」以來,已經很長時間了,更不用說考慮了。 – miken32

相關問題