Php:关于回显空变量
Php: about echoing a null variable
我目前正在使用 Murach(该书于 2010 年出版)学习 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 />
整个要点是上面带有 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.
然而,在 运行 第一次运行该程序时,文本框实际上不是空的:
由于这本书是 5 年前出版的,所以我猜测它们当时可以工作但现在不工作,或者代码本身是错误的。谁能告诉我这只是过时的代码还是一开始就真的坏了?我该如何修复它以获得使用空变量的空文本框的预期效果?
谢谢!
您应该检查它们是否已定义。
即
<?php echo (isset($years)) ? $years : ''; ?>
此外,如果您在 php.ini 中关闭 display_errors,则不会发生这种情况,但这是一个不明智的解决方案
最重要的编程方式是用这样一种方式编程,让别人也能理解它。所以在那种情况下,如果你打算使用这个变量,那么在之前声明并注释它:
$investment = ''; // Future post investement variable, on startup empty
$interest_rate = ''; // Future interest_rate variable, on startup empty
$years = ''; // Future years variable, on startup empty
在那种情况下,每个人都确定每个变量是什么,以及它将包含什么。并且不会出现未定义的错误。
另请注意,如评论和答案中所述,关闭警告显示不是一个好主意。 当您编写好的代码时,不应显示任何警告。而关闭它们当然不是解决办法。
唯一必须做的就是关闭生产中的警告和错误,即使出现问题也不会给黑客任何可能的线索。并将它们保存在某种错误记录器中。
如果您打算将此变量与 post 一起使用,我建议您这样做:
$investement = (isset($_POST['investment'])) ? safety($_POST['investment']) : '';
其中 safety 是你自己的安全检查功能(删除特殊字符,如果你打算回显/存储数据,则防止 mysql 注入)。等同于写:
if (isset($_POST['investment'])) {
$investement = safety($_POST['investment']);
}
else {
$investement = ''; // init value
}
通知就是通知,它不会阻止您的代码执行。当然,如果生成通知的变量/代码用于其他地方,您可能 运行 会遇到麻烦。
所以,这本书有点对,但我会说这是一种不好的做法,因为你应该始终以 0 条警告/通知为目标,这意味着你应该按照@Swifty 提到的那样去做,并检查变量是否是设置。
我目前正在使用 Murach(该书于 2010 年出版)学习 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 />
整个要点是上面带有 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.
然而,在 运行 第一次运行该程序时,文本框实际上不是空的:
由于这本书是 5 年前出版的,所以我猜测它们当时可以工作但现在不工作,或者代码本身是错误的。谁能告诉我这只是过时的代码还是一开始就真的坏了?我该如何修复它以获得使用空变量的空文本框的预期效果?
谢谢!
您应该检查它们是否已定义。
即
<?php echo (isset($years)) ? $years : ''; ?>
此外,如果您在 php.ini 中关闭 display_errors,则不会发生这种情况,但这是一个不明智的解决方案
最重要的编程方式是用这样一种方式编程,让别人也能理解它。所以在那种情况下,如果你打算使用这个变量,那么在之前声明并注释它:
$investment = ''; // Future post investement variable, on startup empty
$interest_rate = ''; // Future interest_rate variable, on startup empty
$years = ''; // Future years variable, on startup empty
在那种情况下,每个人都确定每个变量是什么,以及它将包含什么。并且不会出现未定义的错误。
另请注意,如评论和答案中所述,关闭警告显示不是一个好主意。 当您编写好的代码时,不应显示任何警告。而关闭它们当然不是解决办法。
唯一必须做的就是关闭生产中的警告和错误,即使出现问题也不会给黑客任何可能的线索。并将它们保存在某种错误记录器中。
如果您打算将此变量与 post 一起使用,我建议您这样做:
$investement = (isset($_POST['investment'])) ? safety($_POST['investment']) : '';
其中 safety 是你自己的安全检查功能(删除特殊字符,如果你打算回显/存储数据,则防止 mysql 注入)。等同于写:
if (isset($_POST['investment'])) {
$investement = safety($_POST['investment']);
}
else {
$investement = ''; // init value
}
通知就是通知,它不会阻止您的代码执行。当然,如果生成通知的变量/代码用于其他地方,您可能 运行 会遇到麻烦。
所以,这本书有点对,但我会说这是一种不好的做法,因为你应该始终以 0 条警告/通知为目标,这意味着你应该按照@Swifty 提到的那样去做,并检查变量是否是设置。