关于echo:Php:关于回显一个null变量

Php: about echoing a null variable

我目前正在使用Murach学习php(该书于2010年出版)。 其中一个练习有这些陈述:

1
2
3
4
5
6
<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语句具有的变量最初没有被赋值任何值,因此根据本书,文本框应该是空的。 但是稍后在练习中,将再次调用同一页面,变量现在将具有值,因此它们将打印在文本框中。 这是本书的解释:

These echo statements display the variables that contain the data that
the user has previously entered into the form. The first time this
page is displayed, though, these variables won’t contain data so the
text boxes will be empty.

但是,在第一次运行程序时,文本框实际上不是空的:

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

自从5年前出版这本书以来,我猜他们当时工作但现在没有,或者代码本身是错误的。 任何人都可以告诉我这是否只是过时的代码或者它真的打破了吗? 我如何修复它以使用null变量获得空文本框的预期效果?

谢谢!


您应该检查它们是否已定义。

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

此外,如果您关闭php.ini中的display_errors,这将不会发生,但这将是一个不明智的解决方案


最重要的编程方式是以这样的方式编程,其他人也可以理解它。因此,在这种情况下,如果您打算使用此变量,请在之前声明并注释:

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

在这种情况下,每个人都确定每个变量是什么,以及它将包含什么。并且不会发生未定义的错误。

另请注意,如评论和答案中所述,关闭警告显示并不是一个好主意。编写好的代码时,不应显示任何警告。关闭它们当然不是解决方案。

唯一必须做的就是关闭生产中的警告和错误,即使出现问题也不要给黑客任何可能的线索。并将它们保存在某种错误记录器中。

如果你计划在帖子中使用这个变量,我建议你这样做:

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

安全性是您自己的安全检查功能(删除特殊字符,如果您计划回显/存储数据,则阻止mysql注入)。它与写作相同:

1
2
3
4
5
6
if (isset($_POST['investment'])) {
    $investement = safety($_POST['investment']);
}
else {
    $investement = ''; // init value
}


通知就是它,通知,它不会阻止您的代码执行。当然,如果生成通知的变量/代码在别处使用,则可能会遇到麻烦。

所以,这本书有点正确,但我会说这是不好的做法,因为你应该始终瞄准有0个警告/通知,这意味着你应该像@Swifty一样提到并检查变量是否已设置。