使用PHP“注意:未定义的变量”,“注意:未定义的索引”和“通知:未定义的偏移量”

时间:2010-11-23 21:26:54

标签: php arrays variables warnings undefined-index

我正在运行PHP脚本,并继续收到如下错误:

  

注意:未定义的变量:第10行的C:\ wamp \ www \ mypath \ index.php中的my_variable_name

     

注意:第11行的未定义索引:my_index C:\ wamp \ www \ mypath \ index.php

第10行和第11行看起来像这样:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

这些错误消息的含义是什么?

他们为什么突然出现?我以前使用这个脚本多年,我从来没有遇到任何问题。

如何修复它们?

  

这是一般参考问题,供人们重复链接,而不必一遍又一遍地解释问题。我认为这是必要的,因为关于这个问题的大多数现实世界的答案都非常具体。

     

相关元讨论:

     

29 个答案:

答案 0 :(得分:985)

注意:未定义的变量

来自PHP Manual

的广阔智慧
  

在将一个文件包含到另一个使用相同变量名的文件的情况下,依赖于未初始化变量的默认值是有问题的。它也是一个主要的security risk,其中register_globals已启用。如果使用未初始化的变量,则会发出E_NOTICE级错误,但是在未初始化的数组中附加元素的情况下不会发生错误。 isset()语言构造可用于检测变量是否已经初始化。另外,更理想的是empty()的解决方案,因为如果未初始化变量,它不会生成警告或错误消息。

来自PHP documentation

  

如果变量不存在,则不会生成警告。这意味着       empty()基本上简洁等效于!isset($ var)|| $ VAR      == false

