注意:未定义的偏移量:0 in

Posted

技术标签:

【中文标题】注意:未定义的偏移量:0 in【英文标题】:Notice: Undefined offset: 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 年)应该不鼓励这样做。准备好的语句是现在要走的路。 【参考方案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://***.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);

以上是关于注意:未定义的偏移量:0 in的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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