注意未定义的偏移量

时间:2014-06-11 14:05:22

标签: php notice

我是php新手并且在通知方面遇到了一些麻烦。 "注意:未定义的偏移量:1"问题出在第38行:

  $commentator_comment = $comment_array[$i+1];

当我编写这段代码时,我在旧笔记本电脑上工作,我必须在服务器上工作,因为WAMP等没有工作,我当时没有得到通知。我不久前写了它,但我尽力找到问题而没有运气。

<?php
$filename = "data/comments.txt";
    if( isset( $_POST["name"]) && isset( $_POST["comment"])) {
$comment_name = @$_POST["name"];
$comment_comment = @$_POST["comment"];
$theComment = "<div id='comment'><p><b>" . $comment_name . "</b><br>" . $comment_comment . "</p></div>";

file_put_contents($filename, $theComment, FILE_APPEND);}
?>

<?php
$comments_from_file = file_get_contents($filename);
$comment_array = str_getcsv($comments_from_file, "|");
$i = 0;
while ($i < count($comment_array)){
    $commentator_name = $comment_array[$i];
    $commentator_comment = $comment_array[$i+1];

    echo "$commentator_name" . "$commentator_comment";


    $i = $i + 2;

}?>

提前感谢所有的帮助,它的优点。

4 个答案:

答案 0 :(得分:2)

轻松修复“通知”:只需检查该索引是否存在。所以这段代码:

$commentator_name = $comment_array[$i];
$commentator_comment = $comment_array[$i+1];

对此的更改:

$commentator_name = $commentator_comment = '';
if (isset($comment_array[$i])) {
  $commentator_name = $comment_array[$i];
}
if (isset($comment_array[$i+1])) {
  $commentator_comment = $comment_array[$i+1];
}
  

当我编写这段代码时,我在旧笔记本电脑上工作,我必须工作   在服务器上,由于WAMP等没有工作,我没有得到通知   然后

可能是新服务器设置和新服务器设置之间的错误报告级别。无论旧服务器设置如何。这意味着新服务器设置为报告PHP通知,但旧服务器没有。

要调整错误报告的设置,您可以先进入php.ini并查找error_reporting行。在Ubuntu 12.04&amp;其他Linux安装,php.ini位于此处:

/etc/php5/apache2/php.ini

通常,该行设置为E_ALL,如下所示:

 error_reporting = E_ALL

要禁用通知,您可以将该行调整为:

 error_reporting = E_ALL & ~E_NOTICE

你甚至可以通过将它们链接到该行的末尾来添加更多禁用选项:

 error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING

PHP错误级别常量的完整列表应该在php.ini文件中。如果是典型php.ini文件的注释中显示的副本,则为以下副本:

; Error Level Constants:
; E_ALL             - All errors and warnings (includes E_STRICT as of PHP 6.0.0)
; E_ERROR           - fatal run-time errors
; E_RECOVERABLE_ERROR  - almost fatal run-time errors
; E_WARNING         - run-time warnings (non-fatal errors)
; E_PARSE           - compile-time parse errors
; E_NOTICE          - run-time notices (these are warnings which often result
;                     from a bug in your code, but it's possible that it was
;                     intentional (e.g., using an uninitialized variable and
;                     relying on the fact it's automatically initialized to an
;                     empty string)
; E_STRICT          - run-time notices, enable to have PHP suggest changes
;                     to your code which will ensure the best interoperability
;                     and forward compatibility of your code
; E_CORE_ERROR      - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING    - warnings (non-fatal errors) that occur during PHP's
;                     initial startup
; E_COMPILE_ERROR   - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR      - user-generated error message
; E_USER_WARNING    - user-generated warning message
; E_USER_NOTICE     - user-generated notice message
; E_DEPRECATED      - warn about code that will not work in future versions
;                     of PHP
; E_USER_DEPRECATED - user-generated deprecation warnings

答案 1 :(得分:0)

您的通知仅在某些情况下显示,特别是当您的csv文件中包含奇数个元素时。

看看这两行:

while ($i < count($comment_array)){
    // ...
    $commentator_comment = $comment_array[$i+1];
    // ...

while条件将保证索引$i将存在,但它不能为索引$i+1提供此类保证。如果csv文件中只有1个项目,它将显示通知。如果您有2件商品,则不会看到通知。

@JakeGould的解决方案可行,但是为了提供替代解决方案(将根据您的意图对所有输入进行操作),您可以简单地将您的while条件更改为这样:

while( ($i + 1) < count($comment_array) ) {
    // ...

这有副作用,如果您有奇数个条目(基本上是没有关联评论的评论名称条目),那么它将完全忽略最后一条评论,这可能比处理评论更有益于您名字没有评论。

答案 2 :(得分:0)

语法短:

$commentator_name = isset($comment_array[$i]) ? $comment_array[$i] : '';

$commentator_comment = isset($comment_array[$i+1]) ? $comment_array[$i+1] : '';

在本地开发环境中,设置error_reporting = E_ALL。因为你已经知道它已经设置了。

答案 3 :(得分:0)

我认为是因为您正在尝试访问在循环的最后一次交互中不存在的偏移量。试试这个:

<?php
    $filename = "data/comments.txt";
    if( isset( $_POST["name"]) && isset( $_POST["comment"])) {
        $comment_name = @$_POST["name"];
        $comment_comment = @$_POST["comment"];
        $theComment = "<div id='comment'><p><b>" . $comment_name . "</b><br>" . $comment_comment . "</p></div>";
        file_put_contents($filename, $theComment, FILE_APPEND);
    }
?>

<?php
    $comments_from_file = file_get_contents($filename);
    $comment_array = str_getcsv($comments_from_file, "|");
    $i = 0;
    while ($i < (count($comment_array)-1)){

        $commentator_name = $comment_array[$i];
        $commentator_comment = $comment_array[$i+1];

        echo "$commentator_name" . "$commentator_comment";


        $i = $i + 2;

    }
?>

Alternativaly,您也可以尝试:

while ($i < count($comment_array){

        $commentator_name = $comment_array[$i];
        if ($i < (count($comment_array)-1)) {
            $commentator_comment = $comment_array[$i+1];
        }

        echo "$commentator_name" . "$commentator_comment";


        $i = $i + 2;

    }