【问题标题】:Notice: Undefined offset: 0 in注意:未定义的偏移量:0 in
【发布时间】:2011-09-26 19:59:29
【问题描述】:

我收到这个 PHP 错误,这是什么意思?

Notice: Undefined offset: 0 in 
C:\xampp\htdocs\mywebsite\reddit_vote_tut\src\votes.php on line 41

从此代码:

<?php 
include("config.php"); 

function getAllVotes($id) 
{ 
    $votes = array(); 
    $q = "SELECT * FROM entries WHERE id = $id"; 
    $r = mysql_query($q); 
    if(mysql_num_rows($r)==1)//id found in the table 
    { 
        $row = mysql_fetch_assoc($r); 
        $votes[0] = $row['votes_up']; 
        $votes[1] = $row['votes_down']; 
    } 
    return $votes; 
} 

function getEffectiveVotes($id) 
{ 
        $votes = getAllVotes($id); 
        $effectiveVote = $votes[0] - $votes[1];    //ERROR THROWN HERE
        return $effectiveVote; 
} 

$id = $_POST['id']; 
$action = $_POST['action']; 

//get the current votes 
$cur_votes = getAllVotes($id); 

//ok, now update the votes 

if($action=='vote_up') //voting up 
{ 

    $votes_up = $cur_votes[0]+1;     //AND ERROR THROWN HERE


    $q = "UPDATE threads SET votes_up = $votes_up WHERE id = $id"; 
} 
elseif($action=='vote_down')
{ 
    $votes_down = $cur_votes[1]+1; 
    $q = "UPDATE threads SET votes_down = $votes_down WHERE id = $id"; 
} 

$r = mysql_query($q); 
if($r)
{ 
    $effectiveVote = getEffectiveVotes($id); 
    echo $effectiveVote." votes"; 
} 
elseif(!$r) //voting failed 
{ 
    echo "Failed!"; 
} 
?>

【问题讨论】:

  • 你的代码很危险!它可以用于sql注入!
  • @Bernd Ott 那么我该如何排序呢?
  • 使用允许查询参数的数据库层和/或使用 mysql_real_escape_string 参见php.net/manual/de/function.mysql-real-escape-string.php 还有一些不错的示例。
  • 我想指出,mysqli_real_escape_string 仍然容易受到 SQL 注入的影响,在撰写本文时(2020 年)应该不鼓励这样做。准备好的语句是现在要走的路。

标签: php html


【解决方案1】:

您正在请求 $votes 的键 0 处的值。它是一个不包含该键的数组。

数组$votes没有设置,所以当PHP试图访问数组的键0时,遇到[0]和[1]的未定义偏移并抛出错误。

如果你有一个数组:

$votes = array('1','2','3');

我们现在可以访问了:

$votes[0];
$votes[1];
$votes[2];

如果我们尝试访问:

$votes[3];

我们会得到错误“Notice: Undefined offset: 3”

【讨论】:

  • 我的代码中没有'$new_array'。那我需要添加这个吗?
  • 不,我用这个作为你的代码中导致问题的一个例子,我只是试图重新创建问题作为向你解释它的一种方式。您的问题是数组值: $votes 尚未定义。所以你得到一个错误(通知)你必须确保数组被正确填充,因为它似乎不是。
  • 那我要定义什么,如何定义?
  • 如果您查看您的函数“getAllVotes”,您会注意到只有当查询找到结果时才会填充数组,如果找不到结果则不会填充数组 ( $votes),所以我假设你得到这个结果是因为你的查询没有返回任何结果。
  • 为什么访问$new_array[3]的尝试说未定义的偏移量是0,而不是3
【解决方案2】:

首先,检查数组是否真的存在,你可以尝试类似

if (isset($votes)) {
   // Do bad things to the votes array
}

