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


69

我收到此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!"; 
} 
?>

12
您的代码很危险!它可以用于sql注入!
Bernd Ott

@Bernd Ott那我该怎么排序呢?
louismoore11 2011年

2
使用具有允许查询参数的db层和/或使用mysql_real_escape_string参见php.net/manual/de/function.mysql-real-escape-string.php还有一些不错的示例。
Bernd Ott

我想指出的是,mysqli_real_escape_string仍然容易受到SQL注入的攻击,在撰写本文时(2020年)应劝阻它。准备好的语句是现在要走的路。
我尽力而为,但我哭得更厉害

Answers:


90

你问在关键的价值0$votes。它是一个不包含该键的数组。

$votes未设置数组,因此当PHP尝试访问0数组的键时,它将遇到[0]和[1]的未定义偏移量并引发错误。

如果有数组:

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

现在,我们可以访问:

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

如果我们尝试访问:

$votes[3];

我们将收到错误消息“注意:未定义的偏移量:3”


我的代码中没有“ $ new_array”。那我需要这个吗?
louismoore11 2011年

5
不,我以此为例来说明在您的代码中导致问题的原因,我只是在尝试重新创建问题,作为向您解释问题的方式。您的问题是数组值:$ votes尚未定义。因此,您将收到一个错误(通知),必须确保正确填充了数组,原因似乎不是。
YonoRan 2011年

那我该定义什么,又该如何定义?
louismoore18 2011年

2
如果您查看函数“ getAllVotes”,您会注意到,只有查询找到结果后,它才会填充数组;如果找不到结果,则它不会填充数组($ votes),所以我假设您获得此结果是因为您的查询未返回任何结果。
YonoRan 2011年

为什么尝试访问时$new_array[3]说未定义的偏移量是0,而不是3
Brian Kendig





2

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


2

如前所述,这是因为 $cur_votes[0],因此会引发错误。

为了确保您的代码正常运行,在执行"$votes_up = $cur_votes[0]+1;"echo之前,$cur_votes[0]查看值是否已存储。

当然,没有存储任何值。


1
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()在应该调用的位置调用带有两个参数的函数。

干杯。


1

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

您可以这样做:

if(count($votes) == '0'){

    echo 'Sorry, no votes are available at the moment.';
}
else{
    //do the stuff with votes
}

count($votes)计算$votes数组。如果它等于零(0),则可以显示自定义消息或重定向到某些页面,否则您可以使用$votes。这样,您可以删除Notice: Undefined offset: 0PHP中的in通知。


0

如果省略括号,则PHP将默认分配密钥。

尝试这个:

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

0

就我而言,这是一个简单的类型

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

我缺少正确的右括号

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

0

如果您使用的是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



-2

它只是一个警告用途:

error_reporting(0);

它显示了我们何时不初始化数组并将值直接分配给索引。

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

相反:

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

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


这是一个“通知”
Rocco

这只是个坏建议。
faintsignal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.