2011-07-01 81 views
34

我得到这个PHP错误,这是什么意思?注意:未定义偏移量:0在

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!"; 
} 
?> 
+9

你的代码是危险的!它可以用于sql注入! –

+0

@Bernd Ott我如何分类呢? – louismoore18

+2

使用数据库层允许查询参数和/或使用mysql_real_escape_string请参阅http://php.net/manual/de/function.mysql-real-escape-string.php也有一些很好的示例。 –

回答

2

getAllVotes()没有返回与索引01阵列。通过调用var_dump()来确保它返回你想要的数据。

52

您正在询问$votes的密钥0处的值。它是一个不包含该键的数组。

未设置数组$votes,所以当PHP尝试访问数组的密钥0时,它遇到[0]和[1]的未定义偏移并引发错误。

如果你有一个数组:

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

我们现在可以访问:

$new_array[0]; 
$new_array[1]; 
$new_array[2]; 

如果我们试图访问:

$new_array[3]; 

我们会得到错误“注意:未定义偏移:3“

+0

我在代码中没有'$ new_array'。我需要添加吗? – louismoore18

+4

不,我正在使用这个作为什么导致你的代码中的问题的例子,我只是试图重新创建问题作为向你解释它的一种方式。你的问题是数组值:$ votes还没有被定义。所以你得到一个错误(注意)你必须确保数组正在填充正确,因为它似乎不是。 – YonoRan

+0

我该怎么定义然后我该如何定义? – louismoore18

4

使用print_r($votes);要检查数组$votes,您将看到那个键0在那里不存在。它将返回NULL并抛出该错误。

1

如上所述,这是因为$ cur_votes [0]中没有数据,因此会引发错误。为了确保您的代码正常工作,请在执行“$ votes_up = $ cur_votes [0] +1;”之前回显$ 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()在任何应该被调用的地方都有两个参数。

干杯。

2

首先,检查数组实际存在,你可以尝试像

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

它只是一个警告使用:

error_reporting(0); 

它表明,当我们不初始化数组和直接分配值索引。

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

代替:

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

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

+0

........真的吗? – developerbmw

+0

这是一个“通知” – Rocco

0

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

试试这个:

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

这个答案让我https://stackoverflow.com/a/18880670/1821607 美眉的原因 - 指数0没有设置。简单$array = $array + array(null)做了伎俩。或者您应该检查索引0上的数组元素是否通过isset($array[0])设置。第二个变体是我最好的方法。

0

正如你可能已经知道错误。这是由于试图访问空数组或尝试访问数组的空键值。在我的项目中,我正在处理这个计数数组并显示结果的错误。

你可以这样说:

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