【讨论】:

    【解决方案3】:

    这个答案帮助了我https://stackoverflow.com/a/18880670/1821607 粉碎的原因 - 未设置索引 0。简单的$array = $array + array(null) 成功了。或者您应该检查索引 0 上的数组元素是否通过isset($array[0]) 设置。第二种变体对我来说是最好的方法。

    【讨论】:

      【解决方案4】:

      使用print_r($votes);检查数组$votes,你会看到0不存在。它将返回 NULL 并抛出该错误。

      【讨论】:

        【解决方案5】:

        getAllVotes() 未返回索引为 01 的数组。通过在结果上调用 var_dump() 确保它返回您想要的数据。

        【讨论】:

          【解决方案6】:

          我也遇到过这种情况,解决方法很简单,不要在代码中硬编码数组索引位置。
          代替 $data[0]['somekey'] do foreach($data as $data_item) { echo $data_item['somekey']; }
          如果有一个或多个数组,您可以在循环内执行所需的操作,但如果它未定义,则不会带来错误。您还可以在此基础上添加其他检查。 如果您只想要第一个位置或其他内容,您还可以添加一个变量并在 for in 循环中递增它以限制您的循环。

          【讨论】:

            【解决方案7】:

            正如解释的那样,这是因为$cur_votes[0] 中没有数据,因此会引发错误。

            为确保您的代码正常工作,在执行"$votes_up = $cur_votes[0]+1;" 之前回显$cur_votes[0] 值以查看是否存储了任何值。

            当然,没有存储任何值。

            【讨论】:

              【解决方案8】:
              function getEffectiveVotes($id) 
              

              根据函数头,参数变量只有一个($id)。 因此,在第 27 行,votes[] 数组未定义且超出范围。您需要添加另一个 函数头的参数值,以便函数getEffectiveVotes() 知道需要两个参数。我生疏了,但这样的事情会奏效。

              function getEffectiveVotes($id, $votes)
              

              我并不是说应该这样做,但您可能想研究 PHP 如何 传递它的数组并决定是否需要显式声明以通过引用传递它

              function getEffectiveVotes($id &$votes)    <---I forget, no time to look it up right now.
              

              最后,使用两个参数调用函数getEffectiveVotes()

              干杯。

              【讨论】:

                【解决方案9】:

                您可能已经知道这个错误。这是由于试图访问空数组或试图访问数组的空键的值。在我的项目中,我正在通过计算数组和显示结果来处理这个错误。

                你可以这样做:

                if(count($votes) == '0'){
                
                    echo 'Sorry, no votes are available at the moment.';
                }
                else{
                    //do the stuff with votes
                }
                

                count($votes) 计算 $votes 数组。如果它等于零(0),您可以显示您的自定义消息或重定向到某个页面,否则您可以使用$votes 做一些事情。这样就可以在PHP中去掉Notice: Undefined offset: 0的通知了。

                【讨论】:

                  【解决方案10】:

                  如果省略括号,PHP 将默认分配键。

                  试试这个:

                  $votes = $row['votes_up']; 
                  $votes = $row['votes_down']; 
                  

                  【讨论】:

                    【解决方案11】:

                    在我的例子中,它是一个简单的类型

                    $_SESSION['role' == 'ge']
                    

                    我错过了正确的右括号

                    $_SESSION['role'] == 'ge'
                    

                    【讨论】:

                      【解决方案12】:

                      如果您使用 dompdf/dompdf 并且在 vendor/dompdf/dompdf/src/Cellmap.php 中发生错误,那么 看起来我们在 update_row_group 方法中使用了错误的帧 ID。初步测试似乎证实了这一点。虽然这可能是因为这严格来说是一个分页表问题,而且我的测试台中没有太多文档有分页表。

                      您可以尝试将第 800 行更改为:

                      $r_rows = $this->_frames[$g_key]["rows"];
                      ($g_key 而不是 $r_key)

                      https://github.com/dompdf/dompdf/issues/1295

                      【讨论】:

                        【解决方案13】:

                        改用mysql行

                        mysql_fetch_row($r)

                        同时考虑使用mysqli或PDO

                        ?>

                        【讨论】:

                          【解决方案14】:

                          尝试使用命令播种数据:php artisan db:seed

                          【讨论】:

                            【解决方案15】:

                            它只是一个警告用途:

                            error_reporting(0);
                            

                            它显示了我们何时不初始化数组并直接为索引赋值。

                            somefunction{
                            $raja[0]="this";
                            $raja[1]="that";
                            }
                            

                            改为:

                            somefunction{
                            $raja=array(0=>'this',1='that');
                            //or
                            $raja=array("this","that");
                            }
                            

                            它只是通知,不会产生任何输出错误或任何意外输出。

                            【讨论】:

                            • 这是一个“通知”
                            • 这只是一个糟糕的建议。
                            • sweep_under_rug(true);
                            猜你喜欢
                            • 2012-02-08
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2016-12-13
                            • 2015-08-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多