这个问题已经在这里有一个答案:
- “通知:未定义变量”,“注意:未定义指数”和“通知:未定义偏移”使用PHP 28的答案
我想重新学习一些PHP基础知识制作一个简单的登录脚本,但我得到之前(我一点点在一年前由相同的脚本,从来没有这样的错误,我还没有收到一个错误。我简化了代码不亚于我可以测试,看看哪些领域是有问题的,这里的问题:
<?php
$user = $_POST["username"];
if($user != null)
{
echo $user;
echo " is your username";
}
else
{
echo "no username supplied";
}
?>
下面这段代码工作正常,当我发送一个变量到脚本,但是当没有变量提供它吐出了一个错误。 从理论上讲,因为如果没有用户名/密码供应则预计错误,这将是罚款。 我会检查,以确保这之前的代码发送到剧本,但是我害怕,不知怎的,一个空字符串可能泄漏通过吐出一些未知的错误。 这里是我的错误:
( ! ) Notice: Undefined index: username in C:\wamp\www\verify_login.php on line 2
Call Stack
Time Memory Function Location
1 0.0003 668576 {main}( ) ..\verify_login.php:0
没有用户名供应
正如你所看到的代码注册,没有变量被提供,但它给了,而且我认为错误意味着未找到一个变量是一个预期或者类似的东西。 是否有人可以澄清这对我?
Answer 1:
在PHP中,这从未被设置变量或数组元素是从一个其值是不同的null
; 试图访问这种取消设置值是一个运行时间错误。
这就是你正在运行的产品分为:数组$_POST
没有在任何关键要素"username"
,所以解释中止你的程序它曾经获取到无效测试之前。
幸运的是,你可以测试一个变量或数组元素的存在实际上不试图对其进行访问; 这就是特殊的运算符是什么isset
做:
if (isset($_POST["username"]))
{
$user = $_POST["username"];
echo $user;
echo " is your username";
}
else
{
$user = null;
echo "no username supplied";
}
这看起来将在完全相同的方式为你的代码炸毁,当PHP试图获得价值$_POST["username"]
以作为参数传递给函数isset()
。 然而, isset()
是不是一个真正的功能可言,但评价阶段之前公认的特殊语法,所以对于价值的存在实际上不试图检索它的PHP解释器检查。
另外值得一提的是,由于运行时错误去,丢失的数组元素被看作是小(分配E_NOTICE
级)。 如果更改error_reporting
级别,以便通知被忽略,因为写的,与已尝试数组访问返回原来的代码将实际工作null
。 但是,这被认为是不好的做法,特别是对生产代码。
附注:PHP确实串插,所以echo
文中陈述if
块可以组合成一个:
echo "$user is your username";
Answer 2:
使用:
if (isset($_POST['user'])) {
//do something
}
但是,你也许应该使用一些更适当的验证。 尝试一个简单的正则表达式或Zend框架或Symfony的坚如磐石的实现。
http://framework.zend.com/manual/en/zend.validate.introduction.html
http://symfony.com/doc/current/book/validation.html
甚至内置过滤器扩展:
http://php.net/manual/en/function.filter-var.php
永远不要相信用户的输入,是聪明的。 不要相信任何东西。 始终确保您收到什么是真正你所期望的。 如果它应该是一个数,确保它的一个数字。
许多改进的代码:
$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
}
消毒和验证。
Answer 3:
您的代码假设的东西存在:
$user = $_POST["username"];
PHP是让你知道,有是在没有“用户名” $_POST
阵列。 在这种情况下,你会更安全检查,看是否值isset()
试图访问它之前:
if ( isset( $_POST["username"] ) ) {
/* ... proceed ... */
}
或者,你可以HI-插孔||
运营商分配默认:
$user = $_POST["username"] || "visitor" ;
只要用户名不是falsy值,你可以考虑这个方法很可靠。 到默认分配一个更安全的途径是使用三元运算符:
$user = isset( $_POST["username"] ) ? $_POST["username"] : "visitor" ;
Answer 4:
取而代之的isset()
可以使用更短的东西越来越静音的错误,这是@$_POST['field']
然后,如果现场没有设置,你会得到不打印页面上的错误。
Answer 5:
在此之前PHP 5.2.0及以上,你应该使用filter_input()
这是特别创建的,要得到一个特定的外部用户输入,如获得通过名哨或Cookie变量和可选过滤器,以避免任何XSS /注入攻击你现场。 例如:
$user = filter_input(INPUT_POST, 'username');
您可以使用INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER,或INPUT_ENV之一。
通过使用可选的第三个参数,则可以通过各种扩展它的过滤器 (用于验证 , 消毒 , 过滤或其他 ),例如FILTER_SANITIZE_SPECIAL_CHARS
, FILTER_SANITIZE_ENCODED
等
例如:
<?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>";
?>
语法是:
混合filter_input
(INT $型,字符串$变量名[摘要$滤波器= FILTER_DEFAULT [,混合$选项]])
(PHP 5> = 5.2.0,PHP 7)
另请参阅: 为什么是更好地使用filter_input()?
Answer 6:
当你说:
$user = $_POST["username"];
你问PHP解释器来分配$user
的价值$_POST
具有的键(或指数)阵列username
。 如果它不存在,PHP会抛出一个合适的。
使用isset($_POST['user'])
来检查该变量的存在:
if (isset($_POST['user'])) {
$user = $_POST["username"];
...
Answer 7:
试试这个:
我用这个无处不在那里有一个$ _ POST请求。
$username=isset($_POST['username']) ? $_POST['username'] : "";
这只是一个短暂的手布尔值,如果isset将其设置为$ _POST [“用户名”],如果没有,那么它会为它设置为空字符串。
用法示例:
if($username===""){ echo "Field is blank" } else { echo "Success" };
Answer 8:
我知道这是旧的文章,但有人能帮助:
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
字符串,你可以定义一些默认的值,如果POST未激活或内容不存在。
echo "<h1>".POST("title", "Stack Overflow")."</h1>";
用它玩。
Answer 9:
尝试
if(isset($_POST['username']))
echo $_POST['username']." is your username";
else
echo "no username supplied";
Answer 10:
相关的问题: 什么是访问未知的数组元素,而不会产生PHP通知的最佳方式?
从上面的使用问题的答案,你可以放心地得到$ _POST的值,如果没有该键不存在产生PHP通知。
echo _arr($_POST, 'username', 'no username supplied');
// will print $_POST['username'] or 'no username supplied'
文章来源: Undefined index with $_POST [duplicate]