Php 未定义的带有$\u POST的索引
我正在尝试重新学习一些PHP基础知识,以创建一个简单的登录脚本,但是我遇到了一个以前从未遇到过的错误(我在一年多前创建了相同的脚本,但从未出现过此错误。我尽可能简化代码,以测试哪个方面存在问题,问题如下:Php 未定义的带有$\u POST的索引,php,login,undefined-index,Php,Login,Undefined Index,我正在尝试重新学习一些PHP基础知识,以创建一个简单的登录脚本,但是我遇到了一个以前从未遇到过的错误(我在一年多前创建了相同的脚本,但从未出现过此错误。我尽可能简化代码,以测试哪个方面存在问题,问题如下: <?php $user = $_POST["username"]; if($user != null) { echo $user; echo " is your username"; } else { echo "no username supplied"; }
<?php
$user = $_POST["username"];
if($user != null)
{
echo $user;
echo " is your username";
}
else
{
echo "no username supplied";
}
?>
没有提供用户名
正如您所看到的,代码寄存器没有提供任何变量,但它给出了一个错误,我认为这意味着没有找到一个变量,或者应该找到一个或类似的变量。有人能帮我澄清一下吗?使用:
if (isset($_POST['user'])) {
//do something
}
但您可能应该使用一些更合适的验证,尝试一个简单的正则表达式或Zend Framework或Symfony的坚如磐石的实现
甚至内置过滤器扩展:
永远不要相信用户的输入,要聪明。不要相信任何东西。始终确保你收到的是你真正期望的。如果它应该是一个数字,请确保它是一个数字
改进了很多的代码:
$user = filter_var($_POST['user'], FILTER_SANITIZE_STRING);
$isValid = filter_var($user, FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => "/^[a-zA-Z0-9]+$/")));
if ($isValid) {
// do something
}
清理和验证。在PHP中,从未设置的变量或数组元素与值为
null
的变量或数组元素不同;尝试访问此类未设置的值是一个运行时错误
这就是您遇到的问题:数组$\u POST
在键的“username”
处没有任何元素,因此解释器在到达空性测试之前中止您的程序
幸运的是,您可以测试变量或数组元素是否存在,而无需实际尝试访问它;这就是特殊运算符isset
所做的:
if (isset($_POST["username"]))
{
$user = $_POST["username"];
echo $user;
echo " is your username";
}
else
{
$user = null;
echo "no username supplied";
}
当PHP试图将$\u POST[“username”]
的值作为参数传递给函数isset()
时,它看起来会以与代码完全相同的方式爆炸实际上根本不是一个函数,而是在求值阶段之前识别的特殊语法,因此PHP解释器检查值是否存在,而不实际尝试检索它
还值得一提的是,随着运行时错误的发生,缺少的数组元素被认为是次要的(分配了E_NOTICE
级别)。如果更改错误报告
级别以忽略通知,则原始代码实际上将按编写的方式工作,尝试的数组访问返回null
。但这被视为不正确的做法,尤其是对于生产代码
旁注:PHP执行字符串插值,因此if
块中的echo
语句可以组合成一个:
echo "$user is your username";
当你说:
$user = $_POST["username"];
您要求PHP解释器为$user
分配$\u POST
数组的值,该数组的键(或索引)为username
。如果它不存在,PHP会抛出一个匹配
使用isset($\u POST['user'])
检查该变量是否存在:
if (isset($_POST['user'])) {
$user = $_POST["username"];
...
您的代码假定存在以下内容:
$user = $_POST["username"];
PHP让您知道$\u POST
数组中没有“用户名”。在这种情况下,在尝试访问该值之前,您可以更安全地检查值isset()
:
if ( isset( $_POST["username"] ) ) {
/* ... proceed ... */
}
或者,您也可以将|
操作符高插以指定默认值:
$user = $_POST["username"] || "visitor" ;
只要用户的名字不是冒牌值,你可以认为这个方法非常可靠。默认赋值的一个更安全的途径是使用三元运算符:
$user = isset( $_POST["username"] ) ? $_POST["username"] : "visitor" ;
试一试
相关问题: 使用上述问题的答案,如果密钥不存在,您可以安全地从$\u POST获得一个值,而无需生成PHP通知
echo _arr($_POST, 'username', 'no username supplied');
// will print $_POST['username'] or 'no username supplied'
echo "<h1>".POST("title", "Stack Overflow")."</h1>";
您可以使用较短的设置来静音错误,而不是isset()
。它是@$\u POST['field']
。然后,如果未设置字段,您将不会在页面上打印错误。尝试以下操作:
我在任何有$u POST请求的地方都使用它
$username=isset($_POST['username']) ? $_POST['username'] : "";
这只是一个简单的布尔值,如果设置为$_POST['username'],则将其设置为空字符串
用法示例:
if($username===""){ echo "Field is blank" } else { echo "Success" };
在PHP 5.2.0及更高版本之前,您应该使用它来获取特定的外部用户输入,例如按名称获取get、post或cookie变量,并选择性地对其进行过滤,以避免对您的站点进行任何XSS/注入攻击。例如:
$user = filter_input(INPUT_POST, 'username');
<?php
$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "You have searched for $search_html.\n";
echo "<a href='?search=$search_url'>Search again.</a>";
?>
您可以使用INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER或INPUT_ENV中的一种
通过使用可选的第3个参数,您可以通过各种(for,or)对其进行扩展,例如FILTER\u SANITIZE\u SPECIAL\u CHARS
,FILTER\u SANITIZE\u ENCODED
,等等
例如:
$user = filter_input(INPUT_POST, 'username');
<?php
$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "You have searched for $search_html.\n";
echo "<a href='?search=$search_url'>Search again.</a>";
?>
语法是:
混合过滤器\输入(int$类型,字符串$变量\名称[,int$过滤器=过滤器\默认值[,混合$选项])
(PHP5>=5.2.0,PHP7)
另请参见:我知道这是一篇老文章,但有人可以提供帮助:
function POST($index, $default=NULL){
if(isset($_POST[$index]))
{
if(!empty(trim($_POST[$index])))
return $_POST[$index];
}
return $default;
}
上面的代码是我在任何地方使用的基本POST函数。在这里你可以放置过滤器、正则表达式等。它更快更干净。我的高级POST函数更复杂,难以接受和检查数组、字符串类型、默认值等。让我们来想象一下
您可以通过以下方式轻松检查用户名:
$username = POST("username");
if($username!==null){
echo "{$username} is in the house.";
}
此外,我还添加了$default
字符串,如果帖子未激活或内容不存在,您可以定义一些默认值
echo _arr($_POST, 'username', 'no username supplied');
// will print $_POST['username'] or 'no username supplied'
echo "<h1>".POST("title", "Stack Overflow")."</h1>";
echo.POST(“标题”、“堆栈溢出”);
玩它。为表单发布代码。它看起来像_post[username]这不是挫折,因为如果你做的都是正确的,你只是在HTML页面方法中命名为“get”,并且你用“$\u POST”捕捉参数。你需要将其重命名为$\u get。仅此而已。这在很多级别上都是错误的……DownVorters&@vinnylinux:为什么它是错误的?可能是因为它不会产生OP想要的输出[username]是您的用户名(如果这很重要的话,我不是投反对票的人,所以原因可能不同)@