这意味着您只能使用empty()来确定变量是否已设置,此外它会根据以下内容检查变量00.0,{{1} },"""0"nullfalse

示例:

[]

3v4l.org online PHP editor

中测试上述代码段

虽然PHP不需要变量声明,但它确实推荐它,以避免一些安全漏洞或错误,人们会忘记为稍后将在脚本中使用的变量赋值。 PHP在未声明变量的情况下所做的是发出一个非常低级别的错误,$o = []; @$var = ["",0,null,1,2,3,$foo,$o['myIndex']]; array_walk($var, function($v) { echo (!isset($v) || $v == false) ? 'true ' : 'false'; echo ' ' . (empty($v) ? 'true' : 'false'); echo "\n"; }); ,默认情况下甚至没有报告,但在开发期间是手动advises to allow

解决问题的方法:

  1. 推荐:声明您的变量,例如当您尝试将字符串附加到未定义的变量时。或者使用isset() / !empty()检查它们是否在引用它们之前被声明,如:

    E_NOTICE

    从PHP 7.0开始,这已变得更加清晰,现在您可以使用null coalesce operator

    //Initializing variable
    $value = ""; //Initialization value; Examples
                 //"" When you want to append stuff later
                 //0  When you want to add numbers later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] : '';
    
  2. 为E_NOTICE设置custom error handler并将消息重定向远离标准输出(可能是日志文件):

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  3. 禁止报告E_NOTICE。仅排除set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT) 的快速方法是:

    E_NOTICE
  4. 使用@ operator

  5. 取消错误

    注意:强烈建议只执行第1点。

    注意:未定义的索引/未定义的偏移量

    当您(或PHP)尝试访问数组的未定义索引时,会出现此通知。

    解决问题的方法:

    1. 在访问索引之前检查索引是否存在。为此,您可以使用isset()array_key_exists()

      error_reporting( error_reporting() & ~E_NOTICE )
      
    2. 语言构造list()在尝试访问不存在的数组索引时可能会生成此内容:

      //isset()
      $value = isset($array['my_index']) ? $array['my_index'] : '';
      //array_key_exists()
      $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
      
    3. 两个变量用于访问两个数组元素,但是只有一个数组元素,索引list($a, $b) = array(0 => 'a'); //or list($one, $two) = explode(',', 'test string'); ,所以这将生成:

        

      注意:未定义的偏移量:1

      0 / $_POST / $_GET变量

      使用$_SESSION$_POST$_GET时,通常会出现上述通知。对于$_SESSION$_POST,您只需在使用它们之前检查索引是否存在。对于$_GET,您必须确保会话以session_start()开头并且索引也存在。

      另请注意,所有3个变量均为superglobals且为大写。

      相关:

答案 1 :(得分:123)

试试这些

  

Q1:此通知表示$ varname不是   在当前范围内定义   脚本。

     

Q2:在使用任何可疑变量之前使用isset(),empty()条件效果很好。

// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? '';

// pre-7 PHP versions
$user_name = '';
if (!empty($_SESSION['user_name'])) {
     $user_name = $_SESSION['user_name'];
}

或者,作为一个快速而肮脏的解决方案:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);

关于会话的注意事项:

答案 2 :(得分:56)

错误显示@ operator

对于不需要的和冗余的通知,可以使用专用的@ operator到»隐藏«未定义的变量/索引消息。

$var = @($_GET["optional_param"]);
  • 通常不鼓励这样做。新人倾向于过度使用它。
  • 这对于应用程序逻辑中的深层代码非常不合适(忽略你不应该忽略的未声明的变量),例如:用于函数参数或循环。
  • 然而,isset?:??超级抑制有一个好处。通知仍然可以记录。一个人可能会复活@ - 隐藏的通知:set_error_handler("var_dump");
    • 另外,您不应习惯性地在初始代码中使用/推荐if (isset($_POST["shubmit"]))
    • 新人不会发现这样的错别字。它只是剥夺了PHP的注意事项。在验证功能后,仅添加@isset
    •   

      先解决原因。不是通知。

  • @主要适用于$_GET / $_POST输入参数,特别是,如果它们是可选的

由于这涵盖了大多数此类问题,让我们扩展最常见的原因:

$_GET / $_POST / $_REQUEST未定义的输入

  • 遇到未定义的索引/偏移时,首先要做的是检查拼写错误:
       $count = $_GET["whatnow?"];

    • 这是一个预期的密钥名称并出现在每个页面请求中吗?
    • 变量名数组指示在PHP中区分大小写。
  • 其次,如果通知没有明显原因,请使用var_dumpprint_r验证所有输入数组的内容:

    var_dump($_GET);
    var_dump($_POST);
    //print_r($_REQUEST);
    

    两者都会显示您的脚本是否使用正确或任何参数调用。

  • 替代或另外使用您的browser devtools (F12)并检查网络标签中的请求和参数:

    browser developer tools / network tab

    POST参数和GET输入将单独显示。

  • 对于$_GET参数,您还可以查看<{p}}中的QUERY_STRING

    print_r($_SERVER);
    

    PHP对超级全局的coalesce非标准参数名称有一些规则。 Apache也可能会进行一些重写。 您还可以查看提供的原始$_COOKIES和其他HTTP请求标头。

  • 更明显地看一下GET parameters的浏览器地址栏:

    http://example.org/script.php?id=5&sort=desc

    name=value问号后的?对是您的查询(GET)参数。因此,此网址只能生成$_GET["id"]$_GET["sort"]

  • 最后检查您的 <form><input> 声明,如果您需要参数但不接收参数。

    • 确保每个必需的输入都有<input name=FOO>
    • id=title=属性不够。
    • method=POST表格应该填充$_POST
    • method=GET(或将其遗漏)会产生$_GET个变量。
    • 表单也可以通过$ _GET提供action=script.php?get=param,并在$ _POST旁边提供剩余的method=POST字段。
    • 使用现代PHP配置(≥5.6),再次使用feasible变为$_REQUEST['vars'](不时髦),它会使GET和POST参数混淆。
  • 如果您正在使用mod_rewrite,那么您应该检查access.log并启用RewriteLog以找出缺少的参数。

$_FILES

  • 同样的健全性检查适用于文件上传和$_FILES["formname"]
  • 此外,请检查enctype=multipart/form-data
  • 以及method=POST声明中的<form>
  • 另请参阅:PHP Undefined index error $_FILES?

$_COOKIE

  • $_COOKIE数组永远不会在setcookie()之后填充,而只会在任何后续HTTP请求中填充。
  • 此外,他们的有效期超时,他们可能是对子域或个别路径的约束,用户和浏览器可以拒绝或删除它们。

答案 3 :(得分:41)

一般是因为“编程错误”,现在或以后都有可能出错。

  1. 如果是错误,请先对变量进行正确的赋值:$ varname = 0;
  2. 如果确实只是有时定义,请在使用之前测试它:if (isset($varname))
  3. 如果是因为拼写错误,请纠正
  4. 甚至可能会发出警告 PHP设置

答案 4 :(得分:38)

这意味着您正在测试,评估或打印尚未分配任何内容的变量。这意味着您要么输入错误,要么需要先检查变量是否已初始化为某些内容。检查您的逻辑路径,它可以设置在一个路径中,但不能设置在另一个路径中。

答案 5 :(得分:33)

我不想禁用通知,因为它有用,但是想避免太多打字。

我的解决方案就是这个功能:

function ifexists($varname)
{
  return(isset($$varname)?$varname:null);
}

因此,如果我想引用$ name和echo if exists,我只需写:

<?=ifexists('name')?>

对于数组元素:

function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

在页面中,如果我想引用$ _REQUEST ['name']:

<?=ifexistsidx($_REQUEST,'name')?>

答案 6 :(得分:25)

获取输入字符串的最佳方法是:

$value = filter_input(INPUT_POST, 'value');

这个单行几乎相当于:

if (!isset($_POST['value'])) {
    $value = null;
} elseif (is_array($_POST['value'])) {
    $value = false;
} else {
    $value = $_POST['value'];
}

如果您绝对需要字符串值,请执行以下操作:

$value = (string)filter_input(INPUT_POST, 'value');

答案 7 :(得分:24)

因为变量'$ user_location'没有被定义。如果您正在使用任何if循环来声明'$ user_location'变量,那么您还必须有一个else循环并定义相同的循环。例如:

$a=10;
if($a==5) { $user_location='Paris';} else { }
echo $user_location;

上面的代码会产生错误,因为if循环不满足,并且在else循环'$ user_location'中没有定义。仍然要求PHP回应变量。因此,要修改代码,您必须执行以下操作:

$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;

答案 8 :(得分:24)

回复“”他们为什么突然出现?我曾经使用这个脚本多年,我从来没有遇到任何问题。“

大多数网站在“显示所有错误,但不是'通知'和'已弃用'”的“默认”错误报告下运行是很常见的。这将在php.ini中设置并应用于服务器上的所有站点。这意味着示例中使用的那些“通知”将被抑制(隐藏),而其他错误(被认为更为关键)将被显示/记录。

另一个关键设置是可以隐藏错误(即display_errors设置为“off”或“syslog”)。

在这种情况下会发生的事情是,error_reporting被更改为也显示通知(根据示例)和/或设置已更改为display_errors屏幕(而不是压制它们/记录它们。)

他们为什么要改变?

显而易见/最简单的答案是有人在php.ini中调整了这些设置中的任何一个,或者PHP的升级版现在使用了之前的不同php.ini。这是第一个看的地方。

但是也可以在

中覆盖这些设置
  • .htconf(网络服务器配置,包括虚拟主机和子配置)*
  • 的.htaccess
  • 在php代码本身

其中任何一项也可能已经改变。

还有一个额外的复杂因素,即Web服务器配置可以启用/禁用.htaccess指令,因此如果.htaccess中的指令突然启动/停止工作,那么您需要检查它。

(。htconf / .htaccess假设您正在以apache身份运行。如果运行命令行,则不适用;如果运行IIS或其他Web服务器,则需要相应地检查这些配置)

<强>摘要

  • 检查php.ini中的error_reportingdisplay_errors php指令没有改变,或者你之前没有使用不同的php.ini。
  • 检查.htconf(或vhosts等)中的error_reportingdisplay_errors php指令没有更改
  • 检查.htaccess中的error_reportingdisplay_errors php指令未更改
  • 如果您在.htaccess中有指令,请检查.htconf文件中是否仍然允许它们
  • 最后检查你的代码;可能是一个无关的图书馆;查看是否已设置error_reportingdisplay_errors php指令。

答案 9 :(得分:19)

快速解决方法是在代码顶部将变量指定为null

$user_location = null;

答案 10 :(得分:15)

我曾经诅咒过这个错误,但提醒你逃避用户输入会很有帮助。

例如,如果您认为这是一个聪明的简写代码:

// Echo whatever the hell this is
<?=$_POST['something']?>

......再想一想!更好的解决方案是:

// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>

(我使用自定义html()功能来逃避角色,你的里程可能会有所不同)

答案 11 :(得分:13)

使用非常简单语言
错误的是你使用的变量$user_location不是你之前定义的,它没有任何值所以我建议您声明此变量 之前使用,例如:


$user_location = '';

$user_location = 'Los Angles';
这是您可以面对的一个非常常见的错误。所以不要担心只声明变量和享受编码

答案 12 :(得分:13)

我一直使用自己有用的函数 exst()来自动声明变量。

您的代码将是 -

$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location);


/** 
 * Function exst() - Checks if the variable has been set 
 * (copy/paste it in any place of your code)
 * 
 * If the variable is set and not empty returns the variable (no transformation)
 * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var
 * @param  mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = "";
    if ( !isset($var)  || !$var ) {
        if (isset($default) && $default != "") $t = $default;
    }
    else  {  
        $t = $var;
    }
    if (is_string($t)) $t = trim($t);
    return $t;
}

答案 13 :(得分:13)

在PHP 7.0中,现在可以使用Null合并运算符:

echo "My index value is: " . ($my_array["my_index"] ?? '');

等于:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

PHP manual PHP 7.0

答案 14 :(得分:7)

为什么不保持简单?

<?php
error_reporting(E_ALL); // making sure all notices are on

function idxVal(&$var, $default = null) {
         return empty($var) ? $var = $default : $var;
  }

echo idxVal($arr['test']);         // returns null without any notice
echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice

?>

答案 15 :(得分:7)

为什么会发生这种情况?

随着时间的推移,PHP已经成为一种更加注重安全性的语言。默认情况下,以前关闭的设置现在处于打开状态。一个完美的示例是E_STRICT,默认情况下从PHP 5.4.0开启。

此外,根据PHP文档,默认情况下,php.ini中禁用E_NOTICE。 PHP文档推荐turning it on for debugging purposes。但是,当我从Ubuntu存储库下载PHP并从BitNami的Windows堆栈中下载时,我看到了别的东西。

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

请注意,error_reporting实际上默认设置为生产值,而不是默认设置为“默认”值。这有点令人困惑,并没有在php.ini之外记录,所以我在其他发行版上验证了

但是,要回答您的问题,此错误会在之前未弹出时弹出,因为:

  1. 您安装了PHP并且新的默认设置文档记录较差,但不排除E_NOTICE

  2. E_NOTICE警告(如未定义的变量和未定义的索引)实际上有助于使您的代码更清晰,更安全。我可以告诉你,多年前,保持E_NOTICE使我不得不申报我的变量。这使得它更容易学习C,没有声明变量更大的麻烦。

  3. 我可以做些什么?

    1. 通过复制“默认值”E_NOTICE关闭E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED并将其替换为等号error_reporting =后当前取消注释的内容。如果使用CGI或FPM,请重新启动Apache或PHP。确保您正在编辑“正确的”php.ini。正确的一个是Apache,如果你运行PHP的Apache,fpm或php-fpm,如果运行PHP-FPM,cgi运行PHP-CGI等等。这不是推荐的方法,但如果你有遗留代码,那将是非常难以编辑,那么这可能是你最好的选择。

    2. 在文件或文件夹级别关闭E_NOTICE。如果您有一些遗留代码但希望以“正确”方式执行操作,这可能更为可取。要做到这一点,您应该咨询Apache2,Nginx或您选择的服务器。在Apache中,您可以在php_value内使用<Directory>

    3. 重写您的代码以使其更清晰。如果您在迁移到生产环境时需要执行此操作,或者不希望有人看到您的错误,请确保您禁用任何错误显示,并且仅记录您的错误(请参阅{{1 php.ini和您的服务器设置中的{}和display_errors

    4. 扩展选项3:这是理想的选择。如果你能走这条路,你应该。如果您最初没有使用此路由,请考虑最终通过在开发环境中测试代码来移动此路由。当你在这里时,摆脱log_errors~E_STRICT以查看将来可能出现的问题。您将看到很多不熟悉的错误,但是当您将来需要升级PHP时,它会阻止您遇到任何不愉快的问题。

      错误意味着什么?

      ~E_DEPRECATED - 在使用前未定义变量时会发生这种情况。执行PHP脚本时,它在内部只假定一个空值。但是,在哪种情况下,您需要在定义变量之前检查变量?最终,这是“草率代码”的论据。作为一名开发人员,我可以告诉你,当我看到一个开源项目时,我喜欢它,在这个项目中,变量被定义为可以定义的范围内的高位。它可以更容易地告诉将来会弹出哪些变量,并且更容易阅读/学习代码。

      Undefined variable: my_variable_name

      function foo() { $my_variable_name = ''; //.... if ($my_variable_name) { // perform some logic } } - 当您尝试访问数组中的值并且它不存在时,会发生这种情况。要防止出现此错误,请执行条件检查。

      Undefined index: my_index

      另一种选择是在函数顶部声明一个空数组。这并非总是可行。

      // verbose way - generally better
      if (isset($my_array['my_index'])) {
          echo "My index value is: " . $my_array['my_index'];
      }
      
      // non-verbose ternary example - I use this sometimes for small rules.
      $my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
      echo "My index value is: " . $my_index_val;   
      

      (附加提示)

      • 当我遇到这些问题和其他问题时,我使用了NetBeans IDE(免费),它给了我许多警告和通知。其中一些提供非常有用的提示。这不是必需的,除了大型项目,我不再使用IDE。这些天我更像是$my_array = array( 'my_index' => '' ); //... $my_array['my_index'] = 'new string'; 人:)。

答案 16 :(得分:5)

未定义索引表示您请求不可用数组索引的数组,例如

<?php 

$newArray[] = {1,2,3,4,5};
print_r($newArray[5]);

?>

未定义变量意味着您完全不使用现有变量或未使用该名称定义或初始化该变量,例如

<?php print_r($myvar); ?>

未定义偏移量表示您已请求不存在的键。而且 解决方法是在使用前检查

php> echo array_key_exists(1, $myarray);

答案 17 :(得分:3)

关于这部分问题:

  

他们为什么突然出现?我曾经使用过这个剧本多年,而且我从来没有遇到任何问题。

没有明确的答案,但这里有一些可能的解释,为什么设置可以突然&#39;改变:

  1. 您已将PHP升级到较新版本,该版本可能具有error_reporting,display_errors或其他相关设置的其他默认值。

  2. 您已删除或引入了一些代码(可能在依赖项中),这些代码在运行时使用ini_set()error_reporting()设置相关设置(在代码中搜索这些设置)

    < / LI>
  3. 您更改了Web服务器配置(假设此处为apache):.htaccess文件和vhost配置也可以操作php设置。

  4. 通常不会显示/报告通知(请参阅PHP manual) 因此有可能在设置服务器时,由于某种原因(文件权限??)无法加载php.ini文件,并且您处于默认设置。后来,&#39; bug&#39;已经解决(偶然),现在它可以加载正确的php.ini文件,并设置error_reporting来显示通知。

答案 18 :(得分:2)

如果使用类,您需要确保使用$this引用成员变量:

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}

答案 19 :(得分:2)

将抛出未定义的索引通知的另一个原因是,数据库查询中省略了一列。

即:

$query = "SELECT col1 FROM table WHERE col_x = ?";

然后尝试访问循环内的更多列/行。

即:

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

while循环:

while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}

需要注意的是,在* NIX OS和Mac OS X上,事情都区分大小写。

请参阅Stack上的以下Q&amp; A:

答案 20 :(得分:1)

使用ternary简单,易读且简洁:

Pre PHP 7
将一个变量分配给另一个变量的值(如果已设置),否则分配 class Human: Object{ @objc dynamic var name = "" @objc dynamic var age = 0 } (或您需要的任何默认值):

    class Human: Object{
        @objc dynamic var name = ""
        @objc dynamic var age = 0
        @objc dynamic var weight = ""
    }

PHP 7 +
除使用Null Coalescing Operator外,其余相同。内置时,不再需要调用null了,也不需要提供要返回的变量,因为它假定返回要检查的变量的值:

$newVariable = isset($thePotentialData) ? $thePotentialData : null;

两者都将停止OP问题中的通知,并且两者均与以下内容完全相同:

isset()


如果不需要设置新变量,则可以直接使用三元组的返回值,例如$newVariable = $thePotentialData ?? null; ,函数参数等:

回声:

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

功能:

echo

以上内容与数组(包括会话等)相同,将要检查的变量替换为例如:
echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';
或您需要的任何深层次,例如:
$foreName = getForeName(isset($userId) ? $userId : null); function getForeName($userId) { if ($userId === null) { // Etc } }


抑制:

可以使用$_SESSION['checkMe']抑制PHP通知或降低错误报告级别,但是它不能解决问题,只是停止在错误日志中报告它。这意味着您的代码仍尝试使用未设置的变量,这可能意味着某项未按预期工作,这取决于缺失值的重要性。

您确实应该检查此问题并进行适当处理,或者发送不同的消息,甚至为其他所有内容返回空值以标识准确的状态。

如果您只关心通知不在错误日志中,那么可以选择忽略错误日志。

答案 21 :(得分:0)

可能你使用旧的PHP版本,直到现在升级PHP,这就是它工作的原因,直到现在多年来没有任何错误。 直到PHP4,如果您在没有定义变量的情况下使用变量,则没有错误,但从PHP5开始,它会为所讨论的代码抛出错误。

答案 22 :(得分:0)

在处理文件时,需要使用正确的enctype和POST方法,如果表单中没有包含任何索引,则会触发未定义的索引通知。

本手册说明了以下基本语法:

<强> HTML

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

<强> PHP

{{1}}

参考:

答案 23 :(得分:0)

提交HTML表单后,变量不存在的常见原因是表单元素未包含在<form>标记中:

示例:<form>

中未包含元素
<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>

示例:元素现在包含在<form>

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

答案 24 :(得分:0)

我问了一个有关此问题的信息,并给我发了以下帖子:

  

此问题已经在这里得到答案:

     

“通知:未定义的变量”,“通知:未定义的索引”和“通知:   使用PHP

我在这里分享我的问题和解决方案:

这是错误:

enter image description here

第154行是问题所在。这就是我在154行中的内容:

153    foreach($cities as $key => $city){
154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

我认为问题是我正在写变量$city的条件,变量$key => $city不是键,而是$citiesCounterArray[$key]中的值。首先,您可以确认是否是警告的原因?其次,如果这是问题所在,为什么我不能基于该值编写条件?

必须写我写条件的键吗?

更新1:问题在于,执行$key时,有时$citiesCounterArray对应于$key数组中不存在的键,但并非总是如此在我的循环数据上。我需要设置一个条件,以便如果数组中存在array_key_exists(),然后运行代码,否则,跳过它。

更新2:这是我通过使用foreach($cities as $key => $city){ if(array_key_exists($key, $citiesCounterArray)){ if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){ 来解决的方法:

<h3> Dynamic Input </h3>

<form (ngSubmit)="SubmitFnc($event)">
  <div *ngFor="let ItmVar of inputAryVar; let IdxVar=index" [attr.Idx]="IdxVar">
  <input type="text" name="field1" placeholder="Name Field"
    [(ngModel)]="ItmVar.nameLbl">&emsp;
    <button type="button" (click)="addDelBtnFnc(ItmVar,IdxVar)">
      {{ IdxVar == inputAryVar.length - 1  ? "[ + ]" : "[ - ]"}}
    </button>
  </div>
  <button > Submit </button>
</form>

答案 25 :(得分:0)

每当我们使用未设置的变量时,就会发生这些错误。

处理这些问题的最佳方法是在开发过程中设置错误报告。

要在以下位置设置错误报告:

ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);

在生产服务器上,错误报告处于关闭状态,因此,我们不会收到这些错误。

但是,在开发服务器上,我们可以将错误报告设置为打开。

要摆脱此错误,我们看下面的示例:

if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

我们可以在分配变量值或使用它们之前将变量初始化为NULL

因此,我们可以将代码修改为:

$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

这不会打扰任何程序逻辑,即使$test没有值也不会产生通知。

因此,基本上,将错误报告设置为开发始终会更好。

并修复所有错误。

在生产中,错误报告应设置为关闭。

答案 26 :(得分:0)

如果您要向 API 发送数据,只需使用isset()

if(isset($_POST['param'])){
    $param = $_POST['param'];
} else {
#do something else
}

如果错误是因为会话,请确保您已正确启动会话。

答案 27 :(得分:-1)

这些通知是因为您没有使用变量collectionView.backgroundColor = UIColor.clear 并且defined密钥不存在于my_index变量中。

这些通知每次都会触发,因为您的$my_array不正确,但可能您没有报告通知。

解决错误:

code

另一种解决方法:

$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;

if(isset($my_array["my_index"])){
    echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
}

答案 28 :(得分:-1)

在PHP中,您需要先定义变量,然后才能使用它 我们可以非常有效地检查变量是否定义!

//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.

if($my_variable_name){

}

//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){

}

简单说明

//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
    echo "true";
}else{
    echo "false";
}

//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
    echo "true";
}else{
    echo "false";
}