2015-02-10 72 views
0

我目前正在學習使用Murach(該書,2010年出版)的php。一項所述的鍛鍊具有這些語句:Php:關於呼應空變量

<label>Investment Amount:</label> <input type="text" name="investment" 
value="<?php echo $investment; ?>"/><br /> 
<label>Yearly Interest Rate:</label> <input type="text" name="interest_rate" 
value="<?php echo $interest_rate; ?>"/><br /> 
<label>Number of Years:</label> <input type="text" name="years" 
value="<?php echo $years; ?>"/><br /> 

整個要點是,的值與回波語句具有在第一未分配的任何值的變量以上屬性,因此文本框被認爲是根據空這本書。但稍後在練習中,同一頁面將再次被調用,變量現在將具有值,因此它們將被打印在文本框中。以下是本書的解釋:

這些回顯語句顯示變量,其中包含用戶以前在窗體中輸入的數據。 雖然第一次顯示此頁面 ,但這些變量將不包含數據,因此 文本框將爲空

然而,一旦運行該程序的第一次,在文本框實際上不是空的:

These textboxes are supposed to be empty the first time around says the book

由於這本書在5年前出版的我猜他們要麼工作,然後但現在不要,或者代碼本身是錯誤的。任何人都可以告訴我,如果這只是過時的代碼,或者它真的打破了開始?而我該如何解決它以使用空變量獲得空文本框的預期效果?

謝謝!

+0

您可以設置error_reporting,以便不顯示此通知: [php docs](http://php.net/manual/en/function.error-reporting.php) like:error_reporting(E_ALL& 〜E_NOTICE); – 2015-02-10 08:57:46

+2

@Igoel這是一個可怕的解決方案,你應該總是解決錯誤,而不是忽略他們 – Gal 2015-02-10 08:59:25

+0

「可怕」是有點苛刻說.....不是最好的確定,但我認爲當你正在學習新的東西時它更好實現的東西;) – 2015-02-10 09:03:04

回答

5

你應該檢查它們是否被定義。

<?php echo (isset($years)) ? $years : ''; ?> 

另外,如果你關掉你的php.ini的display_errors不會出現這種情況,但是這將是一個不明智的解決方案

2

編程中最重要的方法是用這種方式編程,別人也可以理解它。因此,在這種情況下,如果你打算使用這個變量,聲明和評論之前它:

$investment = ''; // Future post investement variable, on startup empty 
$interest_rate = ''; // Future interest_rate variable, on startup empty 
$years = ''; // Future years variable, on startup empty 

在這種情況下,每個人都一定每個變量是什麼,以及它包含的內容。並且不會發生未定義的錯誤。


另請注意,關閉警告顯示,如評論和答案中所述,不是一個好主意。 當你寫出漂亮的代碼時,不應該顯示警告。關閉它當然不是解決方案。

唯一必須做的是關閉生產中的警告和錯誤,不要給黑客任何可能的線索,即使出了問題。並將它們保存在某種錯誤記錄器中。


如果你打算使用後這個變量,我建議做這樣的事情:

$investement = (isset($_POST['investment'])) ? safety($_POST['investment']) : ''; 

如果安全是你自己的安全檢查功能(除去特殊字符,防止MySQL的注射,如果你計劃回顯/存儲數據)。這與寫作相同:

if (isset($_POST['investment'])) { 
    $investement = safety($_POST['investment']); 
} 
else { 
    $investement = ''; // init value 
} 
+0

嗨Jacek,這些變量實際上是在另一個PHP頁面中分配的值,然後使用include函數調用這個頁面。這本書試圖說,如果你迴應一個沒有賦值的變量,文本框應該是空的。他們甚至有圖片顯示文本框爲空。我只是好奇他們是否犯了錯,或者過去真的是這樣。使用的版本是5.3 – codehowser 2015-02-10 09:11:22

+0

Thx的評論。包括記事本中的複製粘貼等作品。因此,如果這些變量在包含文件之前是真正聲明的,那麼您不應該得到任何錯誤或警告。也許包括不起作用?由於5.3沒有任何改變,所以它應該像書中所描述的那樣工作:)。 – 2015-02-10 09:13:21

+1

我想你可能在最後忘了分號? $ investment =''; – drooh 2016-02-17 20:38:00

0

A通知它是一個通知,它不會阻止您的代碼執行。當然,如果生成通知的變量/代碼在其他地方使用,則可能會遇到麻煩。

所以,這本書是有點正確的,但我會說,這是不好的做法,因爲你應該總是瞄準有0個警告/通知,這意味着你應該做的@Swifty提到,並檢查變量是否設置。