我目前正在使用Murach学习php(该书于2010年出版)。其中一个练习有这些陈述:
<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 />
整个要点是上面的echo属性值属性首先没有赋值任何值的变量,因此根据本书,文本框应该是空的。但是稍后在练习中,将再次调用同一页面,变量现在将具有值,因此它们将打印在文本框中。这是本书的解释:
这些echo语句显示包含数据的变量 用户先前已进入表单。 第一次这样 但是,显示页面,这些变量不会包含数据 文本框将为空。
但是,在第一次运行程序时,文本框实际上不是空的:
由于这本书于5年前出版,我猜他们当时工作但现在没有,或者代码本身是错误的。任何人都可以告诉我这是否只是过时的代码或者它真的打破了吗?我如何修复它以使用空变量获得空文本框的预期效果?
谢谢!
答案 0 :(得分:5)
您应该检查它们是否已定义。
即
<?php echo (isset($years)) ? $years : ''; ?>
此外,如果您关闭php.ini中的display_errors,这将不会发生,但这将是一个不明智的解决方案
答案 1 :(得分: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
}
答案 2 :(得分:0)
通知就是它,通知,它不会阻止你的代码执行。当然,如果生成通知的变量/代码在别处使用,你可能会遇到麻烦。
所以,这本书有点正确,但我会说这是不好的做法,因为你应该总是瞄准0警告/通知,这意味着你应该像@Swifty一样提到并检查是否变量已设置。